mirror of
https://github.com/nlohmann/json.git
synced 2026-10-10 16:37:14 +00:00
Compare commits
3
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
48188b4569 | ||
|
|
6a28560c87 | ||
|
|
fc32fb6aed |
No files matched your search
@@ -0,0 +1,3 @@
|
|||||||
|
# generated files are collapsed in diffs and excluded from language statistics
|
||||||
|
single_include/** linguist-generated
|
||||||
|
nlohmann_json.natvis linguist-generated
|
||||||
+1
-1
@@ -1,5 +1,5 @@
|
|||||||
# JSON for Modern C++ was originally written by Niels Lohmann.
|
# JSON for Modern C++ was originally written by Niels Lohmann.
|
||||||
# Since 2013, over 250 contributors have helped to improve the library.
|
# Since 2013, over 400 contributors have helped to improve the library.
|
||||||
# This CODEOWNERS file is only to make sure that @nlohmann is requested
|
# This CODEOWNERS file is only to make sure that @nlohmann is requested
|
||||||
# for a code review in case of a pull request.
|
# for a code review in case of a pull request.
|
||||||
|
|
||||||
|
|||||||
+12
-12
@@ -98,7 +98,7 @@ $ ctest --test-dir build -j 10
|
|||||||
The test suite should report:
|
The test suite should report:
|
||||||
|
|
||||||
```
|
```
|
||||||
100% tests passed, 0 tests failed out of 98
|
100% tests passed, 0 tests failed out of <number of tests>
|
||||||
```
|
```
|
||||||
|
|
||||||
#### Add tests
|
#### Add tests
|
||||||
@@ -157,8 +157,9 @@ and each page's title (H1) and declaration by
|
|||||||
### Amalgamate the source code
|
### Amalgamate the source code
|
||||||
|
|
||||||
The single-header files
|
The single-header files
|
||||||
[`single_include/nlohmann/json.hpp`](https://github.com/nlohmann/json/blob/develop/single_include/nlohmann/json.hpp) and
|
[`single_include/nlohmann/json.hpp`](https://github.com/nlohmann/json/blob/develop/single_include/nlohmann/json.hpp),
|
||||||
[`single_include/nlohmann/json_fwd.hpp`](https://github.com/nlohmann/json/blob/develop/single_include/nlohmann/json_fwd.hpp)
|
[`single_include/nlohmann/json_fwd.hpp`](https://github.com/nlohmann/json/blob/develop/single_include/nlohmann/json_fwd.hpp), and
|
||||||
|
[`single_include/nlohmann/json_literals.hpp`](https://github.com/nlohmann/json/blob/develop/single_include/nlohmann/json_literals.hpp)
|
||||||
are **generated** from the source files in the
|
are **generated** from the source files in the
|
||||||
[`include/nlohmann` directory](https://github.com/nlohmann/json/tree/develop/include/nlohmann). **Do not** edit the
|
[`include/nlohmann` directory](https://github.com/nlohmann/json/tree/develop/include/nlohmann). **Do not** edit the
|
||||||
files directly; instead, modify the include/nlohmann sources and regenerate the files by executing:
|
files directly; instead, modify the include/nlohmann sources and regenerate the files by executing:
|
||||||
@@ -181,7 +182,7 @@ The amalgamation check in CI fails if any of these generated files is out of dat
|
|||||||
|
|
||||||
## Recommended documentation
|
## Recommended documentation
|
||||||
|
|
||||||
- The library’s [README file](https://github.com/nlohmann/json/blob/master/README.md) is an excellent starting point to
|
- The library’s [README file](https://github.com/nlohmann/json/blob/develop/README.md) is an excellent starting point to
|
||||||
understand its functionality.
|
understand its functionality.
|
||||||
- The [documentation page](https://json.nlohmann.me) is the reference documentation of the library.
|
- The [documentation page](https://json.nlohmann.me) is the reference documentation of the library.
|
||||||
- [RFC 8259](https://datatracker.ietf.org/doc/html/rfc8259) is the reference for the JavaScript Object Notation (JSON)
|
- [RFC 8259](https://datatracker.ietf.org/doc/html/rfc8259) is the reference for the JavaScript Object Notation (JSON)
|
||||||
@@ -220,9 +221,9 @@ feature macros then allows users to test their code against the library in the n
|
|||||||
### Break C++11 language conformance
|
### Break C++11 language conformance
|
||||||
|
|
||||||
This library is designed to work with C++11 and later. This means that any
|
This library is designed to work with C++11 and later. This means that any
|
||||||
[supported C++11 compiler](https://github.com/nlohmann/json/blob/master/README.md#supported-compilers) should compile
|
[supported C++11 compiler](https://github.com/nlohmann/json/blob/develop/README.md#supported-compilers) should compile
|
||||||
the library without problems. Some compilers like GCC 4.7 (and earlier), Clang 3.3 (and earlier), or Microsoft Visual
|
the library without problems. Some compilers like GCC 4.7 (and earlier), Clang 3.3 (and earlier), or Microsoft Visual
|
||||||
Studio 13.0 and earlier are known not to work due to missing or incomplete C++11 support.
|
C++ 2013 and earlier are known not to work due to missing or incomplete C++11 support.
|
||||||
|
|
||||||
Please do not add features that do not work with the mentioned supported compilers. Please guard features from C++14 and
|
Please do not add features that do not work with the mentioned supported compilers. Please guard features from C++14 and
|
||||||
later against the respective [`JSON_HAS_CPP_14`](https://json.nlohmann.me/api/macros/json_has_cpp_11/) macros.
|
later against the respective [`JSON_HAS_CPP_14`](https://json.nlohmann.me/api/macros/json_has_cpp_11/) macros.
|
||||||
@@ -238,12 +239,11 @@ extension.
|
|||||||
The following areas really need contribution and are always welcomed:
|
The following areas really need contribution and are always welcomed:
|
||||||
|
|
||||||
- Extending the **continuous integration** toward more exotic compilers such as Android NDK, Intel's Compiler, or the
|
- Extending the **continuous integration** toward more exotic compilers such as Android NDK, Intel's Compiler, or the
|
||||||
bleeding-edge versions Clang.
|
bleeding-edge versions of Clang.
|
||||||
- Improving the efficiency of the **JSON parser**. The current parser is implemented as a naive recursive descent parser
|
- Improving the efficiency of the **JSON parser**. The current parser is a hand-written iterative parser that keeps an
|
||||||
with hand-coded string handling. More sophisticated approaches like LALR parsers would be really appreciated. That
|
explicit stack instead of recursing, with hand-coded string handling. Speeding up the lexer or the value construction
|
||||||
said, parser generators like Bison or ANTLR do not play nice with single-header files -- I really would like to keep
|
would be appreciated. Parser generators like Bison or ANTLR do not play nice with single-header files -- I really
|
||||||
the parser inside the `json.hpp` header, and I am not aware of approaches similar to [`re2c`](http://re2c.org) for
|
would like to keep the parser inside the `json.hpp` header.
|
||||||
parsing.
|
|
||||||
- Extending and updating existing **benchmarks** to include (the most recent version of) this library. Though efficiency
|
- Extending and updating existing **benchmarks** to include (the most recent version of) this library. Though efficiency
|
||||||
is not everything, speed and memory consumption are very important characteristics for C++ developers, so having
|
is not everything, speed and memory consumption are very important characteristics for C++ developers, so having
|
||||||
proper comparisons would be interesting.
|
proper comparisons would be interesting.
|
||||||
|
|||||||
@@ -52,7 +52,7 @@ body:
|
|||||||
If possible, provide a small and self-contained example that triggers
|
If possible, provide a small and self-contained example that triggers
|
||||||
the bug. Please understand that we cannot analyze and debug large code
|
the bug. Please understand that we cannot analyze and debug large code
|
||||||
bases. Please do not paste screenshots here.
|
bases. Please do not paste screenshots here.
|
||||||
render: Shell
|
render: cpp
|
||||||
- type: textarea
|
- type: textarea
|
||||||
id: output
|
id: output
|
||||||
attributes:
|
attributes:
|
||||||
@@ -79,7 +79,7 @@ body:
|
|||||||
description: >
|
description: >
|
||||||
Which version of the library did you use? If it is a released version,
|
Which version of the library did you use? If it is a released version,
|
||||||
please enter the version number (e.g., 3.12.0). Otherwise, please enter
|
please enter the version number (e.g., 3.12.0). Otherwise, please enter
|
||||||
the commit hash. If you got the library from another source as the
|
the commit hash. If you got the library from another source than the
|
||||||
GitHub repository (e.g., via a package manager), please also state
|
GitHub repository (e.g., via a package manager), please also state
|
||||||
this.
|
this.
|
||||||
validations:
|
validations:
|
||||||
|
|||||||
@@ -21,6 +21,17 @@ labels:
|
|||||||
files:
|
files:
|
||||||
- "cmake/.*"
|
- "cmake/.*"
|
||||||
|
|
||||||
|
# other build systems
|
||||||
|
- label: "CMake"
|
||||||
|
files:
|
||||||
|
- "(meson\\.build|meson_options\\.txt|BUILD\\.bazel|MODULE\\.bazel|Package\\.swift)"
|
||||||
|
|
||||||
|
- label: "documentation"
|
||||||
|
files:
|
||||||
|
- ".github/ISSUE_TEMPLATE/.*"
|
||||||
|
- ".github/config\\.yml"
|
||||||
|
- ".github/(CONTRIBUTING|SECURITY|CODE_OF_CONDUCT|PULL_REQUEST_TEMPLATE)\\.md"
|
||||||
|
|
||||||
- label: "CI"
|
- label: "CI"
|
||||||
files:
|
files:
|
||||||
- ".github/workflows/.*"
|
- ".github/workflows/.*"
|
||||||
|
|||||||
@@ -83,8 +83,7 @@ jobs:
|
|||||||
# byte for byte), so there is nothing to gain from checking out a
|
# byte for byte), so there is nothing to gain from checking out a
|
||||||
# separate copy, and doing so would make this step fail on a PR
|
# separate copy, and doing so would make this step fail on a PR
|
||||||
# that adds support for a new dispatch table until that PR itself
|
# that adds support for a new dispatch table until that PR itself
|
||||||
# merges to develop, the same way generate_natvis.py's --version
|
# merges to develop.
|
||||||
# requirement briefly did.
|
|
||||||
TMPDIR=$(mktemp -d ./macro_builder_check.XXXXXX)
|
TMPDIR=$(mktemp -d ./macro_builder_check.XXXXXX)
|
||||||
c++ -std=c++11 tools/macro_builder/main.cpp -o "$TMPDIR/macro_builder"
|
c++ -std=c++11 tools/macro_builder/main.cpp -o "$TMPDIR/macro_builder"
|
||||||
"$TMPDIR/macro_builder" > "$TMPDIR/paste.hpp"
|
"$TMPDIR/macro_builder" > "$TMPDIR/paste.hpp"
|
||||||
@@ -117,7 +116,6 @@ jobs:
|
|||||||
|
|
||||||
python3 $TOOL_DIR/amalgamate.py -c $TOOL_DIR/config_json.json -s .
|
python3 $TOOL_DIR/amalgamate.py -c $TOOL_DIR/config_json.json -s .
|
||||||
python3 $TOOL_DIR/amalgamate.py -c $TOOL_DIR/config_json_fwd.json -s .
|
python3 $TOOL_DIR/amalgamate.py -c $TOOL_DIR/config_json_fwd.json -s .
|
||||||
cp include/nlohmann/json_literals.hpp $INCLUDE_DIR/json_literals.hpp
|
|
||||||
|
|
||||||
# the header list of the Bazel "json" target must match the files in include/
|
# the header list of the Bazel "json" target must match the files in include/
|
||||||
cmake -P cmake/scripts/gen_bazel_build_file.cmake
|
cmake -P cmake/scripts/gen_bazel_build_file.cmake
|
||||||
@@ -138,17 +136,13 @@ jobs:
|
|||||||
${{ github.workspace }}/venv/bin/astyle --project=tools/astyle/.astylerc --suffix=none --quiet \
|
${{ github.workspace }}/venv/bin/astyle --project=tools/astyle/.astylerc --suffix=none --quiet \
|
||||||
$(find $SOURCE_DIRS -type f \( -name '*.hpp' -o -name '*.cpp' -o -name '*.cu' \) -not -path 'tests/thirdparty/*' -not -path 'tests/abi/include/nlohmann/*' | sort)
|
$(find $SOURCE_DIRS -type f \( -name '*.hpp' -o -name '*.cpp' -o -name '*.cu' \) -not -path 'tests/thirdparty/*' -not -path 'tests/abi/include/nlohmann/*' | sort)
|
||||||
|
|
||||||
|
# json_literals.hpp is copied verbatim from the (now formatted) include/
|
||||||
|
# directory, like `make amalgamate` does
|
||||||
|
cp include/nlohmann/json_literals.hpp $INCLUDE_DIR/json_literals.hpp
|
||||||
|
|
||||||
- name: Regenerate nlohmann_json.natvis
|
- name: Regenerate nlohmann_json.natvis
|
||||||
run: |
|
run: |
|
||||||
cd $MAIN_DIR
|
cd $MAIN_DIR
|
||||||
# Pass --version explicitly so this step also works with the tool
|
|
||||||
# copy from develop before this repository's own generate_natvis.py
|
|
||||||
# learns to derive the version itself: the older script requires
|
|
||||||
# --version, and the newer one accepts it as an explicit override.
|
|
||||||
ABI_MACROS=include/nlohmann/detail/abi_macros.hpp
|
|
||||||
VERSION_MAJOR=$(grep -m1 'define NLOHMANN_JSON_VERSION_MAJOR' $ABI_MACROS | grep -o '[0-9]\+')
|
|
||||||
VERSION_MINOR=$(grep -m1 'define NLOHMANN_JSON_VERSION_MINOR' $ABI_MACROS | grep -o '[0-9]\+')
|
|
||||||
VERSION_PATCH=$(grep -m1 'define NLOHMANN_JSON_VERSION_PATCH' $ABI_MACROS | grep -o '[0-9]\+')
|
|
||||||
# The template is what this check verifies the committed natvis
|
# The template is what this check verifies the committed natvis
|
||||||
# file against, so take it from this PR rather than from the
|
# file against, so take it from this PR rather than from the
|
||||||
# develop checkout: generate_natvis.py loads the template from its
|
# develop checkout: generate_natvis.py loads the template from its
|
||||||
@@ -156,7 +150,7 @@ jobs:
|
|||||||
# template could never pass. Like the macro_builder step above,
|
# template could never pass. Like the macro_builder step above,
|
||||||
# this only renders PR content in a job without credentials.
|
# this only renders PR content in a job without credentials.
|
||||||
cp tools/generate_natvis/nlohmann_json.natvis.j2 $NATVIS_TOOL_DIR/
|
cp tools/generate_natvis/nlohmann_json.natvis.j2 $NATVIS_TOOL_DIR/
|
||||||
python3 $NATVIS_TOOL_DIR/generate_natvis.py --version "$VERSION_MAJOR.$VERSION_MINOR.$VERSION_PATCH" $MAIN_DIR
|
python3 $NATVIS_TOOL_DIR/generate_natvis.py $MAIN_DIR
|
||||||
|
|
||||||
- name: Build patch and check for differences
|
- name: Build patch and check for differences
|
||||||
id: diff
|
id: diff
|
||||||
@@ -165,7 +159,7 @@ jobs:
|
|||||||
mkdir -p ${{ github.workspace }}/patch
|
mkdir -p ${{ github.workspace }}/patch
|
||||||
git diff --patch --no-color > ${{ github.workspace }}/patch/amalgamation.patch
|
git diff --patch --no-color > ${{ github.workspace }}/patch/amalgamation.patch
|
||||||
if [ -s ${{ github.workspace }}/patch/amalgamation.patch ]; then
|
if [ -s ${{ github.workspace }}/patch/amalgamation.patch ]; then
|
||||||
echo "The source code has not been amalgamated/formatted correctly or BUILD.bazel is out of date. Diff:"
|
echo "The source code has not been amalgamated/formatted correctly, or BUILD.bazel, nlohmann_json.natvis, or the macro_builder tables in macro_scope.hpp are out of date ('make amalgamate BUILD.bazel natvis' fixes all but the tables, see tools/macro_builder/README.md). Diff:"
|
||||||
cat ${{ github.workspace }}/patch/amalgamation.patch
|
cat ${{ github.workspace }}/patch/amalgamation.patch
|
||||||
echo "has_diff=true" >> "$GITHUB_OUTPUT"
|
echo "has_diff=true" >> "$GITHUB_OUTPUT"
|
||||||
else
|
else
|
||||||
|
|||||||
@@ -96,7 +96,7 @@ jobs:
|
|||||||
issue_number: issue_number,
|
issue_number: issue_number,
|
||||||
owner: context.repo.owner,
|
owner: context.repo.owner,
|
||||||
repo: context.repo.repo,
|
repo: context.repo.repo,
|
||||||
body: '## 🔴 Amalgamation check failed! 🔴\nThe source code has not been amalgamated and/or formatted correctly, or `BUILD.bazel` is out of date.'
|
body: '## 🔴 Amalgamation check failed! 🔴\nThe source code has not been amalgamated and/or formatted correctly, or `BUILD.bazel`, `nlohmann_json.natvis`, or the macro_builder tables in `macro_scope.hpp` are out of date. `make amalgamate BUILD.bazel natvis` fixes all but the tables (see `tools/macro_builder/README.md`).'
|
||||||
+ (hasPatch ? '\n\n📎 A ready-to-apply patch is attached to the [failed workflow run](' + runUrl + ') as the `amalgamation-patch` artifact.'
|
+ (hasPatch ? '\n\n📎 A ready-to-apply patch is attached to the [failed workflow run](' + runUrl + ') as the `amalgamation-patch` artifact.'
|
||||||
+ ' Download it, then apply it locally from the repository root with:'
|
+ ' Download it, then apply it locally from the repository root with:'
|
||||||
+ '\n\n```shell\ngit apply amalgamation.patch\n```\n\n'
|
+ '\n\n```shell\ngit apply amalgamation.patch\n```\n\n'
|
||||||
|
|||||||
@@ -15,6 +15,7 @@ on:
|
|||||||
- .github/SECURITY.md
|
- .github/SECURITY.md
|
||||||
- cmake/clang_flags.cmake
|
- cmake/clang_flags.cmake
|
||||||
- cmake/gcc_flags.cmake
|
- cmake/gcc_flags.cmake
|
||||||
|
- include/nlohmann/detail/abi_macros.hpp
|
||||||
- tests/fmt_formatter/project/main.cpp
|
- tests/fmt_formatter/project/main.cpp
|
||||||
- tools/astyle/.astylerc
|
- tools/astyle/.astylerc
|
||||||
workflow_dispatch:
|
workflow_dispatch:
|
||||||
|
|||||||
@@ -109,7 +109,7 @@ jobs:
|
|||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
strategy:
|
strategy:
|
||||||
matrix:
|
matrix:
|
||||||
target: [ci_test_amalgamation, ci_test_single_header, ci_cppcheck, ci_cpplint, ci_reproducible_tests, ci_non_git_tests, ci_offline_testdata, ci_reuse_compliance, ci_test_valgrind]
|
target: [ci_test_single_header, ci_cppcheck, ci_cpplint, ci_reproducible_tests, ci_non_git_tests, ci_offline_testdata, ci_reuse_compliance, ci_test_valgrind]
|
||||||
steps:
|
steps:
|
||||||
- name: Harden Runner
|
- name: Harden Runner
|
||||||
uses: step-security/harden-runner@e14015d583714f6e62063499dc959a02595150a1 # v2.21.1
|
uses: step-security/harden-runner@e14015d583714f6e62063499dc959a02595150a1 # v2.21.1
|
||||||
@@ -117,6 +117,7 @@ jobs:
|
|||||||
egress-policy: audit
|
egress-policy: audit
|
||||||
|
|
||||||
- name: Install Valgrind
|
- name: Install Valgrind
|
||||||
|
if: matrix.target == 'ci_test_valgrind'
|
||||||
run: sudo apt-get update ; sudo apt-get install -y valgrind
|
run: sudo apt-get update ; sudo apt-get install -y valgrind
|
||||||
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
||||||
with:
|
with:
|
||||||
@@ -279,7 +280,7 @@ jobs:
|
|||||||
persist-credentials: false
|
persist-credentials: false
|
||||||
- name: Get latest CMake and ninja
|
- name: Get latest CMake and ninja
|
||||||
uses: lukka/get-cmake@fffaaafeea488556c2c12dad60690008bc1caacb # v4.4.2
|
uses: lukka/get-cmake@fffaaafeea488556c2c12dad60690008bc1caacb # v4.4.2
|
||||||
- name: Set env FORCE_STDCPPFS_FLAG for clang 7 / 8 / 9 / 10
|
- name: Disable filesystem support (std::filesystem is unusable) for clang 7 / 8 / 9 / 10
|
||||||
run: echo "JSON_FORCED_GLOBAL_COMPILE_OPTIONS=-DJSON_HAS_FILESYSTEM=0;-DJSON_HAS_EXPERIMENTAL_FILESYSTEM=0" >> "$GITHUB_ENV"
|
run: echo "JSON_FORCED_GLOBAL_COMPILE_OPTIONS=-DJSON_HAS_FILESYSTEM=0;-DJSON_HAS_EXPERIMENTAL_FILESYSTEM=0" >> "$GITHUB_ENV"
|
||||||
if: ${{ matrix.compiler == '7' || matrix.compiler == '8' || matrix.compiler == '9' || matrix.compiler == '10' }}
|
if: ${{ matrix.compiler == '7' || matrix.compiler == '8' || matrix.compiler == '9' || matrix.compiler == '10' }}
|
||||||
- name: Run CMake
|
- name: Run CMake
|
||||||
|
|||||||
@@ -187,7 +187,7 @@ jobs:
|
|||||||
- name: Test
|
- name: Test
|
||||||
run: cd build ; ctest -j 10 -C Debug --output-on-failure
|
run: cd build ; ctest -j 10 -C Debug --output-on-failure
|
||||||
|
|
||||||
clang-cl-12:
|
clang-cl:
|
||||||
runs-on: windows-2022
|
runs-on: windows-2022
|
||||||
strategy:
|
strategy:
|
||||||
matrix:
|
matrix:
|
||||||
|
|||||||
+14
-1
@@ -27,7 +27,6 @@
|
|||||||
/docs/docset/JSON_for_Modern_C++.tgz
|
/docs/docset/JSON_for_Modern_C++.tgz
|
||||||
/docs/docset/docSet.dsidx
|
/docs/docset/docSet.dsidx
|
||||||
/docs/mkdocs/.cache/
|
/docs/mkdocs/.cache/
|
||||||
/docs/mkdocs/docs/__pycache__/
|
|
||||||
/docs/mkdocs/hooks/__pycache__/
|
/docs/mkdocs/hooks/__pycache__/
|
||||||
/docs/mkdocs/scripts/mermaid/node_modules/
|
/docs/mkdocs/scripts/mermaid/node_modules/
|
||||||
/docs/mkdocs/site/
|
/docs/mkdocs/site/
|
||||||
@@ -47,3 +46,17 @@ nlohmann_json.spdx
|
|||||||
|
|
||||||
# Bazel-related
|
# Bazel-related
|
||||||
MODULE.bazel.lock
|
MODULE.bazel.lock
|
||||||
|
|
||||||
|
# backups left by `make check-amalgamation` or the ci_test_amalgamation target if they are interrupted
|
||||||
|
/BUILD.bazel~
|
||||||
|
/nlohmann_json.natvis~
|
||||||
|
/single_include/nlohmann/*.hpp~
|
||||||
|
/venv_astyle/
|
||||||
|
|
||||||
|
# release outputs of `make release`
|
||||||
|
/include.zip
|
||||||
|
/include.zip.asc
|
||||||
|
/json.tar.xz
|
||||||
|
/json.tar.xz.asc
|
||||||
|
/release_files/
|
||||||
|
/single_include/nlohmann/*.asc
|
||||||
@@ -81,6 +81,7 @@ cc_library(
|
|||||||
hdrs = [
|
hdrs = [
|
||||||
"single_include/nlohmann/json.hpp",
|
"single_include/nlohmann/json.hpp",
|
||||||
"single_include/nlohmann/json_fwd.hpp",
|
"single_include/nlohmann/json_fwd.hpp",
|
||||||
|
"single_include/nlohmann/json_literals.hpp",
|
||||||
],
|
],
|
||||||
includes = ["single_include"],
|
includes = ["single_include"],
|
||||||
visibility = ["//visibility:public"],
|
visibility = ["//visibility:public"],
|
||||||
|
|||||||
+1
-1
@@ -8,7 +8,7 @@ authors:
|
|||||||
website: https://nlohmann.me
|
website: https://nlohmann.me
|
||||||
title: "JSON for Modern C++"
|
title: "JSON for Modern C++"
|
||||||
version: 3.12.0
|
version: 3.12.0
|
||||||
date-released: 2025-04-07
|
date-released: 2025-04-11
|
||||||
license: MIT
|
license: MIT
|
||||||
repository-code: "https://github.com/nlohmann/json"
|
repository-code: "https://github.com/nlohmann/json"
|
||||||
url: https://json.nlohmann.me
|
url: https://json.nlohmann.me
|
||||||
+1
-1
@@ -30,7 +30,7 @@ endif ()
|
|||||||
option(NLOHMANN_JSON_BUILD_MODULES "Build C++ modules support" OFF)
|
option(NLOHMANN_JSON_BUILD_MODULES "Build C++ modules support" OFF)
|
||||||
|
|
||||||
if(NLOHMANN_JSON_BUILD_MODULES)
|
if(NLOHMANN_JSON_BUILD_MODULES)
|
||||||
if(CMAKE_VERSION VERSION_GREATER_EQUAL 3.28)
|
if(NOT CMAKE_VERSION VERSION_LESS 3.28)
|
||||||
message(STATUS "Building nlohmann.json C++ module")
|
message(STATUS "Building nlohmann.json C++ module")
|
||||||
add_subdirectory(src/modules)
|
add_subdirectory(src/modules)
|
||||||
else()
|
else()
|
||||||
|
|||||||
@@ -14,7 +14,7 @@ This file describes the source for supporting files; that is, files that are not
|
|||||||
The [GitHub Actions](https://docs.github.com/en/actions) workflows that build, test, and analyze the library. Each file in this folder defines one workflow:
|
The [GitHub Actions](https://docs.github.com/en/actions) workflows that build, test, and analyze the library. Each file in this folder defines one workflow:
|
||||||
|
|
||||||
- `ubuntu.yml`, `macos.yml`, `windows.yml` — build and run the test suite on Linux, macOS, and Windows.
|
- `ubuntu.yml`, `macos.yml`, `windows.yml` — build and run the test suite on Linux, macOS, and Windows.
|
||||||
- `check_amalgamation.yml` — verify that the single-header amalgamation in `single_include` is up to date on pull requests.
|
- `check_amalgamation.yml` — verify on pull requests and pushes to `develop` that the generated files (the single-header amalgamation in `single_include`, `BUILD.bazel`, and `nlohmann_json.natvis`) are up to date.
|
||||||
- `comment_check_amalgamation.yml` — comment on a pull request when the amalgamation check failed.
|
- `comment_check_amalgamation.yml` — comment on a pull request when the amalgamation check failed.
|
||||||
- `cifuzz.yml` — run short fuzzing sessions via [OSS-Fuzz CIFuzz](https://google.github.io/oss-fuzz/getting-started/continuous-integration/) on pull requests.
|
- `cifuzz.yml` — run short fuzzing sessions via [OSS-Fuzz CIFuzz](https://google.github.io/oss-fuzz/getting-started/continuous-integration/) on pull requests.
|
||||||
- `codeql-analysis.yml` — run [CodeQL](https://codeql.github.com) code scanning.
|
- `codeql-analysis.yml` — run [CodeQL](https://codeql.github.com) code scanning.
|
||||||
@@ -24,7 +24,9 @@ The [GitHub Actions](https://docs.github.com/en/actions) workflows that build, t
|
|||||||
- `dependency-review.yml` — scan dependency changes in pull requests for known vulnerabilities.
|
- `dependency-review.yml` — scan dependency changes in pull requests for known vulnerabilities.
|
||||||
- `labeler.yml` — the "Pull Request Labeler" workflow (see `.github/labeler.yml`).
|
- `labeler.yml` — the "Pull Request Labeler" workflow (see `.github/labeler.yml`).
|
||||||
- `stale.yml` — comment on and close stale issues and pull requests.
|
- `stale.yml` — comment on and close stale issues and pull requests.
|
||||||
- `publish_documentation.yml` — build and publish the documentation on every merge to the `develop` branch.
|
- `publish_documentation.yml` — build and publish the documentation on pushes to the `develop` branch that touch the documentation sources (or the files it embeds).
|
||||||
|
- `check_docs_links.yml` — check the links of the documentation weekly, as external links can break without any change in this repository.
|
||||||
|
- `cancel_closed_pr_runs.yml` — cancel unfinished workflow runs of a pull request once it is closed or merged.
|
||||||
|
|
||||||
Further documentation:
|
Further documentation:
|
||||||
|
|
||||||
@@ -266,8 +268,9 @@ meson setup builddir
|
|||||||
ninja -C builddir
|
ninja -C builddir
|
||||||
```
|
```
|
||||||
|
|
||||||
`meson_options.txt` defines the options, which mirror the CMake options that change the library's target (for example,
|
`meson_options.txt` defines the options, which mirror the names of the CMake options that change the library's target (for example,
|
||||||
`-DDiagnostics=true`). Meson requires this file next to `meson.build`, so it is also part of `include.zip`. `make check_build_options`
|
`-DDiagnostics=true`); their defaults may differ (for example, `MultipleHeaders` defaults to `false` in Meson, while
|
||||||
|
`JSON_MultipleHeaders` is `ON` in CMake). Meson requires this file next to `meson.build`, so it is also part of `include.zip`. `make check_build_options`
|
||||||
([`tools/check_build_options`](tools/check_build_options/README.md)) checks in CI that both files and the pkg-config files
|
([`tools/check_build_options`](tools/check_build_options/README.md)) checks in CI that both files and the pkg-config files
|
||||||
stay in sync with the CMake options.
|
stay in sync with the CMake options.
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
module(
|
module(
|
||||||
name = "nlohmann_json",
|
name = "nlohmann_json",
|
||||||
|
version = "3.12.0",
|
||||||
compatibility_level = 1,
|
compatibility_level = 1,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
.PHONY: pretty clean ChangeLog.md release update_hedley update_hedley_undef BUILD.bazel natvis macro_builder_check check_build_options
|
.PHONY: all amalgamate check-amalgamation check_build_options pretty install_astyle clean ChangeLog.md release update_hedley update_hedley_undef BUILD.bazel natvis macro_builder_check run_benchmarks pvs_studio serve_header reuse spdx
|
||||||
|
|
||||||
##########################################################################
|
##########################################################################
|
||||||
# configuration
|
# configuration
|
||||||
@@ -41,12 +41,18 @@ all:
|
|||||||
@echo "BUILD.bazel - regenerate the Bazel BUILD file from the include/nlohmann sources"
|
@echo "BUILD.bazel - regenerate the Bazel BUILD file from the include/nlohmann sources"
|
||||||
@echo "ChangeLog.md - generate ChangeLog file"
|
@echo "ChangeLog.md - generate ChangeLog file"
|
||||||
@echo "check-amalgamation - check whether sources have been amalgamated and BUILD.bazel is up to date"
|
@echo "check-amalgamation - check whether sources have been amalgamated and BUILD.bazel is up to date"
|
||||||
|
@echo "check_build_options - check that the Meson build and the pkg-config files offer the options of the CMake target"
|
||||||
@echo "clean - remove built files"
|
@echo "clean - remove built files"
|
||||||
@echo "fuzzing - see tests/fuzzing.md for how to build and run the fuzzers"
|
@echo "(fuzzers) - see tests/fuzzing.md, or run 'make -C tests fuzzers' to build the AFL fuzzers"
|
||||||
@echo "macro_builder_check - check that macro_scope.hpp matches tools/macro_builder's output"
|
@echo "macro_builder_check - check that macro_scope.hpp matches tools/macro_builder's output"
|
||||||
@echo "natvis - regenerate nlohmann_json.natvis from the current ABI tags and version"
|
@echo "natvis - regenerate nlohmann_json.natvis from the current ABI tags and version"
|
||||||
@echo "pretty - beautify code with Artistic Style"
|
@echo "pretty - beautify code with Artistic Style"
|
||||||
|
@echo "pvs_studio - run the PVS-Studio static analyzer and open the report"
|
||||||
|
@echo "release - create the release files (include.zip, json.tar.xz, single headers, signatures, hashes)"
|
||||||
|
@echo "reuse - annotate the source files with REUSE license headers and lint them"
|
||||||
@echo "run_benchmarks - build and run benchmarks"
|
@echo "run_benchmarks - build and run benchmarks"
|
||||||
|
@echo "serve_header - serve the single header, re-amalgamated on demand (see tools/serve_header)"
|
||||||
|
@echo "spdx - generate the SPDX software bill of materials nlohmann_json.spdx"
|
||||||
@echo "update_hedley - download Hedley and regenerate hedley.hpp / hedley_undef.hpp"
|
@echo "update_hedley - download Hedley and regenerate hedley.hpp / hedley_undef.hpp"
|
||||||
@echo "update_hedley_undef - rebuild hedley_undef.hpp from the JSON_HEDLEY_* #define names in hedley.hpp"
|
@echo "update_hedley_undef - rebuild hedley_undef.hpp from the JSON_HEDLEY_* #define names in hedley.hpp"
|
||||||
|
|
||||||
@@ -108,13 +114,18 @@ $(AMALGAMATED_FWD_FILE): $(SRCS)
|
|||||||
$(AMALGAMATED_LITERALS_FILE): include/nlohmann/json_literals.hpp
|
$(AMALGAMATED_LITERALS_FILE): include/nlohmann/json_literals.hpp
|
||||||
cp include/nlohmann/json_literals.hpp $(AMALGAMATED_LITERALS_FILE)
|
cp include/nlohmann/json_literals.hpp $(AMALGAMATED_LITERALS_FILE)
|
||||||
|
|
||||||
|
NATVIS_VENV=tools/generate_natvis/venv
|
||||||
|
|
||||||
# regenerate nlohmann_json.natvis from the ABI tags and version in include/nlohmann/detail/abi_macros.hpp
|
# regenerate nlohmann_json.natvis from the ABI tags and version in include/nlohmann/detail/abi_macros.hpp
|
||||||
|
# (the dependencies are installed into a virtual environment first)
|
||||||
natvis:
|
natvis:
|
||||||
python3 tools/generate_natvis/generate_natvis.py .
|
@test -d $(NATVIS_VENV) || python3 -mvenv $(NATVIS_VENV)
|
||||||
|
@$(NATVIS_VENV)/bin/python3 -c 'import jinja2' 2>/dev/null || $(NATVIS_VENV)/bin/pip3 install --quiet -r tools/generate_natvis/requirements.txt
|
||||||
|
$(NATVIS_VENV)/bin/python3 tools/generate_natvis/generate_natvis.py .
|
||||||
|
|
||||||
# regenerate the two tools/macro_builder blocks of $(MACRO_SCOPE_HPP) (see its README.md) and diff against the
|
# regenerate the two tools/macro_builder blocks of $(MACRO_SCOPE_HPP) (see its README.md) and diff against the
|
||||||
# checked-in header; phony, because it never writes $(MACRO_SCOPE_HPP) itself
|
# checked-in header; phony, because it never writes $(MACRO_SCOPE_HPP) itself
|
||||||
macro_builder_check:
|
macro_builder_check: install_astyle
|
||||||
@set -e; \
|
@set -e; \
|
||||||
TMPDIR=$$(mktemp -d ./macro_builder_check.XXXXXX); \
|
TMPDIR=$$(mktemp -d ./macro_builder_check.XXXXXX); \
|
||||||
trap 'rm -rf "$$TMPDIR"' EXIT; \
|
trap 'rm -rf "$$TMPDIR"' EXIT; \
|
||||||
@@ -131,27 +142,27 @@ macro_builder_check:
|
|||||||
check_build_options:
|
check_build_options:
|
||||||
python3 tools/check_build_options/check_build_options.py .
|
python3 tools/check_build_options/check_build_options.py .
|
||||||
|
|
||||||
# check if file single_include/nlohmann/json.hpp has been amalgamated from the nlohmann sources
|
# check if the single headers have been amalgamated from the nlohmann sources and if BUILD.bazel and
|
||||||
|
# nlohmann_json.natvis are up to date; all checks are run, and the checked-in files are always restored
|
||||||
check-amalgamation:
|
check-amalgamation:
|
||||||
@mv $(AMALGAMATED_FILE) $(AMALGAMATED_FILE)~
|
@status=0; \
|
||||||
@mv $(AMALGAMATED_FWD_FILE) $(AMALGAMATED_FWD_FILE)~
|
banner() { printf '===================================================================\n %s\n===================================================================\n' "$$1"; }; \
|
||||||
@mv $(AMALGAMATED_LITERALS_FILE) $(AMALGAMATED_LITERALS_FILE)~
|
for FILE in $(AMALGAMATED_FILE) $(AMALGAMATED_FWD_FILE) $(AMALGAMATED_LITERALS_FILE) BUILD.bazel nlohmann_json.natvis; do \
|
||||||
@$(MAKE) amalgamate
|
mv "$$FILE" "$$FILE~" || exit 1; \
|
||||||
@diff $(AMALGAMATED_FILE) $(AMALGAMATED_FILE)~ || (echo "===================================================================\n Amalgamation required! Please read the contribution guidelines\n in file .github/CONTRIBUTING.md.\n===================================================================" ; mv $(AMALGAMATED_FILE)~ $(AMALGAMATED_FILE) ; false)
|
done; \
|
||||||
@diff $(AMALGAMATED_FWD_FILE) $(AMALGAMATED_FWD_FILE)~ || (echo "===================================================================\n Amalgamation required! Please read the contribution guidelines\n in file .github/CONTRIBUTING.md.\n===================================================================" ; mv $(AMALGAMATED_FWD_FILE)~ $(AMALGAMATED_FWD_FILE) ; false)
|
$(MAKE) amalgamate || status=1; \
|
||||||
@diff $(AMALGAMATED_LITERALS_FILE) $(AMALGAMATED_LITERALS_FILE)~ || (echo "===================================================================\n Amalgamation required! Please read the contribution guidelines\n in file .github/CONTRIBUTING.md.\n===================================================================" ; mv $(AMALGAMATED_LITERALS_FILE)~ $(AMALGAMATED_LITERALS_FILE) ; false)
|
$(MAKE) BUILD.bazel || status=1; \
|
||||||
@mv $(AMALGAMATED_FILE)~ $(AMALGAMATED_FILE)
|
$(MAKE) natvis || status=1; \
|
||||||
@mv $(AMALGAMATED_FWD_FILE)~ $(AMALGAMATED_FWD_FILE)
|
for FILE in $(AMALGAMATED_FILE) $(AMALGAMATED_FWD_FILE) $(AMALGAMATED_LITERALS_FILE); do \
|
||||||
@mv $(AMALGAMATED_LITERALS_FILE)~ $(AMALGAMATED_LITERALS_FILE)
|
diff "$$FILE" "$$FILE~" || { banner "$$FILE is out of date! Amalgamation required! Please read the contribution guidelines in file .github/CONTRIBUTING.md."; status=1; }; \
|
||||||
@mv BUILD.bazel BUILD.bazel~
|
done; \
|
||||||
@$(MAKE) BUILD.bazel
|
diff BUILD.bazel BUILD.bazel~ || { banner "BUILD.bazel is out of date! Please run 'make BUILD.bazel'."; status=1; }; \
|
||||||
@diff BUILD.bazel BUILD.bazel~ || (echo "===================================================================\n BUILD.bazel is out of date! Please run 'make BUILD.bazel'.\n===================================================================" ; mv BUILD.bazel~ BUILD.bazel ; false)
|
diff nlohmann_json.natvis nlohmann_json.natvis~ || { banner "nlohmann_json.natvis is out of date! Please run 'make natvis'."; status=1; }; \
|
||||||
@mv BUILD.bazel~ BUILD.bazel
|
for FILE in $(AMALGAMATED_FILE) $(AMALGAMATED_FWD_FILE) $(AMALGAMATED_LITERALS_FILE) BUILD.bazel nlohmann_json.natvis; do \
|
||||||
@mv nlohmann_json.natvis nlohmann_json.natvis~
|
mv "$$FILE~" "$$FILE"; \
|
||||||
@$(MAKE) natvis
|
done; \
|
||||||
@diff nlohmann_json.natvis nlohmann_json.natvis~ || (echo "===================================================================\n nlohmann_json.natvis is out of date! Please run 'make natvis'.\n===================================================================" ; mv nlohmann_json.natvis~ nlohmann_json.natvis ; false)
|
$(MAKE) macro_builder_check || status=1; \
|
||||||
@mv nlohmann_json.natvis~ nlohmann_json.natvis
|
exit $$status
|
||||||
@$(MAKE) macro_builder_check
|
|
||||||
|
|
||||||
# generate the Bazel BUILD file; phony, because a removed header would not trigger a rebuild
|
# generate the Bazel BUILD file; phony, because a removed header would not trigger a rebuild
|
||||||
BUILD.bazel:
|
BUILD.bazel:
|
||||||
@@ -212,8 +223,8 @@ release: include.zip json.tar.xz
|
|||||||
|
|
||||||
# clean up
|
# clean up
|
||||||
clean:
|
clean:
|
||||||
rm -fr fuzz fuzz-testing *.dSYM tests/*.dSYM
|
rm -fr *.dSYM tests/*.dSYM tests/parse_*_fuzzer
|
||||||
rm -fr cmake-build-benchmarks fuzz-testing cmake-build-pvs-studio release_files
|
rm -fr cmake-build-benchmarks cmake-build-pvs-studio release_files
|
||||||
$(MAKE) clean -Cdocs
|
$(MAKE) clean -Cdocs
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -48,6 +48,7 @@
|
|||||||
- [Pkg-config](#pkg-config)
|
- [Pkg-config](#pkg-config)
|
||||||
- [License](#license)
|
- [License](#license)
|
||||||
- [Contact](#contact)
|
- [Contact](#contact)
|
||||||
|
- [Security](#security)
|
||||||
- [Thanks](#thanks)
|
- [Thanks](#thanks)
|
||||||
- [Used third-party tools](#used-third-party-tools)
|
- [Used third-party tools](#used-third-party-tools)
|
||||||
- [Notes](#notes)
|
- [Notes](#notes)
|
||||||
@@ -112,9 +113,9 @@ There is also a [**docset**](https://github.com/Kapeli/Dash-User-Contributions/t
|
|||||||
|
|
||||||
## Quick reference
|
## Quick reference
|
||||||
|
|
||||||
- **Constructors** [basic_json](https://json.nlohmann.me/api/basic_json/basic_json), [array](https://json.nlohmann.me/api/basic_json/array), [binary](https://json.nlohmann.me/api/basic_json/binary), [object](https://json.nlohmann.me/api/basic_json/object)
|
- **Constructors**: [basic_json](https://json.nlohmann.me/api/basic_json/basic_json), [array](https://json.nlohmann.me/api/basic_json/array), [binary](https://json.nlohmann.me/api/basic_json/binary), [object](https://json.nlohmann.me/api/basic_json/object)
|
||||||
- **Object inspection**: [type](https://json.nlohmann.me/api/basic_json/type), [operator value_t](https://json.nlohmann.me/api/basic_json/operator_value_t), [type_name](https://json.nlohmann.me/api/basic_json/type_name), [is_primitive](https://json.nlohmann.me/api/basic_json/is_primitive), [is_structured](https://json.nlohmann.me/api/basic_json/is_structured), [is_null](https://json.nlohmann.me/api/basic_json/is_null), [is_boolean](https://json.nlohmann.me/api/basic_json/is_boolean), [is_number](https://json.nlohmann.me/api/basic_json/is_number), [is_number_integer](https://json.nlohmann.me/api/basic_json/is_number_integer), [is_number_unsigned](https://json.nlohmann.me/api/basic_json/is_number_unsigned), [is_number_float](https://json.nlohmann.me/api/basic_json/is_number_float), [is_object](https://json.nlohmann.me/api/basic_json/is_object), [is_array](https://json.nlohmann.me/api/basic_json/is_array), [is_string](https://json.nlohmann.me/api/basic_json/is_string), [is_binary](https://json.nlohmann.me/api/basic_json/is_binary), [is_discarded](https://json.nlohmann.me/api/basic_json/is_discarded)
|
- **Object inspection**: [type](https://json.nlohmann.me/api/basic_json/type), [operator value_t](https://json.nlohmann.me/api/basic_json/operator_value_t), [type_name](https://json.nlohmann.me/api/basic_json/type_name), [is_primitive](https://json.nlohmann.me/api/basic_json/is_primitive), [is_structured](https://json.nlohmann.me/api/basic_json/is_structured), [is_null](https://json.nlohmann.me/api/basic_json/is_null), [is_boolean](https://json.nlohmann.me/api/basic_json/is_boolean), [is_number](https://json.nlohmann.me/api/basic_json/is_number), [is_number_integer](https://json.nlohmann.me/api/basic_json/is_number_integer), [is_number_unsigned](https://json.nlohmann.me/api/basic_json/is_number_unsigned), [is_number_float](https://json.nlohmann.me/api/basic_json/is_number_float), [is_object](https://json.nlohmann.me/api/basic_json/is_object), [is_array](https://json.nlohmann.me/api/basic_json/is_array), [is_string](https://json.nlohmann.me/api/basic_json/is_string), [is_binary](https://json.nlohmann.me/api/basic_json/is_binary), [is_discarded](https://json.nlohmann.me/api/basic_json/is_discarded)
|
||||||
- **Value access**; [get](https://json.nlohmann.me/api/basic_json/get), [get_to](https://json.nlohmann.me/api/basic_json/get_to), [get_ptr](https://json.nlohmann.me/api/basic_json/get_ptr), [get_ref](https://json.nlohmann.me/api/basic_json/get_ref), [operator ValueType](https://json.nlohmann.me/api/basic_json/operator_ValueType), [get_binary](https://json.nlohmann.me/api/basic_json/get_binary)
|
- **Value access**: [get](https://json.nlohmann.me/api/basic_json/get), [get_to](https://json.nlohmann.me/api/basic_json/get_to), [get_ptr](https://json.nlohmann.me/api/basic_json/get_ptr), [get_ref](https://json.nlohmann.me/api/basic_json/get_ref), [operator ValueType](https://json.nlohmann.me/api/basic_json/operator_ValueType), [get_binary](https://json.nlohmann.me/api/basic_json/get_binary)
|
||||||
- **Element access**: [at](https://json.nlohmann.me/api/basic_json/at), [operator[]](https://json.nlohmann.me/api/basic_json/operator[]), [value](https://json.nlohmann.me/api/basic_json/value), [front](https://json.nlohmann.me/api/basic_json/front), [back](https://json.nlohmann.me/api/basic_json/back)
|
- **Element access**: [at](https://json.nlohmann.me/api/basic_json/at), [operator[]](https://json.nlohmann.me/api/basic_json/operator[]), [value](https://json.nlohmann.me/api/basic_json/value), [front](https://json.nlohmann.me/api/basic_json/front), [back](https://json.nlohmann.me/api/basic_json/back)
|
||||||
- **Lookup**: [find](https://json.nlohmann.me/api/basic_json/find), [count](https://json.nlohmann.me/api/basic_json/count), [contains](https://json.nlohmann.me/api/basic_json/contains)
|
- **Lookup**: [find](https://json.nlohmann.me/api/basic_json/find), [count](https://json.nlohmann.me/api/basic_json/count), [contains](https://json.nlohmann.me/api/basic_json/contains)
|
||||||
- **Iterators**: [begin](https://json.nlohmann.me/api/basic_json/begin), [cbegin](https://json.nlohmann.me/api/basic_json/cbegin), [end](https://json.nlohmann.me/api/basic_json/end), [cend](https://json.nlohmann.me/api/basic_json/cend), [rbegin](https://json.nlohmann.me/api/basic_json/rbegin), [rend](https://json.nlohmann.me/api/basic_json/rend), [crbegin](https://json.nlohmann.me/api/basic_json/crbegin), [crend](https://json.nlohmann.me/api/basic_json/crend), [items](https://json.nlohmann.me/api/basic_json/items)
|
- **Iterators**: [begin](https://json.nlohmann.me/api/basic_json/begin), [cbegin](https://json.nlohmann.me/api/basic_json/cbegin), [end](https://json.nlohmann.me/api/basic_json/end), [cend](https://json.nlohmann.me/api/basic_json/cend), [rbegin](https://json.nlohmann.me/api/basic_json/rbegin), [rend](https://json.nlohmann.me/api/basic_json/rend), [crbegin](https://json.nlohmann.me/api/basic_json/crbegin), [crend](https://json.nlohmann.me/api/basic_json/crend), [items](https://json.nlohmann.me/api/basic_json/items)
|
||||||
@@ -1184,7 +1185,7 @@ binary[1]; // 0xFE
|
|||||||
binary.set_subtype(0x10);
|
binary.set_subtype(0x10);
|
||||||
|
|
||||||
// serialize to MessagePack
|
// serialize to MessagePack
|
||||||
auto cbor = json::to_msgpack(j); // 0xD5 (fixext2), 0x10, 0xCA, 0xFE
|
auto msgpack = json::to_msgpack(j); // 0xD5 (fixext2), 0x10, 0xCA, 0xFE
|
||||||
```
|
```
|
||||||
|
|
||||||
## Customers
|
## Customers
|
||||||
@@ -1220,17 +1221,7 @@ I would be happy to learn about other compilers/versions.
|
|||||||
Please note:
|
Please note:
|
||||||
|
|
||||||
- GCC 4.8 has a bug [57824](https://gcc.gnu.org/bugzilla/show_bug.cgi?id=57824): multiline raw strings cannot be the arguments to macros. Don't use multiline raw strings directly in macros with this compiler.
|
- GCC 4.8 has a bug [57824](https://gcc.gnu.org/bugzilla/show_bug.cgi?id=57824): multiline raw strings cannot be the arguments to macros. Don't use multiline raw strings directly in macros with this compiler.
|
||||||
- Android defaults to using very old compilers and C++ libraries. To fix this, add the following to your `Application.mk`. This will switch to the LLVM C++ library, the Clang compiler, and enable C++11 and other features disabled by default.
|
- For GCC running on MinGW or Android, the error `'to_string' is not a member of 'std'` (or similarly, for `strtod` or `strtof`) may occur. Note this is not an issue with the code, but rather with the compiler or C++ standard library itself: use a recent toolchain (for Android, a current [NDK](https://developer.android.com/ndk) with the LLVM C++ library `APP_STL := c++_shared`, and for MinGW, a distribution with a complete C++11 standard library). See [this discussion](https://github.com/nlohmann/json/issues/136) for MinGW and [this discussion](https://github.com/nlohmann/json/issues/219) for the old Android NDK using `APP_STL := gnustl_static`.
|
||||||
|
|
||||||
```makefile
|
|
||||||
APP_STL := c++_shared
|
|
||||||
NDK_TOOLCHAIN_VERSION := clang3.6
|
|
||||||
APP_CPPFLAGS += -frtti -fexceptions
|
|
||||||
```
|
|
||||||
|
|
||||||
The code compiles successfully with [Android NDK](https://developer.android.com/ndk/index.html?hl=ml), Revision 9 - 11 (and possibly later) and [CrystaX's Android NDK](https://www.crystax.net/en/android/ndk) version 10.
|
|
||||||
|
|
||||||
- For GCC running on MinGW or Android SDK, the error `'to_string' is not a member of 'std'` (or similarly, for `strtod` or `strtof`) may occur. Note this is not an issue with the code, but rather with the compiler itself. On Android, see above to build with a newer environment. For MinGW, please refer to [this site](https://tehsausage.com/mingw-to-string) and [this discussion](https://github.com/nlohmann/json/issues/136) for information on how to fix this bug. For Android NDK using `APP_STL := gnustl_static`, please refer to [this discussion](https://github.com/nlohmann/json/issues/219).
|
|
||||||
|
|
||||||
- Unsupported versions of GCC and Clang are rejected by `#error` directives. This can be switched off by defining `JSON_SKIP_UNSUPPORTED_COMPILER_CHECK`. Note that you can expect no support in this case.
|
- Unsupported versions of GCC and Clang are rejected by `#error` directives. This can be switched off by defining `JSON_SKIP_UNSUPPORTED_COMPILER_CHECK`. Note that you can expect no support in this case.
|
||||||
|
|
||||||
@@ -1396,7 +1387,7 @@ THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR I
|
|||||||
- The class contains a slightly modified version of the Grisu2 algorithm from Florian Loitsch which is licensed under the [MIT License](https://opensource.org/licenses/MIT) (see above). Copyright © 2009 [Florian Loitsch](https://florian.loitsch.com/)
|
- The class contains a slightly modified version of the Grisu2 algorithm from Florian Loitsch which is licensed under the [MIT License](https://opensource.org/licenses/MIT) (see above). Copyright © 2009 [Florian Loitsch](https://florian.loitsch.com/)
|
||||||
- The class contains a copy of [Hedley](https://nemequ.github.io/hedley/) from Evan Nemerson which is licensed as [CC0-1.0](https://creativecommons.org/publicdomain/zero/1.0/).
|
- The class contains a copy of [Hedley](https://nemequ.github.io/hedley/) from Evan Nemerson which is licensed as [CC0-1.0](https://creativecommons.org/publicdomain/zero/1.0/).
|
||||||
- The class contains parts of [Google Abseil](https://github.com/abseil/abseil-cpp) which is licensed under the [Apache 2.0 License](https://opensource.org/licenses/Apache-2.0).
|
- The class contains parts of [Google Abseil](https://github.com/abseil/abseil-cpp) which is licensed under the [Apache 2.0 License](https://opensource.org/licenses/Apache-2.0).
|
||||||
- The class contains an adapted version of the Eisel-Lemire algorithm, its table of powers of five, and its digit comparison for long numbers from [fast_float](https://github.com/fastfloat/fast_float) by Daniel Lemire and contributors, which is available under the [MIT License](https://opensource.org/licenses/MIT) (used here), the Apache 2.0 License, and the Boost Software License. Copyright © 2021 The fast_float authors
|
- The class contains an adapted version of the Eisel-Lemire algorithm and its table of powers of five from [fast_float](https://github.com/fastfloat/fast_float) by Daniel Lemire and contributors, which is available under the [MIT License](https://opensource.org/licenses/MIT) (used here), the Apache 2.0 License, and the Boost Software License. Copyright © 2021 The fast_float authors
|
||||||
|
|
||||||
<img align="right" src="https://git.fsfe.org/reuse/reuse-ci/raw/branch/master/reuse-horizontal.png" alt="REUSE Software">
|
<img align="right" src="https://git.fsfe.org/reuse/reuse-ci/raw/branch/master/reuse-horizontal.png" alt="REUSE Software">
|
||||||
|
|
||||||
@@ -1437,436 +1428,416 @@ I deeply appreciate the help of the following people.
|
|||||||
12. [kepkin](https://github.com/kepkin) patiently pushed forward the support for Microsoft Visual Studio.
|
12. [kepkin](https://github.com/kepkin) patiently pushed forward the support for Microsoft Visual Studio.
|
||||||
13. [gregmarr](https://github.com/gregmarr) simplified the implementation of reverse iterators and helped with numerous hints and improvements. In particular, he pushed forward the implementation of user-defined types.
|
13. [gregmarr](https://github.com/gregmarr) simplified the implementation of reverse iterators and helped with numerous hints and improvements. In particular, he pushed forward the implementation of user-defined types.
|
||||||
14. [Caio Luppi](https://github.com/caiovlp) fixed a bug in the Unicode handling.
|
14. [Caio Luppi](https://github.com/caiovlp) fixed a bug in the Unicode handling.
|
||||||
15. [dariomt](https://github.com/dariomt) fixed some typos in the examples.
|
15. [dariomt](https://github.com/dariomt) fixed some typos in the examples and fixed a subtlety in MSVC type support and implemented the `get_ref()` function to get a reference to stored values.
|
||||||
16. [Daniel Frey](https://github.com/d-frey) cleaned up some pointers and implemented exception-safe memory allocation.
|
16. [Daniel Frey](https://github.com/d-frey) cleaned up some pointers and implemented exception-safe memory allocation.
|
||||||
17. [Colin Hirsch](https://github.com/ColinH) took care of a small namespace issue.
|
17. [Colin Hirsch](https://github.com/ColinH) took care of a small namespace issue.
|
||||||
18. [Huu Nguyen](https://github.com/whoshuu) corrected a variable name in the documentation.
|
18. [Huu Nguyen](https://github.com/whoshuu) corrected a variable name in the documentation.
|
||||||
19. [Silverweed](https://github.com/silverweed) overloaded `parse()` to accept an rvalue reference.
|
19. [Silverweed](https://github.com/silverweed) overloaded `parse()` to accept an rvalue reference.
|
||||||
20. [dariomt](https://github.com/dariomt) fixed a subtlety in MSVC type support and implemented the `get_ref()` function to get a reference to stored values.
|
20. [ZahlGraf](https://github.com/ZahlGraf) added a workaround that allows compilation using Android NDK.
|
||||||
21. [ZahlGraf](https://github.com/ZahlGraf) added a workaround that allows compilation using Android NDK.
|
21. [whackashoe](https://github.com/whackashoe) replaced a function that was marked as unsafe by Visual Studio.
|
||||||
22. [whackashoe](https://github.com/whackashoe) replaced a function that was marked as unsafe by Visual Studio.
|
22. [406345](https://github.com/406345) fixed two small warnings.
|
||||||
23. [406345](https://github.com/406345) fixed two small warnings.
|
23. [Glen Fernandes](https://github.com/glenfe) noted a potential portability problem in the `has_mapped_type` function.
|
||||||
24. [Glen Fernandes](https://github.com/glenfe) noted a potential portability problem in the `has_mapped_type` function.
|
24. [Corbin Hughes](https://github.com/nibroc) fixed some typos in the contribution guidelines.
|
||||||
25. [Corbin Hughes](https://github.com/nibroc) fixed some typos in the contribution guidelines.
|
25. [twelsby](https://github.com/twelsby) fixed the array subscript operator, an issue that failed the MSVC build, and floating-point parsing/dumping. He further added support for unsigned integer numbers and implemented better roundtrip support for parsed numbers.
|
||||||
26. [twelsby](https://github.com/twelsby) fixed the array subscript operator, an issue that failed the MSVC build, and floating-point parsing/dumping. He further added support for unsigned integer numbers and implemented better roundtrip support for parsed numbers.
|
26. [Volker Diels-Grabsch](https://github.com/vog) fixed a link in the README file.
|
||||||
27. [Volker Diels-Grabsch](https://github.com/vog) fixed a link in the README file.
|
27. [msm-](https://github.com/msm-) added support for American Fuzzy Lop.
|
||||||
28. [msm-](https://github.com/msm-) added support for American Fuzzy Lop.
|
28. [Annihil](https://github.com/Annihil) fixed an example in the README file.
|
||||||
29. [Annihil](https://github.com/Annihil) fixed an example in the README file.
|
29. [Themercee](https://github.com/Themercee) noted a wrong URL in the README file.
|
||||||
30. [Themercee](https://github.com/Themercee) noted a wrong URL in the README file.
|
30. [Lv Zheng](https://github.com/lv-zheng) fixed a namespace issue with `int64_t` and `uint64_t`.
|
||||||
31. [Lv Zheng](https://github.com/lv-zheng) fixed a namespace issue with `int64_t` and `uint64_t`.
|
31. [abc100m](https://github.com/abc100m) analyzed the issues with GCC 4.8 and proposed a [partial solution](https://github.com/nlohmann/json/pull/212).
|
||||||
32. [abc100m](https://github.com/abc100m) analyzed the issues with GCC 4.8 and proposed a [partial solution](https://github.com/nlohmann/json/pull/212).
|
32. [zewt](https://github.com/zewt) added useful notes to the README file about Android.
|
||||||
33. [zewt](https://github.com/zewt) added useful notes to the README file about Android.
|
33. [Róbert Márki](https://github.com/robertmrk) added a fix to use move iterators and improved the integration via CMake.
|
||||||
34. [Róbert Márki](https://github.com/robertmrk) added a fix to use move iterators and improved the integration via CMake.
|
34. [Chris Kitching](https://github.com/ChrisKitching) cleaned up the CMake files.
|
||||||
35. [Chris Kitching](https://github.com/ChrisKitching) cleaned up the CMake files.
|
35. [Tom Needham](https://github.com/06needhamt) fixed a subtle bug with MSVC 2015 which was also proposed by [Michael K.](https://github.com/Epidal).
|
||||||
36. [Tom Needham](https://github.com/06needhamt) fixed a subtle bug with MSVC 2015 which was also proposed by [Michael K.](https://github.com/Epidal).
|
36. [Mário Feroldi](https://github.com/thelostt) fixed a small typo.
|
||||||
37. [Mário Feroldi](https://github.com/thelostt) fixed a small typo.
|
37. [duncanwerner](https://github.com/duncanwerner) found a really embarrassing performance regression in the 2.0.0 release.
|
||||||
38. [duncanwerner](https://github.com/duncanwerner) found a really embarrassing performance regression in the 2.0.0 release.
|
38. [Damien](https://github.com/dtoma) fixed one of the last conversion warnings.
|
||||||
39. [Damien](https://github.com/dtoma) fixed one of the last conversion warnings.
|
39. [Thomas Braun](https://github.com/t-b) fixed a warning in a test case and adjusted MSVC calls in the CI.
|
||||||
40. [Thomas Braun](https://github.com/t-b) fixed a warning in a test case and adjusted MSVC calls in the CI.
|
40. [Théo DELRIEU](https://github.com/theodelrieu) patiently and constructively oversaw the long way toward [iterator-range parsing](https://github.com/nlohmann/json/issues/290). He also implemented the magic behind the serialization/deserialization of user-defined types and split the single header file into smaller chunks.
|
||||||
41. [Théo DELRIEU](https://github.com/theodelrieu) patiently and constructively oversaw the long way toward [iterator-range parsing](https://github.com/nlohmann/json/issues/290). He also implemented the magic behind the serialization/deserialization of user-defined types and split the single header file into smaller chunks.
|
41. [Stefan](https://github.com/5tefan) fixed a minor issue in the documentation.
|
||||||
42. [Stefan](https://github.com/5tefan) fixed a minor issue in the documentation.
|
42. [Vasil Dimov](https://github.com/vasild) fixed the documentation regarding conversions from `std::multiset`.
|
||||||
43. [Vasil Dimov](https://github.com/vasild) fixed the documentation regarding conversions from `std::multiset`.
|
43. [ChristophJud](https://github.com/ChristophJud) overworked the CMake files to ease project inclusion.
|
||||||
44. [ChristophJud](https://github.com/ChristophJud) overworked the CMake files to ease project inclusion.
|
44. [Vladimir Petrigo](https://github.com/vpetrigo) made a SFINAE hack more readable and added Visual Studio 17 to the build matrix.
|
||||||
45. [Vladimir Petrigo](https://github.com/vpetrigo) made a SFINAE hack more readable and added Visual Studio 17 to the build matrix.
|
45. [Denis Andrejew](https://github.com/seeekr) fixed a grammar issue in the README file.
|
||||||
46. [Denis Andrejew](https://github.com/seeekr) fixed a grammar issue in the README file.
|
46. [Pierre-Antoine Lacaze](https://github.com/palacaze) found a subtle bug in the `dump()` function.
|
||||||
47. [Pierre-Antoine Lacaze](https://github.com/palacaze) found a subtle bug in the `dump()` function.
|
47. [TurpentineDistillery](https://github.com/TurpentineDistillery) pointed to [`std::locale::classic()`](https://en.cppreference.com/w/cpp/locale/locale/classic) to avoid too much locale joggling, found some nice performance improvements in the parser, improved the benchmarking code, and realized locale-independent number parsing and printing.
|
||||||
48. [TurpentineDistillery](https://github.com/TurpentineDistillery) pointed to [`std::locale::classic()`](https://en.cppreference.com/w/cpp/locale/locale/classic) to avoid too much locale joggling, found some nice performance improvements in the parser, improved the benchmarking code, and realized locale-independent number parsing and printing.
|
48. [cgzones](https://github.com/cgzones) had an idea how to fix the Coverity scan.
|
||||||
49. [cgzones](https://github.com/cgzones) had an idea how to fix the Coverity scan.
|
49. [Jared Grubb](https://github.com/jaredgrubb) silenced a nasty documentation warning and supported the implementation of user-defined types.
|
||||||
50. [Jared Grubb](https://github.com/jaredgrubb) silenced a nasty documentation warning.
|
50. [Yixin Zhang](https://github.com/qwename) fixed an integer overflow check.
|
||||||
51. [Yixin Zhang](https://github.com/qwename) fixed an integer overflow check.
|
51. [Bosswestfalen](https://github.com/Bosswestfalen) merged two iterator classes into a smaller one.
|
||||||
52. [Bosswestfalen](https://github.com/Bosswestfalen) merged two iterator classes into a smaller one.
|
52. [Daniel599](https://github.com/Daniel599) helped to get Travis to execute the tests with Clang's sanitizers and allowed to use more algorithms with the `items()` function.
|
||||||
53. [Daniel599](https://github.com/Daniel599) helped to get Travis to execute the tests with Clang's sanitizers.
|
53. [Jonathan Lee](https://github.com/vjon) fixed an example in the README file.
|
||||||
54. [Jonathan Lee](https://github.com/vjon) fixed an example in the README file.
|
54. [gnzlbg](https://github.com/gnzlbg) supported the implementation of user-defined types.
|
||||||
55. [gnzlbg](https://github.com/gnzlbg) supported the implementation of user-defined types.
|
55. [Alexej Harm](https://github.com/qis) helped to get the user-defined types working with Visual Studio.
|
||||||
56. [Alexej Harm](https://github.com/qis) helped to get the user-defined types working with Visual Studio.
|
56. [EnricoBilla](https://github.com/EnricoBilla) noted a typo in an example.
|
||||||
57. [Jared Grubb](https://github.com/jaredgrubb) supported the implementation of user-defined types.
|
57. [Martin Hořeňovský](https://github.com/horenmar) found a way for a 2x speedup for the compilation time of the test suite.
|
||||||
58. [EnricoBilla](https://github.com/EnricoBilla) noted a typo in an example.
|
58. [ukhegg](https://github.com/ukhegg) proposed an improvement for the examples section.
|
||||||
59. [Martin Hořeňovský](https://github.com/horenmar) found a way for a 2x speedup for the compilation time of the test suite.
|
59. [rswanson-ihi](https://github.com/rswanson-ihi) noted a typo in the README.
|
||||||
60. [ukhegg](https://github.com/ukhegg) proposed an improvement for the examples section.
|
60. [Mihai Stan](https://github.com/stanmihai4) fixed a bug in the comparison with `nullptr`s.
|
||||||
61. [rswanson-ihi](https://github.com/rswanson-ihi) noted a typo in the README.
|
61. [Tushar Maheshwari](https://github.com/tusharpm) added [cotire](https://github.com/sakra/cotire) support to speed up the compilation.
|
||||||
62. [Mihai Stan](https://github.com/stanmihai4) fixed a bug in the comparison with `nullptr`s.
|
62. [TedLyngmo](https://github.com/TedLyngmo) noted a typo in the README, removed unnecessary bit arithmetic, and fixed some `-Weffc++` warnings.
|
||||||
63. [Tushar Maheshwari](https://github.com/tusharpm) added [cotire](https://github.com/sakra/cotire) support to speed up the compilation.
|
63. [Krzysztof Woś](https://github.com/krzysztofwos) made exceptions more visible.
|
||||||
64. [TedLyngmo](https://github.com/TedLyngmo) noted a typo in the README, removed unnecessary bit arithmetic, and fixed some `-Weffc++` warnings.
|
64. [ftillier](https://github.com/ftillier) fixed a compiler warning.
|
||||||
65. [Krzysztof Woś](https://github.com/krzysztofwos) made exceptions more visible.
|
65. [tinloaf](https://github.com/tinloaf) made sure all pushed warnings are properly popped.
|
||||||
66. [ftillier](https://github.com/ftillier) fixed a compiler warning.
|
66. [Fytch](https://github.com/Fytch) found a bug in the documentation.
|
||||||
67. [tinloaf](https://github.com/tinloaf) made sure all pushed warnings are properly popped.
|
67. [Jay Sistar](https://github.com/Type1J) implemented a Meson build description.
|
||||||
68. [Fytch](https://github.com/Fytch) found a bug in the documentation.
|
68. [Henry Lee](https://github.com/HenryRLee) fixed a warning in ICC and improved the iterator implementation.
|
||||||
69. [Jay Sistar](https://github.com/Type1J) implemented a Meson build description.
|
69. [Vincent Thiery](https://github.com/vthiery) maintains a package for the Conan package manager.
|
||||||
70. [Henry Lee](https://github.com/HenryRLee) fixed a warning in ICC and improved the iterator implementation.
|
70. [Steffen](https://github.com/koemeet) fixed a potential issue with MSVC and `std::min`.
|
||||||
71. [Vincent Thiery](https://github.com/vthiery) maintains a package for the Conan package manager.
|
71. [Mike Tzou](https://github.com/Chocobo1) fixed some typos.
|
||||||
72. [Steffen](https://github.com/koemeet) fixed a potential issue with MSVC and `std::min`.
|
72. [amrcode](https://github.com/amrcode) noted misleading documentation about comparison of floats.
|
||||||
73. [Mike Tzou](https://github.com/Chocobo1) fixed some typos.
|
73. [Oleg Endo](https://github.com/olegendo) reduced the memory consumption by replacing `<iostream>` with `<iosfwd>`.
|
||||||
74. [amrcode](https://github.com/amrcode) noted misleading documentation about comparison of floats.
|
74. [dan-42](https://github.com/dan-42) cleaned up the CMake files to simplify including/reusing of the library.
|
||||||
75. [Oleg Endo](https://github.com/olegendo) reduced the memory consumption by replacing `<iostream>` with `<iosfwd>`.
|
75. [Nikita Ofitserov](https://github.com/himikof) allowed for moving values from initializer lists.
|
||||||
76. [dan-42](https://github.com/dan-42) cleaned up the CMake files to simplify including/reusing of the library.
|
76. [Greg Hurrell](https://github.com/wincent) fixed a typo.
|
||||||
77. [Nikita Ofitserov](https://github.com/himikof) allowed for moving values from initializer lists.
|
77. [Dmitry Kukovinets](https://github.com/DmitryKuk) fixed a typo.
|
||||||
78. [Greg Hurrell](https://github.com/wincent) fixed a typo.
|
78. [kbthomp1](https://github.com/kbthomp1) fixed an issue related to the Intel OSX compiler.
|
||||||
79. [Dmitry Kukovinets](https://github.com/DmitryKuk) fixed a typo.
|
79. [Markus Werle](https://github.com/daixtrose) fixed a typo.
|
||||||
80. [kbthomp1](https://github.com/kbthomp1) fixed an issue related to the Intel OSX compiler.
|
80. [WebProdPP](https://github.com/WebProdPP) fixed a subtle error in a precondition check.
|
||||||
81. [Markus Werle](https://github.com/daixtrose) fixed a typo.
|
81. [Alex](https://github.com/leha-bot) noted an error in a code sample.
|
||||||
82. [WebProdPP](https://github.com/WebProdPP) fixed a subtle error in a precondition check.
|
82. [Tom de Geus](https://github.com/tdegeus) reported some warnings with ICC and helped to fix them.
|
||||||
83. [Alex](https://github.com/leha-bot) noted an error in a code sample.
|
83. [Perry Kundert](https://github.com/pjkundert) simplified reading from input streams.
|
||||||
84. [Tom de Geus](https://github.com/tdegeus) reported some warnings with ICC and helped to fix them.
|
84. [Sonu Lohani](https://github.com/sonulohani) fixed a small compilation error, fixed the compilation with MSVC 2015 in debug mode and fixed a warning.
|
||||||
85. [Perry Kundert](https://github.com/pjkundert) simplified reading from input streams.
|
85. [Jamie Seward](https://github.com/jseward) fixed all MSVC warnings and avoided unnecessary string copies in `find()` and `count()`.
|
||||||
86. [Sonu Lohani](https://github.com/sonulohani) fixed a small compilation error.
|
86. [Nate Vargas](https://github.com/eld00d) added a Doxygen tag file.
|
||||||
87. [Jamie Seward](https://github.com/jseward) fixed all MSVC warnings.
|
87. [pvleuven](https://github.com/pvleuven) helped to fix a warning in ICC.
|
||||||
88. [Nate Vargas](https://github.com/eld00d) added a Doxygen tag file.
|
88. [Pavel](https://github.com/crea7or) helped to fix some warnings in MSVC.
|
||||||
89. [pvleuven](https://github.com/pvleuven) helped to fix a warning in ICC.
|
89. [Mitja](https://github.com/Itja) fixed some typos.
|
||||||
90. [Pavel](https://github.com/crea7or) helped to fix some warnings in MSVC.
|
90. [Jorrit Wronski](https://github.com/jowr) updated the Hunter package links.
|
||||||
91. [Jamie Seward](https://github.com/jseward) avoided unnecessary string copies in `find()` and `count()`.
|
91. [Matthias Möller](https://github.com/TinyTinni) added a `.natvis` for the MSVC debug view and removed the dependency from `std::stringstream`.
|
||||||
92. [Mitja](https://github.com/Itja) fixed some typos.
|
92. [bogemic](https://github.com/bogemic) fixed some C++17 deprecation warnings.
|
||||||
93. [Jorrit Wronski](https://github.com/jowr) updated the Hunter package links.
|
93. [Eren Okka](https://github.com/erengy) fixed some MSVC warnings.
|
||||||
94. [Matthias Möller](https://github.com/TinyTinni) added a `.natvis` for the MSVC debug view.
|
94. [abolz](https://github.com/abolz) integrated the Grisu2 algorithm for proper floating-point formatting, allowing more roundtrip checks to succeed.
|
||||||
95. [bogemic](https://github.com/bogemic) fixed some C++17 deprecation warnings.
|
95. [Vadim Evard](https://github.com/Pipeliner) fixed a Markdown issue in the README.
|
||||||
96. [Eren Okka](https://github.com/erengy) fixed some MSVC warnings.
|
96. [zerodefect](https://github.com/zerodefect) fixed a compiler warning.
|
||||||
97. [abolz](https://github.com/abolz) integrated the Grisu2 algorithm for proper floating-point formatting, allowing more roundtrip checks to succeed.
|
97. [Kert](https://github.com/kaidokert) allowed to template the string type in the serialization and added the possibility to override the exceptional behavior.
|
||||||
98. [Vadim Evard](https://github.com/Pipeliner) fixed a Markdown issue in the README.
|
98. [mark-99](https://github.com/mark-99) helped fix an ICC error.
|
||||||
99. [zerodefect](https://github.com/zerodefect) fixed a compiler warning.
|
99. [Patrik Huber](https://github.com/patrikhuber) fixed links in the README file.
|
||||||
100. [Kert](https://github.com/kaidokert) allowed to template the string type in the serialization and added the possibility to override the exceptional behavior.
|
100. [johnfb](https://github.com/johnfb) found a bug in the implementation of CBOR's indefinite length strings.
|
||||||
101. [mark-99](https://github.com/mark-99) helped fix an ICC error.
|
101. [Paul Fultz II](https://github.com/pfultz2) added a note on the cget package manager.
|
||||||
102. [Patrik Huber](https://github.com/patrikhuber) fixed links in the README file.
|
102. [Wilson Lin](https://github.com/wla80) made the integration section of the README more concise.
|
||||||
103. [johnfb](https://github.com/johnfb) found a bug in the implementation of CBOR's indefinite length strings.
|
103. [RalfBielig](https://github.com/ralfbielig) detected and fixed a memory leak in the parser callback.
|
||||||
104. [Paul Fultz II](https://github.com/pfultz2) added a note on the cget package manager.
|
104. [agrianius](https://github.com/agrianius) allowed dumping JSON to an alternative string type and added code to use alternative string implementations.
|
||||||
105. [Wilson Lin](https://github.com/wla80) made the integration section of the README more concise.
|
105. [Kevin Tonon](https://github.com/ktonon) overworked the C++11 compiler checks in CMake.
|
||||||
106. [RalfBielig](https://github.com/ralfbielig) detected and fixed a memory leak in the parser callback.
|
106. [Axel Huebl](https://github.com/ax3l) simplified a CMake check and added support for the [Spack package manager](https://spack.io).
|
||||||
107. [agrianius](https://github.com/agrianius) allowed dumping JSON to an alternative string type.
|
107. [Carlos O'Ryan](https://github.com/coryan) fixed a typo.
|
||||||
108. [Kevin Tonon](https://github.com/ktonon) overworked the C++11 compiler checks in CMake.
|
108. [James Upjohn](https://github.com/jupjohn) fixed a version number in the compilers section.
|
||||||
109. [Axel Huebl](https://github.com/ax3l) simplified a CMake check and added support for the [Spack package manager](https://spack.io).
|
109. [Chuck Atkins](https://github.com/chuckatkins) adjusted the CMake files to the CMake packaging guidelines and provided documentation for the CMake integration.
|
||||||
110. [Carlos O'Ryan](https://github.com/coryan) fixed a typo.
|
110. [Jan Schöppach](https://github.com/dns13) fixed a typo.
|
||||||
111. [James Upjohn](https://github.com/jupjohn) fixed a version number in the compilers section.
|
111. [martin-mfg](https://github.com/martin-mfg) fixed a typo.
|
||||||
112. [Chuck Atkins](https://github.com/chuckatkins) adjusted the CMake files to the CMake packaging guidelines and provided documentation for the CMake integration.
|
112. [Julius Rakow](https://github.com/juliusrakow) fixed the Meson include directory and fixed the links to [cppreference.com](https://cppreference.com).
|
||||||
113. [Jan Schöppach](https://github.com/dns13) fixed a typo.
|
113. [grembo](https://github.com/grembo) fixed the test suite and re-enabled several test cases.
|
||||||
114. [martin-mfg](https://github.com/martin-mfg) fixed a typo.
|
114. [Hyeon Kim](https://github.com/simnalamburt) introduced the macro `JSON_INTERNAL_CATCH` to control the exception handling inside the library and fixed an issue with a double macro definition.
|
||||||
115. [Matthias Möller](https://github.com/TinyTinni) removed the dependency from `std::stringstream`.
|
115. [thyu](https://github.com/thyu) fixed a compiler warning.
|
||||||
116. [agrianius](https://github.com/agrianius) added code to use alternative string implementations.
|
116. [David Guthrie](https://github.com/LEgregius) fixed a subtle compilation error with Clang 3.4.2.
|
||||||
117. [Daniel599](https://github.com/Daniel599) allowed to use more algorithms with the `items()` function.
|
117. [Dennis Fischer](https://github.com/dennisfischer) allowed to call `find_package` without installing the library.
|
||||||
118. [Julius Rakow](https://github.com/juliusrakow) fixed the Meson include directory and fixed the links to [cppreference.com](https://cppreference.com).
|
118. [Ben Berman](https://github.com/rivertam) made some error messages more understandable.
|
||||||
119. [Sonu Lohani](https://github.com/sonulohani) fixed the compilation with MSVC 2015 in debug mode.
|
119. [zakalibit](https://github.com/zakalibit) fixed a compilation problem with the Intel C++ compiler.
|
||||||
120. [grembo](https://github.com/grembo) fixed the test suite and re-enabled several test cases.
|
120. [mandreyel](https://github.com/mandreyel) fixed a compilation problem.
|
||||||
121. [Hyeon Kim](https://github.com/simnalamburt) introduced the macro `JSON_INTERNAL_CATCH` to control the exception handling inside the library.
|
121. [Kostiantyn Ponomarenko](https://github.com/koponomarenko) added version and license information to the Meson build file.
|
||||||
122. [thyu](https://github.com/thyu) fixed a compiler warning.
|
122. [Henry Schreiner](https://github.com/henryiii) added support for GCC 4.8.
|
||||||
123. [David Guthrie](https://github.com/LEgregius) fixed a subtle compilation error with Clang 3.4.2.
|
123. [knilch](https://github.com/knilch0r) made sure the test suite does not stall when run in the wrong directory.
|
||||||
124. [Dennis Fischer](https://github.com/dennisfischer) allowed to call `find_package` without installing the library.
|
124. [Antonio Borondo](https://github.com/antonioborondo) fixed an MSVC 2017 warning.
|
||||||
125. [Hyeon Kim](https://github.com/simnalamburt) fixed an issue with a double macro definition.
|
125. [Dan Gendreau](https://github.com/dgendreau) implemented the `NLOHMANN_JSON_SERIALIZE_ENUM` macro to quickly define an enum/JSON mapping.
|
||||||
126. [Ben Berman](https://github.com/rivertam) made some error messages more understandable.
|
126. [efp](https://github.com/efp) added line and column information to parse errors.
|
||||||
127. [zakalibit](https://github.com/zakalibit) fixed a compilation problem with the Intel C++ compiler.
|
127. [julian-becker](https://github.com/julian-becker) added BSON support.
|
||||||
128. [mandreyel](https://github.com/mandreyel) fixed a compilation problem.
|
128. [Pratik Chowdhury](https://github.com/pratikpc) added support for structured bindings.
|
||||||
129. [Kostiantyn Ponomarenko](https://github.com/koponomarenko) added version and license information to the Meson build file.
|
129. [David Avedissian](https://github.com/davedissian) added support for Clang 5.0.1 (PS4 version).
|
||||||
130. [Henry Schreiner](https://github.com/henryiii) added support for GCC 4.8.
|
130. [Jonathan Dumaresq](https://github.com/dumarjo) implemented an input adapter to read from `FILE*`.
|
||||||
131. [knilch](https://github.com/knilch0r) made sure the test suite does not stall when run in the wrong directory.
|
131. [kjpus](https://github.com/kjpus) fixed a link in the documentation.
|
||||||
132. [Antonio Borondo](https://github.com/antonioborondo) fixed an MSVC 2017 warning.
|
132. [Manvendra Singh](https://github.com/manu-chroma) fixed a typo in the documentation.
|
||||||
133. [Dan Gendreau](https://github.com/dgendreau) implemented the `NLOHMANN_JSON_SERIALIZE_ENUM` macro to quickly define an enum/JSON mapping.
|
133. [ziggurat29](https://github.com/ziggurat29) fixed an MSVC warning.
|
||||||
134. [efp](https://github.com/efp) added line and column information to parse errors.
|
134. [Sylvain Corlay](https://github.com/SylvainCorlay) added code to avoid an issue with MSVC.
|
||||||
135. [julian-becker](https://github.com/julian-becker) added BSON support.
|
135. [mefyl](https://github.com/mefyl) fixed a bug when JSON was parsed from an input stream.
|
||||||
136. [Pratik Chowdhury](https://github.com/pratikpc) added support for structured bindings.
|
136. [Millian Poquet](https://github.com/mpoquet) allowed to install the library via Meson.
|
||||||
137. [David Avedissian](https://github.com/davedissian) added support for Clang 5.0.1 (PS4 version).
|
137. [Michael Behrns-Miller](https://github.com/moodboom) found an issue with a missing namespace.
|
||||||
138. [Jonathan Dumaresq](https://github.com/dumarjo) implemented an input adapter to read from `FILE*`.
|
138. [Nasztanovics Ferenc](https://github.com/naszta) fixed a compilation issue with libc 2.12.
|
||||||
139. [kjpus](https://github.com/kjpus) fixed a link in the documentation.
|
139. [Andreas Schwab](https://github.com/andreas-schwab) fixed the endian conversion.
|
||||||
140. [Manvendra Singh](https://github.com/manu-chroma) fixed a typo in the documentation.
|
140. [Mark-Dunning](https://github.com/Mark-Dunning) fixed a warning in MSVC.
|
||||||
141. [ziggurat29](https://github.com/ziggurat29) fixed an MSVC warning.
|
141. [Gareth Sylvester-Bradley](https://github.com/garethsb-sony) added `operator/` for JSON Pointers and fixed a compilation issue with MSVC.
|
||||||
142. [Sylvain Corlay](https://github.com/SylvainCorlay) added code to avoid an issue with MSVC.
|
142. [John-Mark](https://github.com/johnmarkwayve) noted a missing header.
|
||||||
143. [mefyl](https://github.com/mefyl) fixed a bug when JSON was parsed from an input stream.
|
143. [Vitaly Zaitsev](https://github.com/xvitaly) fixed compilation with GCC 9.0.
|
||||||
144. [Millian Poquet](https://github.com/mpoquet) allowed to install the library via Meson.
|
144. [Laurent Stacul](https://github.com/stac47) fixed compilation with GCC 9.0.
|
||||||
145. [Michael Behrns-Miller](https://github.com/moodboom) found an issue with a missing namespace.
|
145. [Ivor Wanders](https://github.com/iwanders) helped to reduce the CMake requirement to version 3.1 and fixed the examples to catch exception by `const&`.
|
||||||
146. [Nasztanovics Ferenc](https://github.com/naszta) fixed a compilation issue with libc 2.12.
|
146. [njlr](https://github.com/njlr) updated the Buckaroo instructions.
|
||||||
147. [Andreas Schwab](https://github.com/andreas-schwab) fixed the endian conversion.
|
147. [Lion](https://github.com/lieff) fixed a compilation issue with GCC 7 on CentOS.
|
||||||
148. [Mark-Dunning](https://github.com/Mark-Dunning) fixed a warning in MSVC.
|
148. [Isaac Nickaein](https://github.com/nickaein) improved the integer serialization performance and implemented the `contains()` function.
|
||||||
149. [Gareth Sylvester-Bradley](https://github.com/garethsb-sony) added `operator/` for JSON Pointers.
|
149. [past-due](https://github.com/past-due) suppressed an unfixable warning.
|
||||||
150. [John-Mark](https://github.com/johnmarkwayve) noted a missing header.
|
150. [Elvis Oric](https://github.com/elvisoric) improved Meson support.
|
||||||
151. [Vitaly Zaitsev](https://github.com/xvitaly) fixed compilation with GCC 9.0.
|
151. [Matěj Plch](https://github.com/Afforix) fixed an example in the README.
|
||||||
152. [Laurent Stacul](https://github.com/stac47) fixed compilation with GCC 9.0.
|
152. [Mark Beckwith](https://github.com/wythe) fixed two typos.
|
||||||
153. [Ivor Wanders](https://github.com/iwanders) helped to reduce the CMake requirement to version 3.1.
|
153. [scinart](https://github.com/scinart) fixed a bug in the serializer.
|
||||||
154. [njlr](https://github.com/njlr) updated the Buckaroo instructions.
|
154. [Patrick Boettcher](https://github.com/pboettch) implemented `push_back()` and `pop_back()` for JSON Pointers.
|
||||||
155. [Lion](https://github.com/lieff) fixed a compilation issue with GCC 7 on CentOS.
|
155. [Bruno Oliveira](https://github.com/nicoddemus) added support for Conda.
|
||||||
156. [Isaac Nickaein](https://github.com/nickaein) improved the integer serialization performance and implemented the `contains()` function.
|
156. [Michele Caini](https://github.com/skypjack) fixed links in the README.
|
||||||
157. [past-due](https://github.com/past-due) suppressed an unfixable warning.
|
157. [Hani](https://github.com/hnkb) documented how to install the library with NuGet.
|
||||||
158. [Elvis Oric](https://github.com/elvisoric) improved Meson support.
|
158. [yann-morin-1998](https://github.com/yann-morin-1998) helped to reduce the CMake requirement to version 3.1.
|
||||||
159. [Matěj Plch](https://github.com/Afforix) fixed an example in the README.
|
159. [Konstantin Podsvirov](https://github.com/podsvirov) maintains a package for the MSYS2 software distro and fixed the MSYS2 package documentation.
|
||||||
160. [Mark Beckwith](https://github.com/wythe) fixed a typo.
|
160. [remyabel](https://github.com/remyabel2) added GNUInstallDirs to the CMake files.
|
||||||
161. [scinart](https://github.com/scinart) fixed a bug in the serializer.
|
161. [Taylor Howard](https://github.com/taylorhoward92) fixed a unit test.
|
||||||
162. [Patrick Boettcher](https://github.com/pboettch) implemented `push_back()` and `pop_back()` for JSON Pointers.
|
162. [Gabe Ron](https://github.com/Macr0Nerd) implemented the `to_string` method.
|
||||||
163. [Bruno Oliveira](https://github.com/nicoddemus) added support for Conda.
|
163. [Watal M. Iwasaki](https://github.com/heavywatal) fixed a Clang warning.
|
||||||
164. [Michele Caini](https://github.com/skypjack) fixed links in the README.
|
164. [Viktor Kirilov](https://github.com/onqtam) switched the unit tests from [Catch](https://github.com/philsquared/Catch) to [doctest](https://github.com/doctest/doctest)
|
||||||
165. [Hani](https://github.com/hnkb) documented how to install the library with NuGet.
|
165. [Juncheng E](https://github.com/ejcjason) fixed a typo.
|
||||||
166. [Mark Beckwith](https://github.com/wythe) fixed a typo.
|
166. [tete17](https://github.com/tete17) fixed a bug in the `contains` function.
|
||||||
167. [yann-morin-1998](https://github.com/yann-morin-1998) helped to reduce the CMake requirement to version 3.1.
|
167. [Xav83](https://github.com/Xav83) fixed some cppcheck warnings.
|
||||||
168. [Konstantin Podsvirov](https://github.com/podsvirov) maintains a package for the MSYS2 software distro.
|
168. [0xflotus](https://github.com/0xflotus) fixed some typos.
|
||||||
169. [remyabel](https://github.com/remyabel2) added GNUInstallDirs to the CMake files.
|
169. [Christian Deneke](https://github.com/chris0x44) added a const version of `json_pointer::back`.
|
||||||
170. [Taylor Howard](https://github.com/taylorhoward92) fixed a unit test.
|
170. [Julien Hamaide](https://github.com/crazyjul) made the `items()` function work with custom string types.
|
||||||
171. [Gabe Ron](https://github.com/Macr0Nerd) implemented the `to_string` method.
|
171. [Evan Nemerson](https://github.com/nemequ) updated fixed a bug in Hedley and updated this library accordingly.
|
||||||
172. [Watal M. Iwasaki](https://github.com/heavywatal) fixed a Clang warning.
|
172. [Florian Pigorsch](https://github.com/flopp) fixed a lot of typos.
|
||||||
173. [Viktor Kirilov](https://github.com/onqtam) switched the unit tests from [Catch](https://github.com/philsquared/Catch) to [doctest](https://github.com/onqtam/doctest)
|
173. [Camille Bégué](https://github.com/cbegue) fixed an issue in the conversion from `std::pair` and `std::tuple` to `json`.
|
||||||
174. [Juncheng E](https://github.com/ejcjason) fixed a typo.
|
174. [Anthony VH](https://github.com/AnthonyVH) fixed a compile error in an enum deserialization.
|
||||||
175. [tete17](https://github.com/tete17) fixed a bug in the `contains` function.
|
175. [Yuriy Vountesmery](https://github.com/ua-code-dragon) noted a subtle bug in a preprocessor check.
|
||||||
176. [Xav83](https://github.com/Xav83) fixed some cppcheck warnings.
|
176. [Chen](https://github.com/dota17) fixed numerous issues in the library.
|
||||||
177. [0xflotus](https://github.com/0xflotus) fixed some typos.
|
177. [Antony Kellermann](https://github.com/aokellermann) added a CI step for GCC 10.1.
|
||||||
178. [Christian Deneke](https://github.com/chris0x44) added a const version of `json_pointer::back`.
|
178. [Alex](https://github.com/gistrec) fixed an MSVC warning.
|
||||||
179. [Julien Hamaide](https://github.com/crazyjul) made the `items()` function work with custom string types.
|
179. [Rainer](https://github.com/rvjr) proposed an improvement in the floating-point serialization in CBOR.
|
||||||
180. [Evan Nemerson](https://github.com/nemequ) updated fixed a bug in Hedley and updated this library accordingly.
|
180. [Francois Chabot](https://github.com/FrancoisChabot) made performance improvements in the input adapters.
|
||||||
181. [Florian Pigorsch](https://github.com/flopp) fixed a lot of typos.
|
181. [Arthur Sonzogni](https://github.com/ArthurSonzogni) documented how the library can be included via `FetchContent`.
|
||||||
182. [Camille Bégué](https://github.com/cbegue) fixed an issue in the conversion from `std::pair` and `std::tuple` to `json`.
|
182. [Rimas Misevičius](https://github.com/rmisev) fixed an error message.
|
||||||
183. [Anthony VH](https://github.com/AnthonyVH) fixed a compile error in an enum deserialization.
|
183. [Alexander Myasnikov](https://github.com/alexandermyasnikov) fixed some examples and a link in the README.
|
||||||
184. [Yuriy Vountesmery](https://github.com/ua-code-dragon) noted a subtle bug in a preprocessor check.
|
184. [Hubert Chathi](https://github.com/uhoreg) made CMake's version config file architecture-independent.
|
||||||
185. [Chen](https://github.com/dota17) fixed numerous issues in the library.
|
185. [OmnipotentEntity](https://github.com/OmnipotentEntity) implemented the binary values for CBOR, MessagePack, BSON, and UBJSON.
|
||||||
186. [Antony Kellermann](https://github.com/aokellermann) added a CI step for GCC 10.1.
|
186. [ArtemSarmini](https://github.com/ArtemSarmini) fixed a compilation issue with GCC 10 and fixed a leak.
|
||||||
187. [Alex](https://github.com/gistrec) fixed an MSVC warning.
|
187. [Evgenii Sopov](https://github.com/sea5kg) integrated the library to the wsjcpp package manager.
|
||||||
188. [Rainer](https://github.com/rvjr) proposed an improvement in the floating-point serialization in CBOR.
|
188. [Sergey Linev](https://github.com/linev) fixed a compiler warning.
|
||||||
189. [Francois Chabot](https://github.com/FrancoisChabot) made performance improvements in the input adapters.
|
189. [Miguel Magalhães](https://github.com/magamig) fixed the year in the copyright.
|
||||||
190. [Arthur Sonzogni](https://github.com/ArthurSonzogni) documented how the library can be included via `FetchContent`.
|
190. [Alexander “weej” Jones](https://github.com/alex-weej) fixed an example in the README.
|
||||||
191. [Rimas Misevičius](https://github.com/rmisev) fixed an error message.
|
191. [Antoine Cœur](https://github.com/Coeur) fixed some typos in the documentation.
|
||||||
192. [Alexander Myasnikov](https://github.com/alexandermyasnikov) fixed some examples and a link in the README.
|
192. [jothepro](https://github.com/jothepro) updated links to the Hunter package.
|
||||||
193. [Hubert Chathi](https://github.com/uhoreg) made CMake's version config file architecture-independent.
|
193. [Dave Lee](https://github.com/kastiglione) fixed a link in the README.
|
||||||
194. [OmnipotentEntity](https://github.com/OmnipotentEntity) implemented the binary values for CBOR, MessagePack, BSON, and UBJSON.
|
194. [Joël Lamotte](https://github.com/Klaim) added instruction for using Build2's package manager.
|
||||||
195. [ArtemSarmini](https://github.com/ArtemSarmini) fixed a compilation issue with GCC 10 and fixed a leak.
|
195. [Paul Jurczak](https://github.com/pauljurczak) fixed an example in the README.
|
||||||
196. [Evgenii Sopov](https://github.com/sea5kg) integrated the library to the wsjcpp package manager.
|
196. [Carlos Gomes Martinho](https://github.com/gocarlos) updated the Conan package source.
|
||||||
197. [Sergey Linev](https://github.com/linev) fixed a compiler warning.
|
197. [Tridacnid](https://github.com/Tridacnid) improved the CMake tests.
|
||||||
198. [Miguel Magalhães](https://github.com/magamig) fixed the year in the copyright.
|
198. [Michael](https://github.com/MBalszun) fixed MSVC warnings.
|
||||||
199. [Gareth Sylvester-Bradley](https://github.com/garethsb-sony) fixed a compilation issue with MSVC.
|
199. [Quentin Barbarat](https://github.com/quentin-dev) fixed an example in the documentation.
|
||||||
200. [Alexander “weej” Jones](https://github.com/alex-weej) fixed an example in the README.
|
200. [XyFreak](https://github.com/XyFreak) fixed a compiler warning.
|
||||||
201. [Antoine Cœur](https://github.com/Coeur) fixed some typos in the documentation.
|
201. [TotalCaesar659](https://github.com/TotalCaesar659) fixed links in the README and updated the links in the documentation to use HTTPS.
|
||||||
202. [jothepro](https://github.com/jothepro) updated links to the Hunter package.
|
202. [Tanuj Garg](https://github.com/tanuj208) improved the fuzzer coverage for UBSAN input.
|
||||||
203. [Dave Lee](https://github.com/kastiglione) fixed a link in the README.
|
203. [AODQ](https://github.com/AODQ) fixed a compiler warning.
|
||||||
204. [Joël Lamotte](https://github.com/Klaim) added instruction for using Build2's package manager.
|
204. [jwittbrodt](https://github.com/jwittbrodt) made `NLOHMANN_DEFINE_TYPE_NON_INTRUSIVE` inline.
|
||||||
205. [Paul Jurczak](https://github.com/pauljurczak) fixed an example in the README.
|
205. [pfeatherstone](https://github.com/pfeatherstone) improved the upper bound of arguments of the `NLOHMANN_DEFINE_TYPE_NON_INTRUSIVE`/`NLOHMANN_DEFINE_TYPE_INTRUSIVE` macros.
|
||||||
206. [Sonu Lohani](https://github.com/sonulohani) fixed a warning.
|
206. [Jan Procházka](https://github.com/jprochazk) fixed a bug in the CBOR parser for binary and string values.
|
||||||
207. [Carlos Gomes Martinho](https://github.com/gocarlos) updated the Conan package source.
|
207. [T0b1-iOS](https://github.com/T0b1-iOS) fixed a bug in the new hash implementation.
|
||||||
208. [Konstantin Podsvirov](https://github.com/podsvirov) fixed the MSYS2 package documentation.
|
208. [Matthew Bauer](https://github.com/matthewbauer) adjusted the CBOR writer to create tags for binary subtypes.
|
||||||
209. [Tridacnid](https://github.com/Tridacnid) improved the CMake tests.
|
209. [gatopeich](https://github.com/gatopeich) implemented an ordered map container for `nlohmann::ordered_json`.
|
||||||
210. [Michael](https://github.com/MBalszun) fixed MSVC warnings.
|
210. [Érico Nogueira Rolim](https://github.com/ericonr) added support for pkg-config.
|
||||||
211. [Quentin Barbarat](https://github.com/quentin-dev) fixed an example in the documentation.
|
211. [KonanM](https://github.com/KonanM) proposed an implementation for the `NLOHMANN_DEFINE_TYPE_NON_INTRUSIVE`/`NLOHMANN_DEFINE_TYPE_INTRUSIVE` macros.
|
||||||
212. [XyFreak](https://github.com/XyFreak) fixed a compiler warning.
|
212. [Guillaume Racicot](https://github.com/gracicot) implemented `string_view` support and allowed C++20 support.
|
||||||
213. [TotalCaesar659](https://github.com/TotalCaesar659) fixed links in the README.
|
213. [Alex Reinking](https://github.com/alexreinking) improved CMake support for `FetchContent`.
|
||||||
214. [Tanuj Garg](https://github.com/tanuj208) improved the fuzzer coverage for UBSAN input.
|
214. [Hannes Domani](https://github.com/ssbssa) provided a GDB pretty printer.
|
||||||
215. [AODQ](https://github.com/AODQ) fixed a compiler warning.
|
215. Lars Wirzenius reviewed the README file.
|
||||||
216. [jwittbrodt](https://github.com/jwittbrodt) made `NLOHMANN_DEFINE_TYPE_NON_INTRUSIVE` inline.
|
216. [Jun Jie](https://github.com/ongjunjie) fixed a compiler path in the CMake scripts.
|
||||||
217. [pfeatherstone](https://github.com/pfeatherstone) improved the upper bound of arguments of the `NLOHMANN_DEFINE_TYPE_NON_INTRUSIVE`/`NLOHMANN_DEFINE_TYPE_INTRUSIVE` macros.
|
217. [Ronak Buch](https://github.com/rbuch) fixed typos in the documentation.
|
||||||
218. [Jan Procházka](https://github.com/jprochazk) fixed a bug in the CBOR parser for binary and string values.
|
218. [Alexander Karzhenkov](https://github.com/karzhenkov) fixed a move constructor and the Travis builds.
|
||||||
219. [T0b1-iOS](https://github.com/T0b1-iOS) fixed a bug in the new hash implementation.
|
219. [Leonardo Lima](https://github.com/leozz37) added CPM.Cmake support.
|
||||||
220. [Matthew Bauer](https://github.com/matthewbauer) adjusted the CBOR writer to create tags for binary subtypes.
|
220. [Joseph Blackman](https://github.com/jbzdarkid) fixed a warning.
|
||||||
221. [gatopeich](https://github.com/gatopeich) implemented an ordered map container for `nlohmann::ordered_json`.
|
221. [Yaroslav](https://github.com/YarikTH) updated doctest and implemented unit tests.
|
||||||
222. [Érico Nogueira Rolim](https://github.com/ericonr) added support for pkg-config.
|
222. [Martin Stump](https://github.com/globberwops) fixed a bug in the CMake files.
|
||||||
223. [KonanM](https://github.com/KonanM) proposed an implementation for the `NLOHMANN_DEFINE_TYPE_NON_INTRUSIVE`/`NLOHMANN_DEFINE_TYPE_INTRUSIVE` macros.
|
223. [Jaakko Moisio](https://github.com/jasujm) fixed a bug in the input adapters.
|
||||||
224. [Guillaume Racicot](https://github.com/gracicot) implemented `string_view` support and allowed C++20 support.
|
224. [bl-ue](https://github.com/bl-ue) fixed some Markdown issues in the README file.
|
||||||
225. [Alex Reinking](https://github.com/alexreinking) improved CMake support for `FetchContent`.
|
225. [William A. Wieselquist](https://github.com/wawiesel) fixed an example from the README.
|
||||||
226. [Hannes Domani](https://github.com/ssbssa) provided a GDB pretty printer.
|
226. [abbaswasim](https://github.com/abbaswasim) fixed an example from the README.
|
||||||
227. Lars Wirzenius reviewed the README file.
|
227. [Remy Jette](https://github.com/remyjette) fixed a warning.
|
||||||
228. [Jun Jie](https://github.com/ongjunjie) fixed a compiler path in the CMake scripts.
|
228. [Fraser](https://github.com/frasermarlow) fixed the documentation.
|
||||||
229. [Ronak Buch](https://github.com/rbuch) fixed typos in the documentation.
|
229. [Ben Beasley](https://github.com/musicinmybrain) updated doctest.
|
||||||
230. [Alexander Karzhenkov](https://github.com/karzhenkov) fixed a move constructor and the Travis builds.
|
230. [Doron Behar](https://github.com/doronbehar) fixed pkg-config.pc.
|
||||||
231. [Leonardo Lima](https://github.com/leozz37) added CPM.Cmake support.
|
231. [raduteo](https://github.com/raduteo) fixed a warning.
|
||||||
232. [Joseph Blackman](https://github.com/jbzdarkid) fixed a warning.
|
232. [David Pfahler](https://github.com/theShmoo) added the possibility to compile the library without I/O support.
|
||||||
233. [Yaroslav](https://github.com/YarikTH) updated doctest and implemented unit tests.
|
233. [Morten Fyhn Amundsen](https://github.com/mortenfyhn) fixed a typo.
|
||||||
234. [Martin Stump](https://github.com/globberwops) fixed a bug in the CMake files.
|
234. [jpl-mac](https://github.com/jpl-mac) allowed treating the library as a system header in CMake.
|
||||||
235. [Jaakko Moisio](https://github.com/jasujm) fixed a bug in the input adapters.
|
235. [Jason Dsouza](https://github.com/jasmcaus) fixed the indentation of the CMake file.
|
||||||
236. [bl-ue](https://github.com/bl-ue) fixed some Markdown issues in the README file.
|
236. [offa](https://github.com/offa) added a link to Conan Center to the documentation.
|
||||||
237. [William A. Wieselquist](https://github.com/wawiesel) fixed an example from the README.
|
237. [Rafail Giavrimis](https://github.com/grafail) fixed the Google Benchmark default branch.
|
||||||
238. [abbaswasim](https://github.com/abbaswasim) fixed an example from the README.
|
238. [Louis Dionne](https://github.com/ldionne) fixed a conversion operator.
|
||||||
239. [Remy Jette](https://github.com/remyjette) fixed a warning.
|
239. [justanotheranonymoususer](https://github.com/justanotheranonymoususer) made the examples in the README more consistent.
|
||||||
240. [Fraser](https://github.com/frasermarlow) fixed the documentation.
|
240. [Finkman](https://github.com/Finkman) suppressed some `-Wfloat-equal` warnings and fixed the debug pretty-printer.
|
||||||
241. [Ben Beasley](https://github.com/musicinmybrain) updated doctest.
|
241. [Ferry Huberts](https://github.com/fhuberts) fixed `-Wswitch-enum` warnings and fixed a typo.
|
||||||
242. [Doron Behar](https://github.com/doronbehar) fixed pkg-config.pc.
|
242. [Arseniy Terekhin](https://github.com/senyai) made the GDB pretty-printer robust against unset variable names.
|
||||||
243. [raduteo](https://github.com/raduteo) fixed a warning.
|
243. [Amir Masoud Abdol](https://github.com/amirmasoudabdol) updated the Homebrew command as nlohmann/json is now in homebrew-core.
|
||||||
244. [David Pfahler](https://github.com/theShmoo) added the possibility to compile the library without I/O support.
|
244. [Hallot](https://github.com/Hallot) fixed some `-Wextra-semi-stmt warnings`.
|
||||||
245. [Morten Fyhn Amundsen](https://github.com/mortenfyhn) fixed a typo.
|
245. [Giovanni Cerretani](https://github.com/gcerretani) fixed `-Wunused` warnings on `JSON_DIAGNOSTICS` and fixed a check for `std::filesystem`.
|
||||||
246. [jpl-mac](https://github.com/jpl-mac) allowed treating the library as a system header in CMake.
|
246. [Bogdan Popescu](https://github.com/Kapeli) hosts the [docset](https://github.com/Kapeli/Dash-User-Contributions/tree/master/docsets/JSON_for_Modern_C%2B%2B) for offline documentation viewers.
|
||||||
247. [Jason Dsouza](https://github.com/jasmcaus) fixed the indentation of the CMake file.
|
247. [Carl Smedstad](https://github.com/carlsmedstad) fixed an assertion error when using `JSON_DIAGNOSTICS`.
|
||||||
248. [offa](https://github.com/offa) added a link to Conan Center to the documentation.
|
248. [miikka75](https://github.com/miikka75) provided an important fix to compile C++17 code with Clang 9.
|
||||||
249. [TotalCaesar659](https://github.com/TotalCaesar659) updated the links in the documentation to use HTTPS.
|
249. [Maarten Becker](https://github.com/kernie) fixed a warning for shadowed variables.
|
||||||
250. [Rafail Giavrimis](https://github.com/grafail) fixed the Google Benchmark default branch.
|
250. [Cristi Vîjdea](https://github.com/axnsan12) fixed typos in the `operator[]` documentation.
|
||||||
251. [Louis Dionne](https://github.com/ldionne) fixed a conversion operator.
|
251. [Alex Beregszaszi](https://github.com/axic) fixed spelling mistakes in comments.
|
||||||
252. [justanotheranonymoususer](https://github.com/justanotheranonymoususer) made the examples in the README more consistent.
|
252. [Dirk Stolle](https://github.com/striezel) fixed typos in the documentation.
|
||||||
253. [Finkman](https://github.com/Finkman) suppressed some `-Wfloat-equal` warnings.
|
253. [Daniel Albuschat](https://github.com/daniel-kun) corrected the parameter name in the `parse` documentation.
|
||||||
254. [Ferry Huberts](https://github.com/fhuberts) fixed `-Wswitch-enum` warnings.
|
254. [Prince Mendiratta](https://github.com/Prince-Mendiratta) fixed a link to the FAQ.
|
||||||
255. [Arseniy Terekhin](https://github.com/senyai) made the GDB pretty-printer robust against unset variable names.
|
255. [Florian Albrechtskirchinger](https://github.com/falbrechtskirchinger) implemented `std::string_view` support for object keys and made dozens of other improvements.
|
||||||
256. [Amir Masoud Abdol](https://github.com/amirmasoudabdol) updated the Homebrew command as nlohmann/json is now in homebrew-core.
|
256. [Qianqian Fang](https://github.com/fangq) implemented the Binary JData (BJData) format.
|
||||||
257. [Hallot](https://github.com/Hallot) fixed some `-Wextra-semi-stmt warnings`.
|
257. [pketelsen](https://github.com/pketelsen) added macros `NLOHMANN_DEFINE_TYPE_INTRUSIVE_WITH_DEFAULT` and `NLOHMANN_DEFINE_TYPE_NON_INTRUSIVE_WITH_DEFAULT`.
|
||||||
258. [Giovanni Cerretani](https://github.com/gcerretani) fixed `-Wunused` warnings on `JSON_DIAGNOSTICS`.
|
258. [DarkZeros](https://github.com/DarkZeros) adjusted to code to not clash with Arduino defines.
|
||||||
259. [Bogdan Popescu](https://github.com/Kapeli) hosts the [docset](https://github.com/Kapeli/Dash-User-Contributions/tree/master/docsets/JSON_for_Modern_C%2B%2B) for offline documentation viewers.
|
259. [flagarde](https://github.com/flagarde) fixed the output of `meta()` for MSVC.
|
||||||
260. [Carl Smedstad](https://github.com/carlsmedstad) fixed an assertion error when using `JSON_DIAGNOSTICS`.
|
260. [Dimitris Apostolou](https://github.com/rex4539) fixed a typo.
|
||||||
261. [miikka75](https://github.com/miikka75) provided an important fix to compile C++17 code with Clang 9.
|
261. [Michael Nosthoff](https://github.com/heinemml) fixed a typo.
|
||||||
262. [Maarten Becker](https://github.com/kernie) fixed a warning for shadowed variables.
|
262. [JungHoon Lee](https://github.com/jhnlee) fixed a typo.
|
||||||
263. [Cristi Vîjdea](https://github.com/axnsan12) fixed typos in the `operator[]` documentation.
|
263. [Faruk D.](https://github.com/fdiblen) fixed the CITATION.CFF file.
|
||||||
264. [Alex Beregszaszi](https://github.com/axic) fixed spelling mistakes in comments.
|
264. [Andrea Cocito](https://github.com/puffetto) added a clarification on macro usage to the documentation.
|
||||||
265. [Dirk Stolle](https://github.com/striezel) fixed typos in documentation.
|
265. [Krzysiek Karbowiak](https://github.com/kkarbowiak) refactored the tests to use `CHECK_THROWS_WITH_AS`.
|
||||||
266. [Daniel Albuschat](https://github.com/daniel-kun) corrected the parameter name in the `parse` documentation.
|
266. [Chaoqi Zhang](https://github.com/prncoprs) fixed a typo.
|
||||||
267. [Prince Mendiratta](https://github.com/Prince-Mendiratta) fixed a link to the FAQ.
|
267. [ivanovmp](https://github.com/ivanovmp) fixed a whitespace error.
|
||||||
268. [Florian Albrechtskirchinger](https://github.com/falbrechtskirchinger) implemented `std::string_view` support for object keys and made dozens of other improvements.
|
268. [KsaNL](https://github.com/KsaNL) fixed a build error when including `<windows.h>`.
|
||||||
269. [Qianqian Fang](https://github.com/fangq) implemented the Binary JData (BJData) format.
|
269. [Andrea Pappacoda](https://github.com/Tachi107) moved `.pc` and `.cmake` files to `share` directory.
|
||||||
270. [pketelsen](https://github.com/pketelsen) added macros `NLOHMANN_DEFINE_TYPE_INTRUSIVE_WITH_DEFAULT` and `NLOHMANN_DEFINE_TYPE_NON_INTRUSIVE_WITH_DEFAULT`.
|
270. [Wolf Vollprecht](https://github.com/wolfv) added the `patch_inplace` function.
|
||||||
271. [DarkZeros](https://github.com/DarkZeros) adjusted to code to not clash with Arduino defines.
|
271. [Jake Zimmerman](https://github.com/jez) highlighted common usage patterns in the README file.
|
||||||
272. [flagarde](https://github.com/flagarde) fixed the output of `meta()` for MSVC.
|
272. [NN](https://github.com/NN---) added the Visual Studio output directory to `.gitignore`.
|
||||||
273. [Giovanni Cerretani](https://github.com/gcerretani) fixed a check for `std::filesystem`.
|
273. [Romain Reignier](https://github.com/romainreignier) improved the performance of the vector output adapter.
|
||||||
274. [Dimitris Apostolou](https://github.com/rex4539) fixed a typo.
|
274. [Mike](https://github.com/Mike-Leo-Smith) fixed the `std::iterator_traits`.
|
||||||
275. [Ferry Huberts](https://github.com/fhuberts) fixed a typo.
|
275. [Richard Hozák](https://github.com/richardhozak) added macro `JSON_NO_ENUM` to disable default enum conversions.
|
||||||
276. [Michael Nosthoff](https://github.com/heinemml) fixed a typo.
|
276. [vakokako](https://github.com/vakokako) fixed tests when compiling with C++20.
|
||||||
277. [JungHoon Lee](https://github.com/jhnlee) fixed a typo.
|
277. [Alexander “weej” Jones](https://github.com/alexweej) fixed an example in the README.
|
||||||
278. [Faruk D.](https://github.com/fdiblen) fixed the CITATION.CFF file.
|
278. [Eli Schwartz](https://github.com/eli-schwartz) added more files to the `include.zip` archive.
|
||||||
279. [Andrea Cocito](https://github.com/puffetto) added a clarification on macro usage to the documentation.
|
279. [Kevin Lu](https://github.com/kevinlul) fixed a compilation issue when typedefs with certain names were present.
|
||||||
280. [Krzysiek Karbowiak](https://github.com/kkarbowiak) refactored the tests to use `CHECK_THROWS_WITH_AS`.
|
280. [Trevor Hickey](https://github.com/luxe) improved the description of an example.
|
||||||
281. [Chaoqi Zhang](https://github.com/prncoprs) fixed a typo.
|
281. [Jef LeCompte](https://github.com/jef) updated the year in the README file.
|
||||||
282. [ivanovmp](https://github.com/ivanovmp) fixed a whitespace error.
|
282. [Alexandre Hamez](https://github.com/ahamez) fixed a warning.
|
||||||
283. [KsaNL](https://github.com/KsaNL) fixed a build error when including `<windows.h>`.
|
283. [Maninderpal Badhan](https://github.com/mbadhan) fixed a typo.
|
||||||
284. [Andrea Pappacoda](https://github.com/Tachi107) moved `.pc` and `.cmake` files to `share` directory.
|
284. [kevin--](https://github.com/kevin--) added a note to an example in the README file.
|
||||||
285. [Wolf Vollprecht](https://github.com/wolfv) added the `patch_inplace` function.
|
285. [I](https://github.com/wx257osn2) fixed a typo.
|
||||||
286. [Jake Zimmerman](https://github.com/jez) highlighted common usage patterns in the README file.
|
286. [Gregorio Litenstein](https://github.com/Lord-Kamina) fixed the Clang detection.
|
||||||
287. [NN](https://github.com/NN---) added the Visual Studio output directory to `.gitignore`.
|
287. [Andreas Smas](https://github.com/andoma) added a Doozer badge.
|
||||||
288. [Romain Reignier](https://github.com/romainreignier) improved the performance of the vector output adapter.
|
288. [WanCW](https://github.com/wancw) fixed the string conversion with Clang.
|
||||||
289. [Mike](https://github.com/Mike-Leo-Smith) fixed the `std::iterator_traits`.
|
289. [zhaohuaxishi](https://github.com/zhaohuaxishi) fixed a Doxygen error.
|
||||||
290. [Richard Hozák](https://github.com/richardhozak) added macro `JSON_NO_ENUM` to disable default enum conversions.
|
290. [emvivre](https://github.com/emvivre) removed an invalid parameter from CMake.
|
||||||
291. [vakokako](https://github.com/vakokako) fixed tests when compiling with C++20.
|
291. [Tobias Hermann](https://github.com/Dobiasd) fixed a link in the README file.
|
||||||
292. [Alexander “weej” Jones](https://github.com/alexweej) fixed an example in the README.
|
292. [Michael](https://github.com/traits) fixed a warning.
|
||||||
293. [Eli Schwartz](https://github.com/eli-schwartz) added more files to the `include.zip` archive.
|
293. [Ryan Mulder](https://github.com/ryanjmulder) added `ensure_ascii` to the `dump` function.
|
||||||
294. [Kevin Lu](https://github.com/kevinlul) fixed a compilation issue when typedefs with certain names were present.
|
294. [Muri Nicanor](https://github.com/murinicanor) fixed the `sed` discovery in the Makefile.
|
||||||
295. [Trevor Hickey](https://github.com/luxe) improved the description of an example.
|
295. [David Avedissian](https://github.com/dgavedissian) implemented SFINAE-friendly `iterator_traits`.
|
||||||
296. [Jef LeCompte](https://github.com/jef) updated the year in the README file.
|
296. [AQNOUCH Mohammed](https://github.com/aqnouch) fixed a typo in the README.
|
||||||
297. [Alexandre Hamez](https://github.com/ahamez) fixed a warning.
|
297. [Gareth Sylvester-Bradley](https://github.com/garethsb) added `operator/=` and `operator/` to construct JSON pointers.
|
||||||
298. [Maninderpal Badhan](https://github.com/mbadhan) fixed a typo.
|
298. [Michael Macnair](https://github.com/mykter) added support for afl-fuzz testing.
|
||||||
299. [kevin--](https://github.com/kevin--) added a note to an example in the README file.
|
299. [Berkus Decker](https://github.com/berkus) fixed a typo in the README.
|
||||||
300. [I](https://github.com/wx257osn2) fixed a typo.
|
300. [Illia Polishchuk](https://github.com/ilqvya) improved the CMake testing.
|
||||||
301. [Gregorio Litenstein](https://github.com/Lord-Kamina) fixed the Clang detection.
|
301. [Ikko Ashimine](https://github.com/eltociear) fixed two typos.
|
||||||
302. [Andreas Smas](https://github.com/andoma) added a Doozer badge.
|
302. [Raphael Grimm](https://github.com/barcode) added the possibility to define a custom base class.
|
||||||
303. [WanCW](https://github.com/wancw) fixed the string conversion with Clang.
|
303. [tocic](https://github.com/tocic) fixed typos in the documentation.
|
||||||
304. [zhaohuaxishi](https://github.com/zhaohuaxishi) fixed a Doxygen error.
|
304. [Vertexwahn](https://github.com/Vertexwahn) added Bazel build support.
|
||||||
305. [emvivre](https://github.com/emvivre) removed an invalid parameter from CMake.
|
305. [DavidKorczynski](https://github.com/DavidKorczynski) added a CIFuzz CI GitHub action.
|
||||||
306. [Tobias Hermann](https://github.com/Dobiasd) fixed a link in the README file.
|
306. [Florian Segginger](https://github.com/floriansegginger) bumped the years in the README.
|
||||||
307. [Michael](https://github.com/traits) fixed a warning.
|
307. [haadfida](https://github.com/haadfida) cleaned up the badges of used services.
|
||||||
308. [Ryan Mulder](https://github.com/ryanjmulder) added `ensure_ascii` to the `dump` function.
|
308. [Arsen Arsenović](https://github.com/ArsenArsen) fixed a build error.
|
||||||
309. [Muri Nicanor](https://github.com/murinicanor) fixed the `sed` discovery in the Makefile.
|
309. [theevilone45](https://github.com/theevilone45) fixed a typo in a CMake file.
|
||||||
310. [David Avedissian](https://github.com/dgavedissian) implemented SFINAE-friendly `iterator_traits`.
|
310. [Sergei Trofimovich](https://github.com/trofi) fixed the custom allocator support.
|
||||||
311. [AQNOUCH Mohammed](https://github.com/aqnouch) fixed a typo in the README.
|
311. [Joyce](https://github.com/joycebrum) fixed some security issues in the GitHub workflows.
|
||||||
312. [Gareth Sylvester-Bradley](https://github.com/garethsb) added `operator/=` and `operator/` to construct JSON pointers.
|
312. [Nicolas Jakob](https://github.com/njakob) add vcpkg version badge.
|
||||||
313. [Michael Macnair](https://github.com/mykter) added support for afl-fuzz testing.
|
313. [Tomerkm](https://github.com/Tomerkm) added tests.
|
||||||
314. [Berkus Decker](https://github.com/berkus) fixed a typo in the README.
|
314. [No.](https://github.com/tusooa) fixed the use of `get<>` calls.
|
||||||
315. [Illia Polishchuk](https://github.com/ilqvya) improved the CMake testing.
|
315. [taro](https://github.com/tarolling) fixed a typo in the `CODEOWNERS` file.
|
||||||
316. [Ikko Ashimine](https://github.com/eltociear) fixed a typo.
|
316. [Felix Yan](https://github.com/felixonmars) fixed a typo in the README.
|
||||||
317. [Raphael Grimm](https://github.com/barcode) added the possibility to define a custom base class.
|
317. [HO-COOH](https://github.com/HO-COOH) fixed a parenthesis in the documentation.
|
||||||
318. [tocic](https://github.com/tocic) fixed typos in the documentation.
|
318. [miny1233](https://github.com/miny1233) fixed a parenthesis in the documentation.
|
||||||
319. [Vertexwahn](https://github.com/Vertexwahn) added Bazel build support.
|
319. [tomalakgeretkal](https://github.com/tomalakgeretkal) fixed a compilation error.
|
||||||
320. [Dirk Stolle](https://github.com/striezel) fixed typos in the documentation.
|
320. [alferov](https://github.com/ALF-ONE) fixed a compilation error and fixed a version in the documentation.
|
||||||
321. [DavidKorczynski](https://github.com/DavidKorczynski) added a CIFuzz CI GitHub action.
|
321. [Craig Scott](https://github.com/craigscott-crascit) fixed a deprecation warning in CMake.
|
||||||
322. [Finkman](https://github.com/Finkman) fixed the debug pretty-printer.
|
322. [Vyacheslav Zhdanovskiy](https://github.com/ZeronSix) added macros for serialization-only types.
|
||||||
323. [Florian Segginger](https://github.com/floriansegginger) bumped the years in the README.
|
323. [Mathieu Westphal](https://github.com/mwestphal) fixed typos.
|
||||||
324. [haadfida](https://github.com/haadfida) cleaned up the badges of used services.
|
324. [scribam](https://github.com/scribam) fixed the MinGW workflow.
|
||||||
325. [Arsen Arsenović](https://github.com/ArsenArsen) fixed a build error.
|
325. [Aleksei Sapitskii](https://github.com/aleksproger) added support for Apple's Swift Package Manager.
|
||||||
326. [theevilone45](https://github.com/theevilone45) fixed a typo in a CMake file.
|
326. [Benjamin Buch](https://github.com/bebuch) fixed the installation path in CMake.
|
||||||
327. [Sergei Trofimovich](https://github.com/trofi) fixed the custom allocator support.
|
327. [Colby Haskell](https://github.com/colbychaskell) clarified the parse error message in case a file cannot be opened.
|
||||||
328. [Joyce](https://github.com/joycebrum) fixed some security issues in the GitHub workflows.
|
328. [Juan Carlos Arevalo Baeza](https://github.com/TheJCAB) fixed the enum conversion.
|
||||||
329. [Nicolas Jakob](https://github.com/njakob) add vcpkg version badge.
|
329. [ss](https://github.com/serge-s) fixed the amalgamation call.
|
||||||
330. [Tomerkm](https://github.com/Tomerkm) added tests.
|
330. [AniketDhemare](https://github.com/AniketDhemare) fixed a version in the documentation.
|
||||||
331. [No.](https://github.com/tusooa) fixed the use of `get<>` calls.
|
331. [Philip Müller](https://github.com/philip-paul-mueller) fixed an example.
|
||||||
332. [taro](https://github.com/tarolling) fixed a typo in the `CODEOWNERS` file.
|
332. [Leila Shcheglova](https://github.com/LeilaShcheglova) fixed a warning in a test.
|
||||||
333. [Ikko Eltociear Ashimine](https://github.com/eltociear) fixed a typo.
|
333. [Alex Prabhat Bara](https://github.com/alexprabhat99) fixed a function name in the documentation.
|
||||||
334. [Felix Yan](https://github.com/felixonmars) fixed a typo in the README.
|
334. [laterlaugh](https://github.com/laterlaugh) fixed some typos.
|
||||||
335. [HO-COOH](https://github.com/HO-COOH) fixed a parenthesis in the documentation.
|
335. [Yuanhao Jia](https://github.com/MrJia1997) fixed the GDB pretty printer.
|
||||||
336. [Ivor Wanders](https://github.com/iwanders) fixed the examples to catch exception by `const&`.
|
336. [Fallen_Breath](https://github.com/Fallen-Breath) fixed an example for JSON Pointer.
|
||||||
337. [miny1233](https://github.com/miny1233) fixed a parenthesis in the documentation.
|
337. [Nikhil Idiculla](https://github.com/tsnl) fixed some typos.
|
||||||
338. [tomalakgeretkal](https://github.com/tomalakgeretkal) fixed a compilation error.
|
338. [Griffin Myers](https://github.com/gmyers18) updated the Natvis file.
|
||||||
339. [alferov](https://github.com/ALF-ONE) fixed a compilation error.
|
339. [thetimr](https://github.com/thetimr) fixed a typo in the documentation.
|
||||||
340. [Craig Scott](https://github.com/craigscott-crascit) fixed a deprecation warning in CMake.
|
340. [Balazs Erseki](https://github.com/zerocukor287) fixed a URL in the contribution guidelines.
|
||||||
341. [Vyacheslav Zhdanovskiy](https://github.com/ZeronSix) added macros for serialization-only types.
|
341. [Niccolò Iardella](https://github.com/rotolof) added `NLOHMANN_DEFINE_DERIVED_TYPE_*` macros.
|
||||||
342. [Mathieu Westphal](https://github.com/mwestphal) fixed typos.
|
342. [Borislav Stanimirov](https://github.com/iboB) allowed overriding the CMake target name.
|
||||||
343. [scribam](https://github.com/scribam) fixed the MinGW workflow.
|
343. [Captain Crutches](https://github.com/captaincrutches) made `iterator_proxy_value` a `std::forward_iterator`.
|
||||||
344. [Aleksei Sapitskii](https://github.com/aleksproger) added support for Apple's Swift Package Manager.
|
344. [Fredrik Sandhei](https://github.com/fsandhei) added type conversion support for `std::optional`.
|
||||||
345. [Benjamin Buch](https://github.com/bebuch) fixed the installation path in CMake.
|
345. [jh96](https://github.com/jordan-hoang) added exceptions when `nullptr` is passed to `parse`.
|
||||||
346. [Colby Haskell](https://github.com/colbychaskell) clarified the parse error message in case a file cannot be opened.
|
346. [Stuart Gorman](https://github.com/StuartGorman) fixed number parsing when `EINTR` set in `errno`.
|
||||||
347. [Juan Carlos Arevalo Baeza](https://github.com/TheJCAB) fixed the enum conversion.
|
347. [Dylan Baker](https://github.com/dcbaker) generated a pkg-config file that follows the pkg-config conventions.
|
||||||
348. [alferov](https://github.com/ALF-ONE) fixed a version in the documentation.
|
348. [Tianyi Chen](https://github.com/TianyiChen) optimized the binary `get_number` implementation.
|
||||||
349. [ss](https://github.com/serge-s) fixed the amalgamation call.
|
349. [peng-wang-cn](https://github.com/peng-wang-cn) added type conversion support for multidimensional arrays.
|
||||||
350. [AniketDhemare](https://github.com/AniketDhemare) fixed a version in the documentation.
|
350. [Einars Netlis-Galejs](https://github.com/EinarsNG) added `ONLY_SERIALIZE` for `NLOHMANN_DEFINE_DERIVED_TYPE_*` macros.
|
||||||
351. [Philip Müller](https://github.com/philip-paul-mueller) fixed an example.
|
351. [Marcel](https://github.com/mering) removed `alwayslink=True` Bazel flag.
|
||||||
352. [Leila Shcheglova](https://github.com/LeilaShcheglova) fixed a warning in a test.
|
352. [Harinath Nampally](https://github.com/hnampally) added diagnostic positions to exceptions.
|
||||||
353. [Alex Prabhat Bara](https://github.com/alexprabhat99) fixed a function name in the documentation.
|
353. [Nissim Armand Ben Danan](https://github.com/NissimBendanan) fixed `NLOHMANN_DEFINE_TYPE_INTRUSIVE_WITH_DEFAULT` with an empty JSON instance.
|
||||||
354. [laterlaugh](https://github.com/laterlaugh) fixed some typos.
|
354. [Michael Valladolid](https://github.com/codenut) added support for BSON uint64 serialization/deserialization.
|
||||||
355. [Yuanhao Jia](https://github.com/MrJia1997) fixed the GDB pretty printer.
|
355. [Nikhil](https://github.com/nikhilreddydev) updated the documentation.
|
||||||
356. [Fallen_Breath](https://github.com/Fallen-Breath) fixed an example for JSON Pointer.
|
356. [Nebojša Cvetković](https://github.com/nebkat) added support for BJDATA optimized binary array type.
|
||||||
357. [Nikhil Idiculla](https://github.com/tsnl) fixed some typos.
|
357. [Sushrut Shringarputale](https://github.com/sushshring) added support for diagnostic positions.
|
||||||
358. [Griffin Myers](https://github.com/gmyers18) updated the Natvis file.
|
358. [kimci86](https://github.com/kimci86) templated to `NLOHMANN_DEFINE_TYPE` macros to also support `ordered_json`.
|
||||||
359. [thetimr](https://github.com/thetimr) fixed a typo in the documentation.
|
359. [Richard Topchii](https://github.com/richardtop) added support for VisionOS in the Swift Package Manager.
|
||||||
360. [Balazs Erseki](https://github.com/zerocukor287) fixed a URL in the contribution guidelines.
|
360. [Robert Chisholm](https://github.com/Robadob) fixed a typo.
|
||||||
361. [Niccolò Iardella](https://github.com/rotolof) added `NLOHMANN_DEFINE_DERIVED_TYPE_*` macros.
|
361. [zjyhjqs](https://github.com/zjyhjqs) added CPack support.
|
||||||
362. [Borislav Stanimirov](https://github.com/iboB) allowed overriding the CMake target name.
|
362. [bitFiedler](https://github.com/bitFiedler) made GDB pretty printer work with Python 3.8.
|
||||||
363. [Captain Crutches](https://github.com/captaincrutches) made `iterator_proxy_value` a `std::forward_iterator`.
|
363. [Gianfranco Costamagna](https://github.com/LocutusOfBorg) fixed a compiler warning.
|
||||||
364. [Fredrik Sandhei](https://github.com/fsandhei) added type conversion support for `std::optional`.
|
364. [risa2000](https://github.com/risa2000) made `std::filesystem::path` conversion to/from UTF-8 encoded string explicit.
|
||||||
365. [jh96](https://github.com/jordan-hoang) added exceptions when `nullptr` is passed to `parse`.
|
365. [AM](https://github.com/maqnouch) fixed typos in the README.
|
||||||
366. [Stuart Gorman](https://github.com/StuartGorman) fixed number parsing when `EINTR` set in `errno`.
|
366. [dmenendez-gruposantander](https://github.com/dmenendez-gruposantander) fixed typos in the comments of the examples.
|
||||||
367. [Dylan Baker](https://github.com/dcbaker) generated a pkg-config file that follows the pkg-config conventions.
|
367. [Mihai Stan](https://github.com/mstan-xx) fixed comparisons against the literal `0`.
|
||||||
368. [Tianyi Chen](https://github.com/TianyiChen) optimized the binary `get_number` implementation.
|
368. [Matt Gumbel](https://github.com/intelmatt) fixed some `-Weffc++` warnings.
|
||||||
369. [peng-wang-cn](https://github.com/peng-wang-cn) added type conversion support for multidimensional arrays.
|
369. [vimpunk](https://github.com/vimpunk) moved a lambda out of an unevaluated context to support older compilers.
|
||||||
370. [Einars Netlis-Galejs](https://github.com/EinarsNG) added `ONLY_SERIALIZE` for `NLOHMANN_DEFINE_DERIVED_TYPE_*` macros.
|
370. [Chris Harris](https://github.com/cjh1) fixed the compilation with GCC 4.8.
|
||||||
371. [Marcel](https://github.com/mering) removed `alwayslink=True` Bazel flag.
|
371. [Palmer Dabbelt](https://github.com/palmer-dabbelt) generated and installed a pkg-config file.
|
||||||
372. [Harinath Nampally](https://github.com/hnampally) added diagnostic positions to exceptions.
|
372. [Gus Pozuelo](https://github.com/ap-viavi) made `ordered_map` compatible with GCC 5.5, Clang 3.6, and Xcode 9.
|
||||||
373. [Nissim Armand Ben Danan](https://github.com/NissimBendanan) fixed `NLOHMANN_DEFINE_TYPE_INTRUSIVE_WITH_DEFAULT` with an empty JSON instance.
|
373. [AK](https://github.com/Lioncky) fixed an MSVC build error caused by the `min`/`max` macros from `windows.h`.
|
||||||
374. [Michael Valladolid](https://github.com/codenut) added support for BSON uint64 serialization/deserialization.
|
374. [Sergiu Deitsch](https://github.com/sergiud) provided a fallback for missing `char8_t` support.
|
||||||
375. [Nikhil](https://github.com/nikhilreddydev) updated the documentation.
|
375. [Xiaochuan Ye](https://github.com/XueSongTap) fixed `from_msgpack` for `std::byte` input by specializing `std::char_traits`.
|
||||||
376. [Nebojša Cvetković](https://github.com/nebkat) added support for BJDATA optimized binary array type.
|
376. [Ville Vesilehto](https://github.com/thevilledev) fixed an overflow in the BJData size calculation and rejected overflowing negative integers in CBOR.
|
||||||
377. [Sushrut Shringarputale](https://github.com/sushshring) added support for diagnostic positions.
|
377. [NmPassTHFan](https://github.com/nmpassthf) replaced the deprecated `std::is_trivial` for C++26.
|
||||||
378. [kimci86](https://github.com/kimci86) templated to `NLOHMANN_DEFINE_TYPE` macros to also support `ordered_json`.
|
378. [Chris Ever](https://github.com/chirsz-ever) added the `ignore_trailing_commas` parser option.
|
||||||
379. [Richard Topchii](https://github.com/richardtop) added support for VisionOS in the Swift Package Manager.
|
379. [Kuan-Fu Wu](https://github.com/kfwu1999) fixed the example code for `json_pointer` initialization.
|
||||||
380. [Robert Chisholm](https://github.com/Robadob) fixed a typo.
|
380. [David Kilzer](https://github.com/ddkilzer) added a missing header to the input adapters.
|
||||||
381. [zjyhjqs](https://github.com/zjyhjqs) added CPack support.
|
381. [Miko](https://github.com/mikomikotaishi) added proper C++20 module support, simplified the module API, and fixed missing exports.
|
||||||
382. [bitFiedler](https://github.com/bitFiedler) made GDB pretty printer work with Python 3.8.
|
382. [hitgirl](https://github.com/hitgil) fixed the CMake configuration when cross-compiling.
|
||||||
383. [Gianfranco Costamagna](https://github.com/LocutusOfBorg) fixed a compiler warning.
|
383. [Devon Thomas](https://github.com/ThomaDevOSU) mentioned the Artistic Style formatting in the contribution guidelines.
|
||||||
384. [risa2000](https://github.com/risa2000) made `std::filesystem::path` conversion to/from UTF-8 encoded string explicit.
|
384. [Erik Hu](https://github.com/Erikhu1) made Coveralls upload errors non-fatal in the CI.
|
||||||
385. [AM](https://github.com/maqnouch) fixed typos in the README.
|
385. [co63oc](https://github.com/co63oc) fixed typos.
|
||||||
386. [dmenendez-gruposantander](https://github.com/dmenendez-gruposantander) fixed typos in the comments of the examples.
|
386. [DmitriBogdanov](https://github.com/DmitriBogdanov) fixed broken package manager links in the documentation.
|
||||||
387. [Mihai Stan](https://github.com/mstan-xx) fixed comparisons against the literal `0`.
|
387. [Bander](https://github.com/banderzhm) improved the MSVC compatibility of the C++ modules.
|
||||||
388. [Matt Gumbel](https://github.com/intelmatt) fixed some `-Weffc++` warnings.
|
388. [Andy Choi](https://github.com/ccpong) removed an unnecessary `template` keyword before `get` in the README and the documentation.
|
||||||
389. [vimpunk](https://github.com/vimpunk) moved a lambda out of an unevaluated context to support older compilers.
|
389. [SamareshSingh](https://github.com/ssam18) fixed single-element brace initialization to copy/move instead of wrapping in an array, fixed the `WITH_DEFAULT` macros for `ordered_map`, and handled moved events in `serve_header.py`.
|
||||||
390. [Chris Harris](https://github.com/cjh1) fixed the compilation with GCC 4.8.
|
390. [Aditya](https://github.com/Lumowhisp) improved the documentation of the documentation generation.
|
||||||
391. [Palmer Dabbelt](https://github.com/palmer-dabbelt) generated and installed a pkg-config file.
|
391. [cheese1](https://github.com/cheese1) clarified the README.
|
||||||
392. [Gus Pozuelo](https://github.com/ap-viavi) made `ordered_map` compatible with GCC 5.5, Clang 3.6, and Xcode 9.
|
392. [KhloodElhossiny](https://github.com/khloodelhossiny) enabled `std::string_view` keys in `operator[]`.
|
||||||
393. [AK](https://github.com/Lioncky) fixed an MSVC build error caused by the `min`/`max` macros from `windows.h`.
|
393. [Charles Cabergs](https://github.com/cacharle) fixed a `-Wtautological-constant-out-of-range-compare` warning.
|
||||||
394. [Sergiu Deitsch](https://github.com/sergiud) provided a fallback for missing `char8_t` support.
|
394. [EALePain](https://github.com/EALePain) made the `std::tuple` conversion work with reference types such as `std::tie`.
|
||||||
395. [Xiaochuan Ye](https://github.com/XueSongTap) fixed `from_msgpack` for `std::byte` input by specializing `std::char_traits`.
|
395. [koala_oishi](https://github.com/chibi-dogs) fixed grammatical wording in the README.
|
||||||
396. [Ville Vesilehto](https://github.com/thevilledev) fixed an overflow in the BJData size calculation and rejected overflowing negative integers in CBOR.
|
396. [riccardoori11](https://github.com/riccardoori11) fixed a typo in the documentation.
|
||||||
397. [NmPassTHFan](https://github.com/nmpassthf) replaced the deprecated `std::is_trivial` for C++26.
|
397. [Swastik Bose](https://github.com/VasuBhakt) fixed the parent pointers after `update()` with `JSON_DIAGNOSTICS` and fixed the Doxygen autolinking of requirements.
|
||||||
398. [Chris Ever](https://github.com/chirsz-ever) added the `ignore_trailing_commas` parser option.
|
398. [trdesilva](https://github.com/trdesilva) added `front`, `pop_front`, and `push_front` to `json_pointer`.
|
||||||
399. [Kuan-Fu Wu](https://github.com/kfwu1999) fixed the example code for `json_pointer` initialization.
|
399. [Akhilesh Arora](https://github.com/akhilesharora) fixed an incomplete-type error with `ordered_json`.
|
||||||
400. [David Kilzer](https://github.com/ddkilzer) added a missing header to the input adapters.
|
400. [Hariom Phulre](https://github.com/hariomphulre) fixed the C++20 modules compilation with GCC.
|
||||||
401. [Miko](https://github.com/mikomikotaishi) added proper C++20 module support, simplified the module API, and fixed missing exports.
|
401. [Kirill Lokotkov](https://github.com/RUSLoker) fixed printing `long double` values.
|
||||||
402. [hitgirl](https://github.com/hitgil) fixed the CMake configuration when cross-compiling.
|
402. [George Sedov](https://github.com/radistmorse) added the `NLOHMANN_DEFINE_TYPE_*_WITH_NAMES` macros.
|
||||||
403. [Devon Thomas](https://github.com/ThomaDevOSU) mentioned the Artistic Style formatting in the contribution guidelines.
|
403. [Caillin Nugent](https://github.com/nugentcaillin) added the `NLOHMANN_JSON_SERIALIZE_ENUM_STRICT` macro.
|
||||||
404. [Erik Hu](https://github.com/Erikhu1) made Coveralls upload errors non-fatal in the CI.
|
404. [Cosmin D.](https://github.com/drcosmin) fixed `std::filesystem::path` conversions and added an MSVC workaround for `std::unique_ptr`.
|
||||||
405. [co63oc](https://github.com/co63oc) fixed typos.
|
405. [Paul Dreik](https://github.com/pauldreik) fixed a test relying on implementation-specific behavior.
|
||||||
406. [DmitriBogdanov](https://github.com/DmitriBogdanov) fixed broken package manager links in the documentation.
|
406. [Daniel Falk](https://github.com/daniel-falk) added missing copyright notices to the SBOM.
|
||||||
407. [Bander](https://github.com/banderzhm) improved the MSVC compatibility of the C++ modules.
|
407. [Federico Sfriso](https://github.com/federicosfriso05-dotcom) added support for constructing JSON values from C++20 range views.
|
||||||
408. [Andy Choi](https://github.com/ccpong) removed an unnecessary `template` keyword before `get` in the README and the documentation.
|
408. [Luke Banicevic](https://github.com/banaboi) fixed corrupt BSON output for lengths exceeding `INT32_MAX`, cleaned up the BSON writer, and improved the documentation.
|
||||||
409. [SamareshSingh](https://github.com/ssam18) fixed single-element brace initialization to copy/move instead of wrapping in an array, fixed the `WITH_DEFAULT` macros for `ordered_map`, and handled moved events in `serve_header.py`.
|
409. [Patrick Armstrong](https://github.com/Patrick10199) updated the CBOR references and the half-precision float assertions.
|
||||||
410. [Aditya](https://github.com/Lumowhisp) improved the documentation of the documentation generation.
|
410. [Yash Bavadiya](https://github.com/xevrion) added checks to all BSON reads.
|
||||||
411. [cheese1](https://github.com/cheese1) clarified the README.
|
411. [hum4nBeing](https://github.com/hum4nBeing) fixed the overflow handling of high-precision numbers in UBJSON.
|
||||||
412. [KhloodElhossiny](https://github.com/khloodelhossiny) enabled `std::string_view` keys in `operator[]`.
|
412. [tomatotomata](https://github.com/tomatotomata) added checks for reading CBOR tagged subtypes.
|
||||||
413. [Charles Cabergs](https://github.com/cacharle) fixed a `-Wtautological-constant-out-of-range-compare` warning.
|
413. [YingqiDuan](https://github.com/YingqiDuan) documented the BSON interoperability.
|
||||||
414. [EALePain](https://github.com/EALePain) made the `std::tuple` conversion work with reference types such as `std::tie`.
|
414. [KBS](https://github.com/youdie006) documented the standards compliance and the strictness of `parse()` and `operator>>`.
|
||||||
415. [koala_oishi](https://github.com/chibi-dogs) fixed grammatical wording in the README.
|
415. [Petr Bělohlávek](https://github.com/petrbel) added Clang 21 and 22 to the CI.
|
||||||
416. [riccardoori11](https://github.com/riccardoori11) fixed a typo in the documentation.
|
416. [Dmitry Rantovov](https://github.com/darkdi) fixed the placement of a CBOR documentation block.
|
||||||
417. [Swastik Bose](https://github.com/VasuBhakt) fixed the parent pointers after `update()` with `JSON_DIAGNOSTICS` and fixed the Doxygen autolinking of requirements.
|
417. [ljcjclljc](https://github.com/ljcjclljc) fixed the comparison of large unsigned integers with signed integers.
|
||||||
418. [trdesilva](https://github.com/trdesilva) added `front`, `pop_front`, and `push_front` to `json_pointer`.
|
418. [Sahil Kamate](https://github.com/sahilkamate03) fixed the handling of CBOR tags 0-5 and 21-23.
|
||||||
419. [Akhilesh Arora](https://github.com/akhilesharora) fixed an incomplete-type error with `ordered_json`.
|
419. [Krishnanand G](https://github.com/Krishnanand-G) made the UBJSON writer reject `use_type` without `use_size`.
|
||||||
420. [Hariom Phulre](https://github.com/hariomphulre) fixed the C++20 modules compilation with GCC.
|
420. [whn](https://github.com/Whning0513) documented the lenient BSON input handling and corrected the complexity of `to_bson`.
|
||||||
421. [Kirill Lokotkov](https://github.com/RUSLoker) fixed printing `long double` values.
|
421. [elix3r](https://github.com/22elix3r) fixed `update()` with `merge_objects` when merging a primitive into an object.
|
||||||
422. [George Sedov](https://github.com/radistmorse) added the `NLOHMANN_DEFINE_TYPE_*_WITH_NAMES` macros.
|
422. [Avionic Harshit](https://github.com/avionicharshit-byte) made `diff()` linear when an array shrinks.
|
||||||
423. [Caillin Nugent](https://github.com/nugentcaillin) added the `NLOHMANN_JSON_SERIALIZE_ENUM_STRICT` macro.
|
423. [Qatadaha Bin Matloob](https://github.com/qatcod) fixed comparisons between integers and floats and fixed unparsable BJData output.
|
||||||
424. [Cosmin D.](https://github.com/drcosmin) fixed `std::filesystem::path` conversions and added an MSVC workaround for `std::unique_ptr`.
|
424. [Wu Shuwen](https://github.com/dajiaohuang) removed an unused include.
|
||||||
425. [Paul Dreik](https://github.com/pauldreik) fixed a test relying on implementation-specific behavior.
|
|
||||||
426. [Daniel Falk](https://github.com/daniel-falk) added missing copyright notices to the SBOM.
|
|
||||||
427. [Federico Sfriso](https://github.com/federicosfriso05-dotcom) added support for constructing JSON values from C++20 range views.
|
|
||||||
428. [Luke Banicevic](https://github.com/banaboi) fixed corrupt BSON output for lengths exceeding `INT32_MAX`, cleaned up the BSON writer, and improved the documentation.
|
|
||||||
429. [Patrick Armstrong](https://github.com/Patrick10199) updated the CBOR references and the half-precision float assertions.
|
|
||||||
430. [Yash Bavadiya](https://github.com/xevrion) added checks to all BSON reads.
|
|
||||||
431. [hum4nBeing](https://github.com/hum4nBeing) fixed the overflow handling of high-precision numbers in UBJSON.
|
|
||||||
432. [tomatotomata](https://github.com/tomatotomata) added checks for reading CBOR tagged subtypes.
|
|
||||||
433. [YingqiDuan](https://github.com/YingqiDuan) documented the BSON interoperability.
|
|
||||||
434. [KBS](https://github.com/youdie006) documented the standards compliance and the strictness of `parse()` and `operator>>`.
|
|
||||||
435. [Petr Bělohlávek](https://github.com/petrbel) added Clang 21 and 22 to the CI.
|
|
||||||
436. [Dmitry Rantovov](https://github.com/darkdi) fixed the placement of a CBOR documentation block.
|
|
||||||
437. [ljcjclljc](https://github.com/ljcjclljc) fixed the comparison of large unsigned integers with signed integers.
|
|
||||||
438. [Sahil Kamate](https://github.com/sahilkamate03) fixed the handling of CBOR tags 0-5 and 21-23.
|
|
||||||
439. [Krishnanand G](https://github.com/Krishnanand-G) made the UBJSON writer reject `use_type` without `use_size`.
|
|
||||||
440. [whn](https://github.com/Whning0513) documented the lenient BSON input handling and corrected the complexity of `to_bson`.
|
|
||||||
441. [elix3r](https://github.com/22elix3r) fixed `update()` with `merge_objects` when merging a primitive into an object.
|
|
||||||
442. [Avionic Harshit](https://github.com/avionicharshit-byte) made `diff()` linear when an array shrinks.
|
|
||||||
443. [Qatadaha Bin Matloob](https://github.com/qatcod) fixed comparisons between integers and floats and fixed unparsable BJData output.
|
|
||||||
444. [Wu Shuwen](https://github.com/dajiaohuang) removed an unused include.
|
|
||||||
|
|
||||||
Thanks a lot for helping out! Please [let me know](mailto:mail@nlohmann.me) if I forgot someone.
|
Thanks a lot for helping out! Please [let me know](mailto:mail@nlohmann.me) if I forgot someone.
|
||||||
|
|
||||||
@@ -1879,21 +1850,28 @@ The library itself consists of a single header file licensed under the MIT licen
|
|||||||
- [**AppVeyor**](https://www.appveyor.com) for [continuous integration](https://ci.appveyor.com/project/nlohmann/json) on Windows
|
- [**AppVeyor**](https://www.appveyor.com) for [continuous integration](https://ci.appveyor.com/project/nlohmann/json) on Windows
|
||||||
- [**Artistic Style**](https://astyle.sourceforge.net) for automatic source code indentation
|
- [**Artistic Style**](https://astyle.sourceforge.net) for automatic source code indentation
|
||||||
- [**Clang**](https://clang.llvm.org) for compilation with code sanitizers
|
- [**Clang**](https://clang.llvm.org) for compilation with code sanitizers
|
||||||
|
- [**Clang-Tidy**](https://clang.llvm.org/extra/clang-tidy/) for static analysis and style checks
|
||||||
- [**CMake**](https://cmake.org) for build automation
|
- [**CMake**](https://cmake.org) for build automation
|
||||||
- [**Codacy**](https://www.codacy.com) for further [code analysis](https://app.codacy.com/gh/nlohmann/json/dashboard)
|
- [**Codacy**](https://www.codacy.com) for further [code analysis](https://app.codacy.com/gh/nlohmann/json/dashboard)
|
||||||
|
- [**CodeQL**](https://codeql.github.com) for code scanning
|
||||||
- [**Coveralls**](https://coveralls.io) to measure [code coverage](https://coveralls.io/github/nlohmann/json)
|
- [**Coveralls**](https://coveralls.io) to measure [code coverage](https://coveralls.io/github/nlohmann/json)
|
||||||
- [**Coverity Scan**](https://scan.coverity.com) for [static analysis](https://scan.coverity.com/projects/nlohmann-json)
|
- [**Coverity Scan**](https://scan.coverity.com) for [static analysis](https://scan.coverity.com/projects/nlohmann-json)
|
||||||
- [**cppcheck**](https://cppcheck.sourceforge.io) for static analysis
|
- [**cppcheck**](https://cppcheck.sourceforge.io) for static analysis
|
||||||
- [**doctest**](https://github.com/onqtam/doctest) for the unit tests
|
- [**cpplint**](https://github.com/cpplint/cpplint) for style checks
|
||||||
- [**GitHub Changelog Generator**](https://github.com/skywinder/github-changelog-generator) to generate the [ChangeLog](https://github.com/nlohmann/json/blob/develop/ChangeLog.md)
|
- [**doctest**](https://github.com/doctest/doctest) for the unit tests
|
||||||
|
- [**Flawfinder**](https://dwheeler.com/flawfinder/) for static analysis
|
||||||
|
- [**GitHub Changelog Generator**](https://github.com/github-changelog-generator/github-changelog-generator) to generate the [ChangeLog](https://github.com/nlohmann/json/blob/develop/ChangeLog.md)
|
||||||
- [**Google Benchmark**](https://github.com/google/benchmark) to implement the benchmarks
|
- [**Google Benchmark**](https://github.com/google/benchmark) to implement the benchmarks
|
||||||
- [**Hedley**](https://nemequ.github.io/hedley/) to avoid re-inventing several compiler-agnostic feature macros
|
- [**Hedley**](https://nemequ.github.io/hedley/) to avoid re-inventing several compiler-agnostic feature macros
|
||||||
|
- [**include-what-you-use**](https://include-what-you-use.org) to check the included headers
|
||||||
|
- [**Infer**](https://fbinfer.com) for static analysis
|
||||||
- [**lcov**](https://github.com/linux-test-project/lcov) to process coverage information and create an HTML view
|
- [**lcov**](https://github.com/linux-test-project/lcov) to process coverage information and create an HTML view
|
||||||
- [**libFuzzer**](https://llvm.org/docs/LibFuzzer.html) to implement fuzz testing for OSS-Fuzz
|
- [**libFuzzer**](https://llvm.org/docs/LibFuzzer.html) to implement fuzz testing for OSS-Fuzz
|
||||||
- [**Material for MkDocs**](https://squidfunk.github.io/mkdocs-material/) for the style of the documentation site
|
- [**Material for MkDocs**](https://squidfunk.github.io/mkdocs-material/) for the style of the documentation site
|
||||||
- [**MkDocs**](https://www.mkdocs.org) for the documentation site
|
- [**MkDocs**](https://www.mkdocs.org) for the documentation site
|
||||||
- [**OSS-Fuzz**](https://github.com/google/oss-fuzz) for continuous fuzz testing of the library ([project repository](https://github.com/google/oss-fuzz/tree/master/projects/json))
|
- [**OSS-Fuzz**](https://github.com/google/oss-fuzz) for continuous fuzz testing of the library ([project repository](https://github.com/google/oss-fuzz/tree/master/projects/json))
|
||||||
- [**Probot**](https://probot.github.io) for automating maintainer tasks such as closing stale issues, requesting missing information, or detecting toxic comments.
|
- [**Probot**](https://probot.github.io) for automating maintainer tasks such as closing stale issues, requesting missing information, or detecting toxic comments.
|
||||||
|
- [**Semgrep**](https://semgrep.dev) for static analysis
|
||||||
- [**Valgrind**](https://valgrind.org) to check for correct memory management
|
- [**Valgrind**](https://valgrind.org) to check for correct memory management
|
||||||
|
|
||||||
## Notes
|
## Notes
|
||||||
@@ -1987,10 +1965,10 @@ If the testdata is not found, several test suites will fail like this:
|
|||||||
|
|
||||||
```
|
```
|
||||||
===============================================================================
|
===============================================================================
|
||||||
json/tests/src/make_test_data_available.hpp:21:
|
json/tests/src/make_test_data_available.hpp:26:
|
||||||
TEST CASE: check test suite is downloaded
|
TEST CASE: check test suite is downloaded
|
||||||
|
|
||||||
json/tests/src/make_test_data_available.hpp:23: FATAL ERROR: REQUIRE( utils::check_testsuite_downloaded() ) is NOT correct!
|
json/tests/src/make_test_data_available.hpp:28: FATAL ERROR: REQUIRE( utils::check_testsuite_downloaded() ) is NOT correct!
|
||||||
values: REQUIRE( false )
|
values: REQUIRE( false )
|
||||||
logged: Test data not found in 'json/cmake-build-debug/json_test_data'.
|
logged: Test data not found in 'json/cmake-build-debug/json_test_data'.
|
||||||
Please execute target 'download_test_data' before running this test suite.
|
Please execute target 'download_test_data' before running this test suite.
|
||||||
@@ -2001,10 +1979,10 @@ json/tests/src/make_test_data_available.hpp:23: FATAL ERROR: REQUIRE( utils::che
|
|||||||
|
|
||||||
In case you have downloaded the library rather than checked out the code via Git, test `cmake_fetch_content_configure` will fail. Please execute `ctest -LE git_required` to skip these tests. See [issue #2189](https://github.com/nlohmann/json/issues/2189) for more information.
|
In case you have downloaded the library rather than checked out the code via Git, test `cmake_fetch_content_configure` will fail. Please execute `ctest -LE git_required` to skip these tests. See [issue #2189](https://github.com/nlohmann/json/issues/2189) for more information.
|
||||||
|
|
||||||
Some tests are requiring network to be properly execute. They are labeled as `git_required`. Please execute `ctest -LE git_required` to skip these tests. See [issue #4851](https://github.com/nlohmann/json/issues/4851) for more information.
|
Some tests require network access to execute properly. They are labeled as `git_required`. Please execute `ctest -LE git_required` to skip these tests. See [issue #4851](https://github.com/nlohmann/json/issues/4851) for more information.
|
||||||
|
|
||||||
Some tests change the installed files and hence make the whole process not reproducible. Please execute `ctest -LE not_reproducible` to skip these tests. See [issue #2324](https://github.com/nlohmann/json/issues/2324) for more information. Furthermore, assertions must be switched off to ensure reproducible builds (see [discussion 4494](https://github.com/nlohmann/json/discussions/4494)).
|
Some tests change the installed files and hence make the whole process not reproducible. Please execute `ctest -LE not_reproducible` to skip these tests. See [issue #2324](https://github.com/nlohmann/json/issues/2324) for more information. Furthermore, assertions must be switched off to ensure reproducible builds (see [discussion 4494](https://github.com/nlohmann/json/discussions/4494)).
|
||||||
|
|
||||||
Note you need to call `cmake -LE "not_reproducible|git_required"` to exclude both labels. See [issue #2596](https://github.com/nlohmann/json/issues/2596) for more information.
|
Note you need to call `ctest -LE "not_reproducible|git_required"` to exclude both labels. See [issue #2596](https://github.com/nlohmann/json/issues/2596) for more information.
|
||||||
|
|
||||||
As Intel compilers use unsafe floating point optimization by default, the unit tests may fail. Use flag [`/fp:precise`](https://www.intel.com/content/www/us/en/docs/cpp-compiler/developer-guide-reference/2021-8/fp-model-fp.html) then.
|
As Intel compilers use unsafe floating point optimization by default, the unit tests may fail. Use flag [`/fp:precise`](https://www.intel.com/content/www/us/en/docs/cpp-compiler/developer-guide-reference/2021-8/fp-model-fp.html) then.
|
||||||
+8
-2
@@ -10,10 +10,10 @@ SPDX-FileCopyrightText = "2013-2026 Niels Lohmann <https://nlohmann.me>"
|
|||||||
SPDX-License-Identifier = "MIT"
|
SPDX-License-Identifier = "MIT"
|
||||||
|
|
||||||
[[annotations]]
|
[[annotations]]
|
||||||
path = "include/nlohmann/thirdparty/hedley.hpp"
|
path = "include/nlohmann/thirdparty/hedley/hedley.hpp"
|
||||||
precedence = "aggregate"
|
precedence = "aggregate"
|
||||||
SPDX-FileCopyrightText = "2016-2021 Evan Nemerson <evan@nemerson.com>"
|
SPDX-FileCopyrightText = "2016-2021 Evan Nemerson <evan@nemerson.com>"
|
||||||
SPDX-License-Identifier = "CC0"
|
SPDX-License-Identifier = "CC0-1.0"
|
||||||
|
|
||||||
[[annotations]]
|
[[annotations]]
|
||||||
path = "include/nlohmann/detail/meta/cpp_future.hpp"
|
path = "include/nlohmann/detail/meta/cpp_future.hpp"
|
||||||
@@ -50,3 +50,9 @@ path = "tools/gdb_pretty_printer/**"
|
|||||||
precedence = "aggregate"
|
precedence = "aggregate"
|
||||||
SPDX-FileCopyrightText = "2020 Hannes Domani <https://github.com/ssbssa>"
|
SPDX-FileCopyrightText = "2020 Hannes Domani <https://github.com/ssbssa>"
|
||||||
SPDX-License-Identifier = "MIT"
|
SPDX-License-Identifier = "MIT"
|
||||||
|
|
||||||
|
[[annotations]]
|
||||||
|
path = "docs/docset/icon*.png"
|
||||||
|
precedence = "override"
|
||||||
|
SPDX-FileCopyrightText = "JSON logo (public domain), https://commons.wikimedia.org/wiki/File:JSON_vector_logo.svg"
|
||||||
|
SPDX-License-Identifier = "CC0-1.0"
|
||||||
+14
-17
@@ -5,15 +5,14 @@ set(N 10)
|
|||||||
# Needed tools.
|
# Needed tools.
|
||||||
###############################################################################
|
###############################################################################
|
||||||
|
|
||||||
include(FindPython3)
|
|
||||||
find_package(Python3 COMPONENTS Interpreter)
|
find_package(Python3 COMPONENTS Interpreter)
|
||||||
|
|
||||||
find_program(CLANG_TOOL NAMES clang++-HEAD clang++ clang++-22 clang++-21 clang++-20 clang++-19 clang++-18 clang++-17 clang++-16 clang++-15 clang++-14 clang++-13 clang++-12 clang++-11 clang++)
|
find_program(CLANG_TOOL NAMES clang++ clang++-HEAD clang++-22 clang++-21 clang++-20 clang++-19 clang++-18 clang++-17 clang++-16 clang++-15 clang++-14 clang++-13 clang++-12 clang++-11)
|
||||||
execute_process(COMMAND ${CLANG_TOOL} --version OUTPUT_VARIABLE CLANG_TOOL_VERSION ERROR_VARIABLE CLANG_TOOL_VERSION)
|
execute_process(COMMAND ${CLANG_TOOL} --version OUTPUT_VARIABLE CLANG_TOOL_VERSION ERROR_VARIABLE CLANG_TOOL_VERSION)
|
||||||
string(REGEX MATCH "[0-9]+(\\.[0-9]+)+" CLANG_TOOL_VERSION "${CLANG_TOOL_VERSION}")
|
string(REGEX MATCH "[0-9]+(\\.[0-9]+)+" CLANG_TOOL_VERSION "${CLANG_TOOL_VERSION}")
|
||||||
message(STATUS "🔖 Clang ${CLANG_TOOL_VERSION} (${CLANG_TOOL})")
|
message(STATUS "🔖 Clang ${CLANG_TOOL_VERSION} (${CLANG_TOOL})")
|
||||||
|
|
||||||
find_program(CLANG_TIDY_TOOL NAMES clang-tidy-22 clang-tidy-21 clang-tidy-20 clang-tidy-19 clang-tidy-18 clang-tidy-17 clang-tidy-16 clang-tidy-15 clang-tidy-14 clang-tidy-13 clang-tidy-12 clang-tidy-11 clang-tidy)
|
find_program(CLANG_TIDY_TOOL NAMES clang-tidy clang-tidy-22 clang-tidy-21 clang-tidy-20 clang-tidy-19 clang-tidy-18 clang-tidy-17 clang-tidy-16 clang-tidy-15 clang-tidy-14 clang-tidy-13 clang-tidy-12 clang-tidy-11)
|
||||||
execute_process(COMMAND ${CLANG_TIDY_TOOL} --version OUTPUT_VARIABLE CLANG_TIDY_TOOL_VERSION ERROR_VARIABLE CLANG_TIDY_TOOL_VERSION)
|
execute_process(COMMAND ${CLANG_TIDY_TOOL} --version OUTPUT_VARIABLE CLANG_TIDY_TOOL_VERSION ERROR_VARIABLE CLANG_TIDY_TOOL_VERSION)
|
||||||
string(REGEX MATCH "[0-9]+(\\.[0-9]+)+" CLANG_TIDY_TOOL_VERSION "${CLANG_TIDY_TOOL_VERSION}")
|
string(REGEX MATCH "[0-9]+(\\.[0-9]+)+" CLANG_TIDY_TOOL_VERSION "${CLANG_TIDY_TOOL_VERSION}")
|
||||||
message(STATUS "🔖 Clang-Tidy ${CLANG_TIDY_TOOL_VERSION} (${CLANG_TIDY_TOOL})")
|
message(STATUS "🔖 Clang-Tidy ${CLANG_TIDY_TOOL_VERSION} (${CLANG_TIDY_TOOL})")
|
||||||
@@ -69,9 +68,7 @@ string(REGEX MATCH "[0-9]+(\\.[0-9]+)+" VALGRIND_TOOL_VERSION "${VALGRIND_TOOL_V
|
|||||||
message(STATUS "🔖 Valgrind ${VALGRIND_TOOL_VERSION} (${VALGRIND_TOOL})")
|
message(STATUS "🔖 Valgrind ${VALGRIND_TOOL_VERSION} (${VALGRIND_TOOL})")
|
||||||
|
|
||||||
find_program(GENHTML_TOOL NAMES genhtml)
|
find_program(GENHTML_TOOL NAMES genhtml)
|
||||||
find_program(PLOG_CONVERTER_TOOL NAMES plog-converter)
|
find_program(SCAN_BUILD_TOOL NAMES scan-build scan-build-22 scan-build-21 scan-build-20 scan-build-19 scan-build-18 scan-build-17 scan-build-16 scan-build-15 scan-build-14 scan-build-13 scan-build-12 scan-build-11)
|
||||||
find_program(PVS_STUDIO_ANALYZER_TOOL NAMES pvs-studio-analyzer)
|
|
||||||
find_program(SCAN_BUILD_TOOL NAMES scan-build-15 scan-build-14 scan-build-13 scan-build-12 scan-build-11 scan-build)
|
|
||||||
|
|
||||||
# the individual source files
|
# the individual source files
|
||||||
file(GLOB_RECURSE SRC_FILES ${PROJECT_SOURCE_DIR}/include/nlohmann/*.hpp)
|
file(GLOB_RECURSE SRC_FILES ${PROJECT_SOURCE_DIR}/include/nlohmann/*.hpp)
|
||||||
@@ -367,7 +364,7 @@ add_custom_target(ci_test_coverage
|
|||||||
COMMAND ${LCOV_TOOL} --directory . --capture --output-file json.info --rc branch_coverage=1 --rc geninfo_unexecuted_blocks=1 --ignore-errors mismatch --ignore-errors unused
|
COMMAND ${LCOV_TOOL} --directory . --capture --output-file json.info --rc branch_coverage=1 --rc geninfo_unexecuted_blocks=1 --ignore-errors mismatch --ignore-errors unused
|
||||||
COMMAND ${LCOV_TOOL} -e json.info ${SRC_FILES} --output-file json.info.filtered --rc branch_coverage=1 --ignore-errors unused
|
COMMAND ${LCOV_TOOL} -e json.info ${SRC_FILES} --output-file json.info.filtered --rc branch_coverage=1 --ignore-errors unused
|
||||||
COMMAND ${CMAKE_SOURCE_DIR}/tests/thirdparty/imapdl/filterbr.py json.info.filtered > json.info.filtered.noexcept
|
COMMAND ${CMAKE_SOURCE_DIR}/tests/thirdparty/imapdl/filterbr.py json.info.filtered > json.info.filtered.noexcept
|
||||||
COMMAND genhtml --title "JSON for Modern C++" --legend --demangle-cpp --output-directory html --show-details --branch-coverage json.info.filtered.noexcept
|
COMMAND ${GENHTML_TOOL} --title "JSON for Modern C++" --legend --demangle-cpp --output-directory html --show-details --branch-coverage json.info.filtered.noexcept
|
||||||
|
|
||||||
COMMENT "Compile and test with coverage"
|
COMMENT "Compile and test with coverage"
|
||||||
)
|
)
|
||||||
@@ -392,8 +389,8 @@ add_custom_target(ci_test_clang_sanitizer
|
|||||||
# Check if header is amalgamated and sources are properly indented.
|
# Check if header is amalgamated and sources are properly indented.
|
||||||
###############################################################################
|
###############################################################################
|
||||||
|
|
||||||
# Same file set as .github/workflows/check_amalgamation.yml, so a direct push to develop/master/release/*
|
# Same file set as .github/workflows/check_amalgamation.yml, so this CMake target (which can be run locally) is held
|
||||||
# (which only this CMake target checks, not the pull_request-only workflow) is held to the same standard.
|
# to the same standard as the workflow (which runs for pull requests and for pushes to develop/master/release/*).
|
||||||
file(GLOB_RECURSE INDENT_FILES
|
file(GLOB_RECURSE INDENT_FILES
|
||||||
${PROJECT_SOURCE_DIR}/docs/mkdocs/docs/examples/*.hpp
|
${PROJECT_SOURCE_DIR}/docs/mkdocs/docs/examples/*.hpp
|
||||||
${PROJECT_SOURCE_DIR}/docs/mkdocs/docs/examples/*.cpp
|
${PROJECT_SOURCE_DIR}/docs/mkdocs/docs/examples/*.cpp
|
||||||
@@ -423,7 +420,7 @@ add_custom_target(ci_test_amalgamation
|
|||||||
COMMAND ${Python3_EXECUTABLE} ${tool_dir}/amalgamate.py -c ${tool_dir}/config_json.json -s .
|
COMMAND ${Python3_EXECUTABLE} ${tool_dir}/amalgamate.py -c ${tool_dir}/config_json.json -s .
|
||||||
COMMAND ${Python3_EXECUTABLE} ${tool_dir}/amalgamate.py -c ${tool_dir}/config_json_fwd.json -s .
|
COMMAND ${Python3_EXECUTABLE} ${tool_dir}/amalgamate.py -c ${tool_dir}/config_json_fwd.json -s .
|
||||||
COMMAND cp ${PROJECT_SOURCE_DIR}/include/nlohmann/json_literals.hpp ${include_dir}/json_literals.hpp
|
COMMAND cp ${PROJECT_SOURCE_DIR}/include/nlohmann/json_literals.hpp ${include_dir}/json_literals.hpp
|
||||||
COMMAND venv_astyle/bin/astyle --project=tools/astyle/.astylerc --suffix=none ${include_dir}/json.hpp ${include_dir}/json_fwd.hpp
|
COMMAND venv_astyle/bin/astyle --project=tools/astyle/.astylerc --suffix=none ${include_dir}/json.hpp ${include_dir}/json_fwd.hpp ${include_dir}/json_literals.hpp
|
||||||
COMMAND ${CMAKE_COMMAND} -P ${PROJECT_SOURCE_DIR}/cmake/scripts/gen_bazel_build_file.cmake
|
COMMAND ${CMAKE_COMMAND} -P ${PROJECT_SOURCE_DIR}/cmake/scripts/gen_bazel_build_file.cmake
|
||||||
|
|
||||||
COMMAND diff ${include_dir}/json.hpp~ ${include_dir}/json.hpp
|
COMMAND diff ${include_dir}/json.hpp~ ${include_dir}/json.hpp
|
||||||
@@ -434,6 +431,8 @@ add_custom_target(ci_test_amalgamation
|
|||||||
COMMAND venv_astyle/bin/astyle --project=tools/astyle/.astylerc --suffix=orig ${INDENT_FILES}
|
COMMAND venv_astyle/bin/astyle --project=tools/astyle/.astylerc --suffix=orig ${INDENT_FILES}
|
||||||
COMMAND for FILE in `find . -name '*.orig'`\; do false \; done
|
COMMAND for FILE in `find . -name '*.orig'`\; do false \; done
|
||||||
|
|
||||||
|
COMMAND rm -f ${include_dir}/json.hpp~ ${include_dir}/json_fwd.hpp~ ${include_dir}/json_literals.hpp~ ${PROJECT_SOURCE_DIR}/BUILD.bazel~
|
||||||
|
|
||||||
WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}
|
WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}
|
||||||
COMMENT "Check amalgamation, formatting, and BUILD.bazel"
|
COMMENT "Check amalgamation, formatting, and BUILD.bazel"
|
||||||
)
|
)
|
||||||
@@ -719,7 +718,7 @@ ci_get_cmake(4.0.0 CMAKE_4_0_0_BINARY)
|
|||||||
|
|
||||||
# the tests require CMake 3.13 or later, so they are excluded for CMake 3.5.0
|
# the tests require CMake 3.13 or later, so they are excluded for CMake 3.5.0
|
||||||
set(JSON_CMAKE_FLAGS_3_5_0 JSON_Diagnostics JSON_Diagnostic_Positions JSON_GlobalUDLs JSON_ImplicitConversions JSON_DisableEnumSerialization
|
set(JSON_CMAKE_FLAGS_3_5_0 JSON_Diagnostics JSON_Diagnostic_Positions JSON_GlobalUDLs JSON_ImplicitConversions JSON_DisableEnumSerialization
|
||||||
JSON_LegacyDiscardedValueComparison JSON_Install JSON_MultipleHeaders JSON_SystemInclude JSON_Valgrind
|
JSON_DisableTupleReferenceConversion JSON_LegacyDiscardedValueComparison JSON_Install JSON_MultipleHeaders JSON_SystemInclude JSON_Valgrind
|
||||||
JSON_StrictNulHandling JSON_StrictBinaryUTF8 JSON_DeleteDeprecatedFunctions)
|
JSON_StrictNulHandling JSON_StrictBinaryUTF8 JSON_DeleteDeprecatedFunctions)
|
||||||
set(JSON_CMAKE_FLAGS_3_31_6 JSON_BuildTests ${JSON_CMAKE_FLAGS_3_5_0})
|
set(JSON_CMAKE_FLAGS_3_31_6 JSON_BuildTests ${JSON_CMAKE_FLAGS_3_5_0})
|
||||||
set(JSON_CMAKE_FLAGS_4_0_0 JSON_BuildTests ${JSON_CMAKE_FLAGS_3_5_0})
|
set(JSON_CMAKE_FLAGS_4_0_0 JSON_BuildTests ${JSON_CMAKE_FLAGS_3_5_0})
|
||||||
@@ -776,17 +775,14 @@ add_custom_target(ci_cmake_flags
|
|||||||
# Use more installed compilers.
|
# Use more installed compilers.
|
||||||
###############################################################################
|
###############################################################################
|
||||||
|
|
||||||
foreach(COMPILER g++-4.8 g++-4.9 g++-5 g++-6 g++-7 g++-8 g++-9 g++-10 g++-11 clang++-3.5 clang++-3.6 clang++-3.7 clang++-3.8 clang++-3.9 clang++-4.0 clang++-5.0 clang++-6.0 clang++-7 clang++-8 clang++-9 clang++-10 clang++-11 clang++-12 clang++-13 clang++-14 clang++-15 clang++-16 clang++-17 clang++-18 clang++-19 clang++-20)
|
foreach(COMPILER g++-4.8 g++-4.9 g++-5 g++-6)
|
||||||
find_program(COMPILER_TOOL NAMES ${COMPILER})
|
find_program(COMPILER_TOOL NAMES ${COMPILER})
|
||||||
if (COMPILER_TOOL)
|
if (COMPILER_TOOL)
|
||||||
unset(ADDITIONAL_FLAGS)
|
|
||||||
|
|
||||||
add_custom_target(ci_test_compiler_${COMPILER}
|
add_custom_target(ci_test_compiler_${COMPILER}
|
||||||
COMMAND CXX=${COMPILER} ${CMAKE_COMMAND}
|
COMMAND CXX=${COMPILER} ${CMAKE_COMMAND}
|
||||||
-DCMAKE_BUILD_TYPE=Debug -GNinja
|
-DCMAKE_BUILD_TYPE=Debug -GNinja
|
||||||
-DJSON_BuildTests=ON -DJSON_FastTests=ON
|
-DJSON_BuildTests=ON -DJSON_FastTests=ON
|
||||||
-S${PROJECT_SOURCE_DIR} -B${PROJECT_BINARY_DIR}/build_compiler_${COMPILER}
|
-S${PROJECT_SOURCE_DIR} -B${PROJECT_BINARY_DIR}/build_compiler_${COMPILER}
|
||||||
${ADDITIONAL_FLAGS}
|
|
||||||
COMMAND ${CMAKE_COMMAND} --build ${PROJECT_BINARY_DIR}/build_compiler_${COMPILER}
|
COMMAND ${CMAKE_COMMAND} --build ${PROJECT_BINARY_DIR}/build_compiler_${COMPILER}
|
||||||
COMMAND cd ${PROJECT_BINARY_DIR}/build_compiler_${COMPILER} && ${CMAKE_CTEST_COMMAND} --parallel ${N} --output-on-failure
|
COMMAND cd ${PROJECT_BINARY_DIR}/build_compiler_${COMPILER} && ${CMAKE_CTEST_COMMAND} --parallel ${N} --output-on-failure
|
||||||
COMMENT "Compile and test with ${COMPILER}"
|
COMMENT "Compile and test with ${COMPILER}"
|
||||||
@@ -800,7 +796,6 @@ add_custom_target(ci_test_compiler_default
|
|||||||
-DCMAKE_BUILD_TYPE=Debug -GNinja
|
-DCMAKE_BUILD_TYPE=Debug -GNinja
|
||||||
-DJSON_BuildTests=ON -DJSON_FastTests=ON
|
-DJSON_BuildTests=ON -DJSON_FastTests=ON
|
||||||
-S${PROJECT_SOURCE_DIR} -B${PROJECT_BINARY_DIR}/build_compiler_default
|
-S${PROJECT_SOURCE_DIR} -B${PROJECT_BINARY_DIR}/build_compiler_default
|
||||||
${ADDITIONAL_FLAGS}
|
|
||||||
COMMAND ${CMAKE_COMMAND} --build ${PROJECT_BINARY_DIR}/build_compiler_default --parallel ${N}
|
COMMAND ${CMAKE_COMMAND} --build ${PROJECT_BINARY_DIR}/build_compiler_default --parallel ${N}
|
||||||
COMMAND cd ${PROJECT_BINARY_DIR}/build_compiler_default && ${CMAKE_CTEST_COMMAND} --parallel ${N} -LE git_required --output-on-failure
|
COMMAND cd ${PROJECT_BINARY_DIR}/build_compiler_default && ${CMAKE_CTEST_COMMAND} --parallel ${N} -LE git_required --output-on-failure
|
||||||
COMMENT "Compile and test with default C++ compiler"
|
COMMENT "Compile and test with default C++ compiler"
|
||||||
@@ -823,10 +818,12 @@ add_custom_target(ci_cuda_example
|
|||||||
|
|
||||||
add_custom_target(ci_module_cpp20
|
add_custom_target(ci_module_cpp20
|
||||||
COMMAND ${CMAKE_COMMAND}
|
COMMAND ${CMAKE_COMMAND}
|
||||||
-DCMAKE_BUILD_TYPE=Debug -GNinja
|
-DCMAKE_BUILD_TYPE=Debug -GNinja
|
||||||
-DJSON_CI=ON -DNLOHMANN_JSON_BUILD_MODULES=ON -DJSON_Install=ON
|
-DJSON_CI=ON -DNLOHMANN_JSON_BUILD_MODULES=ON -DJSON_Install=ON
|
||||||
|
"-DCMAKE_CXX_FLAGS=${CMAKE_CXX_FLAGS}"
|
||||||
-S${PROJECT_SOURCE_DIR}/tests/module_cpp20 -B${PROJECT_BINARY_DIR}/ci_module_cpp20
|
-S${PROJECT_SOURCE_DIR}/tests/module_cpp20 -B${PROJECT_BINARY_DIR}/ci_module_cpp20
|
||||||
COMMAND ${CMAKE_COMMAND} --build ${PROJECT_BINARY_DIR}/ci_module_cpp20
|
COMMAND ${CMAKE_COMMAND} --build ${PROJECT_BINARY_DIR}/ci_module_cpp20
|
||||||
|
VERBATIM
|
||||||
)
|
)
|
||||||
|
|
||||||
###############################################################################
|
###############################################################################
|
||||||
|
|||||||
@@ -49,6 +49,7 @@ cc_library(
|
|||||||
hdrs = [
|
hdrs = [
|
||||||
"single_include/nlohmann/json.hpp",
|
"single_include/nlohmann/json.hpp",
|
||||||
"single_include/nlohmann/json_fwd.hpp",
|
"single_include/nlohmann/json_fwd.hpp",
|
||||||
|
"single_include/nlohmann/json_literals.hpp",
|
||||||
],
|
],
|
||||||
includes = ["single_include"],
|
includes = ["single_include"],
|
||||||
visibility = ["//visibility:public"],
|
visibility = ["//visibility:public"],
|
||||||
|
|||||||
+2
-2
@@ -7,12 +7,12 @@ This URL provides the most recent documentation and also applies to previous ver
|
|||||||
functions is not removed; instead, it is marked as deprecated.
|
functions is not removed; instead, it is marked as deprecated.
|
||||||
|
|
||||||
If you want to view the documentation for a specific tag or commit hash, you can generate it locally as follows (example
|
If you want to view the documentation for a specific tag or commit hash, you can generate it locally as follows (example
|
||||||
using tag `v3.10.2`):
|
using tag `v3.12.0`):
|
||||||
|
|
||||||
```shell
|
```shell
|
||||||
git clone https://github.com/nlohmann/json.git
|
git clone https://github.com/nlohmann/json.git
|
||||||
cd json
|
cd json
|
||||||
git checkout v3.10.2
|
git checkout v3.12.0
|
||||||
make install_venv serve -C docs/mkdocs
|
make install_venv serve -C docs/mkdocs
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|||||||
@@ -337,17 +337,14 @@ def is_remote(url) -> bool:
|
|||||||
def download(url, docs) -> str:
|
def download(url, docs) -> str:
|
||||||
"""Download url into assets/external and return the path relative to docs."""
|
"""Download url into assets/external and return the path relative to docs."""
|
||||||
u = urllib.parse.urlparse(url if not url.startswith('//') else 'https:' + url)
|
u = urllib.parse.urlparse(url if not url.startswith('//') else 'https:' + url)
|
||||||
if u.scheme.lower() not in ('http', 'https'):
|
|
||||||
raise ValueError(f'not an http(s) URL: {url}')
|
|
||||||
req = urllib.request.Request(u.geturl(), headers={'User-Agent': USER_AGENT})
|
req = urllib.request.Request(u.geturl(), headers={'User-Agent': USER_AGENT})
|
||||||
# (the scheme is checked above)
|
with urllib.request.urlopen(req, timeout=20) as r:
|
||||||
with urllib.request.urlopen(req, timeout=20) as r: # nosec B310
|
|
||||||
data = r.read()
|
data = r.read()
|
||||||
ctype = r.headers.get_content_type()
|
ctype = r.headers.get_content_type()
|
||||||
path = urllib.parse.unquote(u.path).lstrip('/')
|
path = urllib.parse.unquote(u.path).lstrip('/')
|
||||||
ext = os.path.splitext(path)[1]
|
ext = os.path.splitext(path)[1]
|
||||||
if u.query or not ext or path.endswith('/'):
|
if u.query or not ext or path.endswith('/'):
|
||||||
digest = hashlib.sha1(url.encode(), usedforsecurity=False).hexdigest()[:12]
|
digest = hashlib.sha1(url.encode()).hexdigest()[:12]
|
||||||
path = os.path.join(os.path.dirname(path), digest + CONTENT_TYPE_EXT.get(ctype, ext or '.bin'))
|
path = os.path.join(os.path.dirname(path), digest + CONTENT_TYPE_EXT.get(ctype, ext or '.bin'))
|
||||||
rel = os.path.normpath(os.path.join('assets', 'external', u.hostname, path))
|
rel = os.path.normpath(os.path.join('assets', 'external', u.hostname, path))
|
||||||
out = os.path.join(docs, rel)
|
out = os.path.join(docs, rel)
|
||||||
@@ -388,8 +385,7 @@ def localize_images(docs) -> None:
|
|||||||
def load_mkdocs_yml() -> dict:
|
def load_mkdocs_yml() -> dict:
|
||||||
"""Load mkdocs.yml, ignoring tags like !ENV and !!python/name."""
|
"""Load mkdocs.yml, ignoring tags like !ENV and !!python/name."""
|
||||||
with open(MKDOCS_YML, encoding='utf-8') as f:
|
with open(MKDOCS_YML, encoding='utf-8') as f:
|
||||||
# (Loader is a yaml.SafeLoader)
|
return yaml.load(f, Loader=Loader)
|
||||||
return yaml.load(f, Loader=Loader) # nosec B506
|
|
||||||
|
|
||||||
|
|
||||||
def localize_site_urls(docs, site_url) -> None:
|
def localize_site_urls(docs, site_url) -> None:
|
||||||
|
|||||||
@@ -10,6 +10,10 @@ bool contains(KeyType&& key) const;
|
|||||||
|
|
||||||
// (3)
|
// (3)
|
||||||
bool contains(const json_pointer& ptr) const;
|
bool contains(const json_pointer& ptr) const;
|
||||||
|
|
||||||
|
// (4)
|
||||||
|
template<typename T>
|
||||||
|
bool contains(T) const = delete;
|
||||||
```
|
```
|
||||||
|
|
||||||
1. Check whether an element exists in a JSON object with a key equivalent to `key`. If the element is not found or the
|
1. Check whether an element exists in a JSON object with a key equivalent to `key`. If the element is not found or the
|
||||||
@@ -17,6 +21,9 @@ bool contains(const json_pointer& ptr) const;
|
|||||||
2. See 1. This overload is only available if `KeyType` is comparable with `#!cpp typename object_t::key_type` and
|
2. See 1. This overload is only available if `KeyType` is comparable with `#!cpp typename object_t::key_type` and
|
||||||
`#!cpp typename object_comparator_t::is_transparent` denotes a type.
|
`#!cpp typename object_comparator_t::is_transparent` denotes a type.
|
||||||
3. Check whether the given JSON pointer `ptr` can be resolved in the current JSON value.
|
3. Check whether the given JSON pointer `ptr` can be resolved in the current JSON value.
|
||||||
|
4. Deleted: this overload is only available if `T` is an integral type and is declared as deleted, so that a call with
|
||||||
|
an integer `key` (for example, `#!cpp j.contains(0)`) fails to compile. Otherwise, the integer literal `0` would convert to
|
||||||
|
a null `#!cpp const char*` and, from there, to the key type, causing undefined behavior at runtime.
|
||||||
|
|
||||||
## Template parameters
|
## Template parameters
|
||||||
|
|
||||||
@@ -39,6 +46,7 @@ bool contains(const json_pointer& ptr) const;
|
|||||||
is not an object, `#!cpp false` is returned.
|
is not an object, `#!cpp false` is returned.
|
||||||
2. See 1.
|
2. See 1.
|
||||||
3. `#!cpp true` if the JSON pointer can be resolved to a stored value, `#!cpp false` otherwise.
|
3. `#!cpp true` if the JSON pointer can be resolved to a stored value, `#!cpp false` otherwise.
|
||||||
|
4. Deleted; a call with an integral argument does not compile.
|
||||||
|
|
||||||
## Exception safety
|
## Exception safety
|
||||||
|
|
||||||
@@ -49,6 +57,7 @@ Strong exception safety: if an exception occurs, the original value stays intact
|
|||||||
1. The function does not throw exceptions.
|
1. The function does not throw exceptions.
|
||||||
2. The function does not throw exceptions.
|
2. The function does not throw exceptions.
|
||||||
3. The function does not throw exceptions.
|
3. The function does not throw exceptions.
|
||||||
|
4. Deleted; a call with an integral argument does not compile.
|
||||||
|
|
||||||
## Complexity
|
## Complexity
|
||||||
|
|
||||||
|
|||||||
@@ -7,12 +7,19 @@ size_type count(const typename object_t::key_type& key) const;
|
|||||||
// (2)
|
// (2)
|
||||||
template<typename KeyType>
|
template<typename KeyType>
|
||||||
size_type count(KeyType&& key) const;
|
size_type count(KeyType&& key) const;
|
||||||
|
|
||||||
|
// (3)
|
||||||
|
template<typename T>
|
||||||
|
size_type count(T) const = delete;
|
||||||
```
|
```
|
||||||
|
|
||||||
1. Returns the number of elements with key `key`. If `ObjectType` is the default `std::map` type, the return value will
|
1. Returns the number of elements with key `key`. If `ObjectType` is the default `std::map` type, the return value will
|
||||||
always be `0` (`key` was not found) or `1` (`key` was found).
|
always be `0` (`key` was not found) or `1` (`key` was found).
|
||||||
2. See 1. This overload is only available if `KeyType` is comparable with `#!cpp typename object_t::key_type` and
|
2. See 1. This overload is only available if `KeyType` is comparable with `#!cpp typename object_t::key_type` and
|
||||||
`#!cpp typename object_comparator_t::is_transparent` denotes a type.
|
`#!cpp typename object_comparator_t::is_transparent` denotes a type.
|
||||||
|
3. Deleted: this overload is only available if `T` is an integral type and is declared as deleted, so that a call with
|
||||||
|
an integer `key` (for example, `#!cpp j.count(0)`) fails to compile. Otherwise, the integer literal `0` would convert to
|
||||||
|
a null `#!cpp const char*` and, from there, to the key type, causing undefined behavior at runtime.
|
||||||
|
|
||||||
## Template parameters
|
## Template parameters
|
||||||
|
|
||||||
|
|||||||
@@ -37,8 +37,8 @@ ignore
|
|||||||
: ignore invalid UTF-8 sequences; all valid bytes are copied to the output unchanged, and invalid bytes are dropped
|
: ignore invalid UTF-8 sequences; all valid bytes are copied to the output unchanged, and invalid bytes are dropped
|
||||||
|
|
||||||
keep
|
keep
|
||||||
: keep invalid UTF-8 sequences unchanged; only meaningful for the binary formats mentioned above, since [`dump`]
|
: keep invalid UTF-8 sequences unchanged; only meaningful for the binary formats mentioned above, since
|
||||||
(dump.md) itself must produce text, and `keep` there writes the ill-formed bytes to the output as is, so the
|
[`dump`](dump.md) itself must produce text, and `keep` there writes the ill-formed bytes to the output as is, so the
|
||||||
result is then not valid UTF-8 (but still equals the input bytes exactly, including around any well-formed
|
result is then not valid UTF-8 (but still equals the input bytes exactly, including around any well-formed
|
||||||
characters, which are still escaped as usual)
|
characters, which are still escaped as usual)
|
||||||
|
|
||||||
|
|||||||
@@ -10,12 +10,21 @@ template<typename KeyType>
|
|||||||
iterator find(KeyType&& key);
|
iterator find(KeyType&& key);
|
||||||
template<typename KeyType>
|
template<typename KeyType>
|
||||||
const_iterator find(KeyType&& key) const;
|
const_iterator find(KeyType&& key) const;
|
||||||
|
|
||||||
|
// (3)
|
||||||
|
template<typename T>
|
||||||
|
iterator find(T) = delete;
|
||||||
|
template<typename T>
|
||||||
|
const_iterator find(T) const = delete;
|
||||||
```
|
```
|
||||||
|
|
||||||
1. Finds an element in a JSON object with a key equivalent to `key`. If the element is not found or the
|
1. Finds an element in a JSON object with a key equivalent to `key`. If the element is not found or the
|
||||||
JSON value is not an object, `end()` is returned.
|
JSON value is not an object, `end()` is returned.
|
||||||
2. See 1. This overload is only available if `KeyType` is comparable with `#!cpp typename object_t::key_type` and
|
2. See 1. This overload is only available if `KeyType` is comparable with `#!cpp typename object_t::key_type` and
|
||||||
`#!cpp typename object_comparator_t::is_transparent` denotes a type.
|
`#!cpp typename object_comparator_t::is_transparent` denotes a type.
|
||||||
|
3. Deleted: this overload is only available if `T` is an integral type and is declared as deleted, so that a call with
|
||||||
|
an integer `key` (for example, `#!cpp j.find(0)`) fails to compile. Otherwise, the integer literal `0` would convert to
|
||||||
|
a null `#!cpp const char*` and, from there, to the key type, causing undefined behavior at runtime.
|
||||||
|
|
||||||
## Template parameters
|
## Template parameters
|
||||||
|
|
||||||
|
|||||||
@@ -124,7 +124,8 @@ Linear in the size of the input.
|
|||||||
!!! warning "Deprecation"
|
!!! warning "Deprecation"
|
||||||
|
|
||||||
- Overload (2) replaces calls to `from_bjdata` with a pointer and a length as first two parameters, which has been
|
- Overload (2) replaces calls to `from_bjdata` with a pointer and a length as first two parameters, which has been
|
||||||
deprecated in version 3.13.0. This overload will be removed in version 4.0.0. Please replace all calls like
|
deprecated in version 3.13.0. In version 4.0.0, this overload
|
||||||
|
will be deleted (`= delete`) rather than removed. Please replace all calls like
|
||||||
`#!cpp from_bjdata(ptr, len, ...);` with `#!cpp from_bjdata(ptr, ptr+len, ...);`.
|
`#!cpp from_bjdata(ptr, len, ...);` with `#!cpp from_bjdata(ptr, ptr+len, ...);`.
|
||||||
|
|
||||||
You should be warned by your compiler with a `-Wdeprecated-declarations` warning if you are using a deprecated
|
You should be warned by your compiler with a `-Wdeprecated-declarations` warning if you are using a deprecated
|
||||||
|
|||||||
@@ -110,7 +110,8 @@ Linear in the size of the input.
|
|||||||
!!! warning "Deprecation"
|
!!! warning "Deprecation"
|
||||||
|
|
||||||
- Overload (2) replaces calls to `from_bon8` with a pointer and a length as first two parameters, which has been
|
- Overload (2) replaces calls to `from_bon8` with a pointer and a length as first two parameters, which has been
|
||||||
deprecated in version 3.13.0. This overload will be removed in version 4.0.0. Please replace all calls like
|
deprecated in version 3.13.0. In version 4.0.0, this overload
|
||||||
|
will be deleted (`= delete`) rather than removed. Please replace all calls like
|
||||||
`#!cpp from_bon8(ptr, len, ...);` with `#!cpp from_bon8(ptr, ptr+len, ...);`.
|
`#!cpp from_bon8(ptr, len, ...);` with `#!cpp from_bon8(ptr, ptr+len, ...);`.
|
||||||
|
|
||||||
You should be warned by your compiler with a `-Wdeprecated-declarations` warning if you are using a deprecated
|
You should be warned by your compiler with a `-Wdeprecated-declarations` warning if you are using a deprecated
|
||||||
|
|||||||
@@ -126,7 +126,8 @@ Linear in the size of the input.
|
|||||||
!!! warning "Deprecation"
|
!!! warning "Deprecation"
|
||||||
|
|
||||||
- Overload (2) replaces calls to `from_bson` with a pointer and a length as first two parameters, which has been
|
- Overload (2) replaces calls to `from_bson` with a pointer and a length as first two parameters, which has been
|
||||||
deprecated in version 3.8.0. This overload will be removed in version 4.0.0. Please replace all calls like
|
deprecated in version 3.8.0. In version 4.0.0, this overload
|
||||||
|
will be deleted (`= delete`) rather than removed. Please replace all calls like
|
||||||
`#!cpp from_bson(ptr, len, ...);` with `#!cpp from_bson(ptr, ptr+len, ...);`.
|
`#!cpp from_bson(ptr, len, ...);` with `#!cpp from_bson(ptr, ptr+len, ...);`.
|
||||||
- Overload (2) replaces calls to `from_bson` with a pair of iterators as their first parameter, which has been
|
- Overload (2) replaces calls to `from_bson` with a pair of iterators as their first parameter, which has been
|
||||||
deprecated in version 3.8.0. This overload will be removed in version 4.0.0. Please replace all calls like
|
deprecated in version 3.8.0. This overload will be removed in version 4.0.0. Please replace all calls like
|
||||||
|
|||||||
@@ -135,7 +135,8 @@ Linear in the size of the input.
|
|||||||
!!! warning "Deprecation"
|
!!! warning "Deprecation"
|
||||||
|
|
||||||
- Overload (2) replaces calls to `from_cbor` with a pointer and a length as first two parameters, which has been
|
- Overload (2) replaces calls to `from_cbor` with a pointer and a length as first two parameters, which has been
|
||||||
deprecated in version 3.8.0. This overload will be removed in version 4.0.0. Please replace all calls like
|
deprecated in version 3.8.0. In version 4.0.0, this overload
|
||||||
|
will be deleted (`= delete`) rather than removed. Please replace all calls like
|
||||||
`#!cpp from_cbor(ptr, len, ...);` with `#!cpp from_cbor(ptr, ptr+len, ...);`.
|
`#!cpp from_cbor(ptr, len, ...);` with `#!cpp from_cbor(ptr, ptr+len, ...);`.
|
||||||
- Overload (2) replaces calls to `from_cbor` with a pair of iterators as their first parameter, which has been
|
- Overload (2) replaces calls to `from_cbor` with a pair of iterators as their first parameter, which has been
|
||||||
deprecated in version 3.8.0. This overload will be removed in version 4.0.0. Please replace all calls like
|
deprecated in version 3.8.0. This overload will be removed in version 4.0.0. Please replace all calls like
|
||||||
|
|||||||
@@ -127,7 +127,8 @@ Linear in the size of the input.
|
|||||||
!!! warning "Deprecation"
|
!!! warning "Deprecation"
|
||||||
|
|
||||||
- Overload (2) replaces calls to `from_msgpack` with a pointer and a length as first two parameters, which has been
|
- Overload (2) replaces calls to `from_msgpack` with a pointer and a length as first two parameters, which has been
|
||||||
deprecated in version 3.8.0. This overload will be removed in version 4.0.0. Please replace all calls like
|
deprecated in version 3.8.0. In version 4.0.0, this overload
|
||||||
|
will be deleted (`= delete`) rather than removed. Please replace all calls like
|
||||||
`#!cpp from_msgpack(ptr, len, ...);` with `#!cpp from_msgpack(ptr, ptr+len, ...);`.
|
`#!cpp from_msgpack(ptr, len, ...);` with `#!cpp from_msgpack(ptr, ptr+len, ...);`.
|
||||||
- Overload (2) replaces calls to `from_msgpack` with a pair of iterators as their first parameter, which has been
|
- Overload (2) replaces calls to `from_msgpack` with a pair of iterators as their first parameter, which has been
|
||||||
deprecated in version 3.8.0. This overload will be removed in version 4.0.0. Please replace all calls like
|
deprecated in version 3.8.0. This overload will be removed in version 4.0.0. Please replace all calls like
|
||||||
|
|||||||
@@ -125,7 +125,8 @@ Linear in the size of the input.
|
|||||||
!!! warning "Deprecation"
|
!!! warning "Deprecation"
|
||||||
|
|
||||||
- Overload (2) replaces calls to `from_ubjson` with a pointer and a length as first two parameters, which has been
|
- Overload (2) replaces calls to `from_ubjson` with a pointer and a length as first two parameters, which has been
|
||||||
deprecated in version 3.8.0. This overload will be removed in version 4.0.0. Please replace all calls like
|
deprecated in version 3.8.0. In version 4.0.0, this overload
|
||||||
|
will be deleted (`= delete`) rather than removed. Please replace all calls like
|
||||||
`#!cpp from_ubjson(ptr, len, ...);` with `#!cpp from_ubjson(ptr, ptr+len, ...);`.
|
`#!cpp from_ubjson(ptr, len, ...);` with `#!cpp from_ubjson(ptr, ptr+len, ...);`.
|
||||||
- Overload (2) replaces calls to `from_ubjson` with a pair of iterators as their first parameter, which has been
|
- Overload (2) replaces calls to `from_ubjson` with a pair of iterators as their first parameter, which has been
|
||||||
deprecated in version 3.8.0. This overload will be removed in version 4.0.0. Please replace all calls like
|
deprecated in version 3.8.0. This overload will be removed in version 4.0.0. Please replace all calls like
|
||||||
|
|||||||
@@ -62,5 +62,5 @@ same name. Hidden members remain accessible via [`as_base_class`](as_base_class.
|
|||||||
|
|
||||||
## Version history
|
## Version history
|
||||||
|
|
||||||
- Added in version 3.12.0.
|
- Added in version 3.11.3.
|
||||||
- Made a public member type in version 3.13.0; it was private before, so it could not be named outside the class.
|
- Made a public member type in version 3.13.0; it was private before, so it could not be named outside the class.
|
||||||
@@ -23,10 +23,9 @@ type to use.
|
|||||||
## Template parameters
|
## Template parameters
|
||||||
|
|
||||||
`NumberFloatType`
|
`NumberFloatType`
|
||||||
: the type to store floating-point numbers. The type must be `#!cpp float`, `#!cpp double`, or
|
: the type to store floating-point numbers. Parsing and serialization are implemented in terms of
|
||||||
`#!cpp long double`. The parser converts `#!cpp float`, `#!cpp double`, and a `#!cpp long double` that is IEEE 754
|
`#!cpp std::strtof`/`#!cpp std::strtod`/`#!cpp std::strtold` and `#!cpp std::snprintf`, so the type must be
|
||||||
binary64 itself. It converts other `#!cpp long double` formats with `#!cpp std::from_chars` where available, or
|
`#!cpp float`, `#!cpp double`, or `#!cpp long double`. The
|
||||||
with `#!cpp std::strtold` otherwise. Serialization falls back to `#!cpp std::snprintf`. The
|
|
||||||
[binary formats](../../features/binary_formats/index.md) additionally require `#!cpp float` or `#!cpp double`,
|
[binary formats](../../features/binary_formats/index.md) additionally require `#!cpp float` or `#!cpp double`,
|
||||||
because they have no encoding for `#!cpp long double`. See
|
because they have no encoding for `#!cpp long double`. See
|
||||||
[Template Parameter Requirements](../../features/types/template_parameters.md#numberfloattype).
|
[Template Parameter Requirements](../../features/types/template_parameters.md#numberfloattype).
|
||||||
|
|||||||
@@ -27,6 +27,7 @@ header. See also the [macro overview page](../../features/macros.md).
|
|||||||
|
|
||||||
- [**JSON_HAS_CPP_11**<br>**JSON_HAS_CPP_14**<br>**JSON_HAS_CPP_17**<br>**JSON_HAS_CPP_20**](json_has_cpp_11.md) - set supported C++ standard
|
- [**JSON_HAS_CPP_11**<br>**JSON_HAS_CPP_14**<br>**JSON_HAS_CPP_17**<br>**JSON_HAS_CPP_20**](json_has_cpp_11.md) - set supported C++ standard
|
||||||
- [**JSON_HAS_FILESYSTEM**<br>**JSON_HAS_EXPERIMENTAL_FILESYSTEM**](json_has_filesystem.md) - control `std::filesystem` support
|
- [**JSON_HAS_FILESYSTEM**<br>**JSON_HAS_EXPERIMENTAL_FILESYSTEM**](json_has_filesystem.md) - control `std::filesystem` support
|
||||||
|
- [**JSON_HAS_RANGE_VIEW_CONVERSION**](json_has_range_view_conversion.md) - control construction from `std::ranges` views
|
||||||
- [**JSON_HAS_RANGES**](json_has_ranges.md) - control `std::ranges` support
|
- [**JSON_HAS_RANGES**](json_has_ranges.md) - control `std::ranges` support
|
||||||
- [**JSON_HAS_STATIC_RTTI**](json_has_static_rtti.md) - control RTTI (run time type information) support
|
- [**JSON_HAS_STATIC_RTTI**](json_has_static_rtti.md) - control RTTI (run time type information) support
|
||||||
- [**JSON_HAS_STD_FORMAT**](json_has_std_format.md) - control `std::format`/`std::formatter` support
|
- [**JSON_HAS_STD_FORMAT**](json_has_std_format.md) - control `std::format`/`std::formatter` support
|
||||||
|
|||||||
@@ -49,6 +49,6 @@ The default value is detected based on preprocessor macros such as `#!cpp __cplu
|
|||||||
|
|
||||||
## Version history
|
## Version history
|
||||||
|
|
||||||
- Added in version 3.10.5.
|
- Added in version 3.10.0.
|
||||||
- Added `JSON_HAS_CPP_23` in version 3.12.0.
|
- Added `JSON_HAS_CPP_23` in version 3.12.0.
|
||||||
- Added `JSON_HAS_CPP_26` in version 3.13.0.
|
- Added `JSON_HAS_CPP_26` in version 3.13.0.
|
||||||
@@ -0,0 +1,43 @@
|
|||||||
|
# JSON_HAS_RANGE_VIEW_CONVERSION
|
||||||
|
|
||||||
|
```cpp
|
||||||
|
#define JSON_HAS_RANGE_VIEW_CONVERSION /* value */
|
||||||
|
```
|
||||||
|
|
||||||
|
This macro indicates whether a JSON array can be constructed directly from a C++20 range view (`std::ranges::view`),
|
||||||
|
such as the result of `std::views::filter` or `std::views::transform`. Possible values are `1` when supported or `0`
|
||||||
|
when unsupported.
|
||||||
|
|
||||||
|
## Default definition
|
||||||
|
|
||||||
|
The default value is `1` if [`JSON_HAS_RANGES`](json_has_ranges.md) is `1` and the compiler is not MinGW (that is,
|
||||||
|
`#!cpp __MINGW32__` is not defined), and `0` otherwise.
|
||||||
|
|
||||||
|
When the macro is not defined, the library will define it to its default value.
|
||||||
|
|
||||||
|
!!! info "Known compiler/stdlib exclusions"
|
||||||
|
|
||||||
|
- **MinGW** -- disabled, because its `std::ranges` support is incomplete ([issue #4916](https://github.com/nlohmann/json/issues/4916)).
|
||||||
|
- All toolchains for which [`JSON_HAS_RANGES`](json_has_ranges.md#default-definition) is disabled.
|
||||||
|
|
||||||
|
## Examples
|
||||||
|
|
||||||
|
??? example
|
||||||
|
|
||||||
|
The code below forces the library to disable the conversion from range views:
|
||||||
|
|
||||||
|
```cpp
|
||||||
|
#define JSON_HAS_RANGE_VIEW_CONVERSION 0
|
||||||
|
#include <nlohmann/json.hpp>
|
||||||
|
|
||||||
|
...
|
||||||
|
```
|
||||||
|
|
||||||
|
## See also
|
||||||
|
|
||||||
|
- [JSON_HAS_RANGES](json_has_ranges.md) - control `std::ranges` support
|
||||||
|
- [Constructing from a C++20 range view](../../features/conversions.md#putting-values-in) - usage of the feature
|
||||||
|
|
||||||
|
## Version history
|
||||||
|
|
||||||
|
- Added in version 3.13.0.
|
||||||
@@ -20,7 +20,7 @@ When the macro is not defined, the library will define it to its default value.
|
|||||||
|
|
||||||
- **GCC 11.1.0** — disabled (the shipped `<ranges>` header has a syntax error; [issue #4440](https://github.com/nlohmann/json/issues/4440))
|
- **GCC 11.1.0** — disabled (the shipped `<ranges>` header has a syntax error; [issue #4440](https://github.com/nlohmann/json/issues/4440))
|
||||||
- **libstdc++ < 11** — disabled (incomplete C++20 ranges support; [issue #4440](https://github.com/nlohmann/json/issues/4440))
|
- **libstdc++ < 11** — disabled (incomplete C++20 ranges support; [issue #4440](https://github.com/nlohmann/json/issues/4440))
|
||||||
- **Clang < 16 with libstdc++** — disabled (incomplete ranges support; [issue #4440](https://github.com/nlohmann/json/issues/4440))
|
- **Clang < 16 with libstdc++** — disabled (incomplete ranges support; [issue #5161](https://github.com/nlohmann/json/issues/5161))
|
||||||
- **libc++ < 160000** — disabled (incomplete C++20 ranges support; [issue #4440](https://github.com/nlohmann/json/issues/4440))
|
- **libc++ < 160000** — disabled (incomplete C++20 ranges support; [issue #4440](https://github.com/nlohmann/json/issues/4440))
|
||||||
- **nvcc (CUDA) 12.0.x and 12.1.x** — disabled (the `enable_borrowed_range` variable-template syntax triggers a parse error
|
- **nvcc (CUDA) 12.0.x and 12.1.x** — disabled (the `enable_borrowed_range` variable-template syntax triggers a parse error
|
||||||
under these two toolkit versions; fixed in CUDA 12.2; [issue #3907](https://github.com/nlohmann/json/issues/3907))
|
under these two toolkit versions; fixed in CUDA 12.2; [issue #3907](https://github.com/nlohmann/json/issues/3907))
|
||||||
@@ -44,9 +44,12 @@ When the macro is not defined, the library will define it to its default value.
|
|||||||
|
|
||||||
- [JSON_HAS_CPP_11 / JSON_HAS_CPP_14 / JSON_HAS_CPP_17 / JSON_HAS_CPP_20 / JSON_HAS_CPP_23 /
|
- [JSON_HAS_CPP_11 / JSON_HAS_CPP_14 / JSON_HAS_CPP_17 / JSON_HAS_CPP_20 / JSON_HAS_CPP_23 /
|
||||||
JSON_HAS_CPP_26](json_has_cpp_11.md) - set supported C++ standard
|
JSON_HAS_CPP_26](json_has_cpp_11.md) - set supported C++ standard
|
||||||
|
- [JSON_HAS_RANGE_VIEW_CONVERSION](json_has_range_view_conversion.md) - control construction from `std::ranges` views
|
||||||
- [JSON_HAS_STD_FORMAT](json_has_std_format.md) - a similar feature-detection macro, for `std::format`/`std::formatter`
|
- [JSON_HAS_STD_FORMAT](json_has_std_format.md) - a similar feature-detection macro, for `std::format`/`std::formatter`
|
||||||
support
|
support
|
||||||
|
|
||||||
## Version history
|
## Version history
|
||||||
|
|
||||||
- Added in version 3.11.0.
|
- Added in version 3.11.0.
|
||||||
|
- Added the exclusions for libstdc++ < 11, Clang < 16 with libstdc++, libc++ < 16, and nvcc (CUDA) 12.0.x and 12.1.x in
|
||||||
|
version 3.13.0. Before, only GCC 11.1.0 was excluded.
|
||||||
@@ -20,7 +20,10 @@ The macro does not affect:
|
|||||||
- The binary readers ([`from_cbor`](../basic_json/from_cbor.md), [`from_msgpack`](../basic_json/from_msgpack.md),
|
- The binary readers ([`from_cbor`](../basic_json/from_cbor.md), [`from_msgpack`](../basic_json/from_msgpack.md),
|
||||||
[`from_ubjson`](../basic_json/from_ubjson.md), [`from_bjdata`](../basic_json/from_bjdata.md),
|
[`from_ubjson`](../basic_json/from_ubjson.md), [`from_bjdata`](../basic_json/from_bjdata.md),
|
||||||
[`from_bson`](../basic_json/from_bson.md)): none of these formats requires a decoder to reject ill-formed UTF-8, so
|
[`from_bson`](../basic_json/from_bson.md)): none of these formats requires a decoder to reject ill-formed UTF-8, so
|
||||||
they always return the bytes unchanged.
|
by default they return the bytes unchanged (`error_handler_t::keep`), independent of this macro. Pass an
|
||||||
|
`error_handler` argument explicitly to validate or sanitize the strings they read.
|
||||||
|
- [`from_bon8`](../basic_json/from_bon8.md): BON8 always validates, because the UTF-8 lead bytes mark where a string
|
||||||
|
ends.
|
||||||
|
|
||||||
## Default definition
|
## Default definition
|
||||||
|
|
||||||
|
|||||||
@@ -190,3 +190,5 @@ void to_json(BasicJsonType& j, const B& b) {
|
|||||||
4. Added in version 3.12.0.
|
4. Added in version 3.12.0.
|
||||||
5. Added in version 3.12.0.
|
5. Added in version 3.12.0.
|
||||||
6. Added in version 3.12.0.
|
6. Added in version 3.12.0.
|
||||||
|
|
||||||
|
All six macros were changed to allow an empty member list in version 3.13.0.
|
||||||
@@ -186,3 +186,6 @@ See the examples below for the concrete generated code.
|
|||||||
1. Added in version 3.9.0.
|
1. Added in version 3.9.0.
|
||||||
2. Added in version 3.11.0.
|
2. Added in version 3.11.0.
|
||||||
3. Added in version 3.11.3.
|
3. Added in version 3.11.3.
|
||||||
|
|
||||||
|
All three macros were changed to work with any `basic_json` specialization (not only `nlohmann::json`) in version 3.12.0,
|
||||||
|
and to allow an empty member list in version 3.13.0.
|
||||||
@@ -185,3 +185,6 @@ See the examples below for the concrete generated code.
|
|||||||
1. Added in version 3.9.0.
|
1. Added in version 3.9.0.
|
||||||
2. Added in version 3.11.0.
|
2. Added in version 3.11.0.
|
||||||
3. Added in version 3.11.3.
|
3. Added in version 3.11.3.
|
||||||
|
|
||||||
|
All three macros were changed to work with any `basic_json` specialization (not only `nlohmann::json`) in version 3.12.0,
|
||||||
|
and to allow an empty member list in version 3.13.0.
|
||||||
@@ -38,4 +38,6 @@ the library.
|
|||||||
|
|
||||||
## Version history
|
## Version history
|
||||||
|
|
||||||
- Added in version 3.11.0. Changed inline namespace name in version 3.11.2.
|
- Added in version 3.11.0. Changed inline namespace name in version 3.11.2. Added the ABI tag `_dp` in
|
||||||
|
version 3.12.0, and the ABI tags `_bics`, `_psp`, `_snul`, `_sbu8`, and `_ekmo` in version 3.13.0; see
|
||||||
|
[`nlohmann` Namespace](../../features/namespace.md#structure).
|
||||||
@@ -14,7 +14,7 @@ These macros can be used to open and close the `nlohmann` namespace. See
|
|||||||
## Default definition
|
## Default definition
|
||||||
|
|
||||||
The default definitions open and close the `nlohmann` namespace. The precise definition of
|
The default definitions open and close the `nlohmann` namespace. The precise definition of
|
||||||
[`NLOHMANN_JSON_NAMESPACE_BEGIN`] varies as described [here](../../features/namespace.md#structure).
|
`NLOHMANN_JSON_NAMESPACE_BEGIN` varies as described [here](../../features/namespace.md#structure).
|
||||||
|
|
||||||
1. Default definition of `NLOHMANN_JSON_NAMESPACE_BEGIN`:
|
1. Default definition of `NLOHMANN_JSON_NAMESPACE_BEGIN`:
|
||||||
|
|
||||||
|
|||||||
@@ -10,7 +10,7 @@ The library parses, stores, and serializes JSON values in memory. It does not op
|
|||||||
files (it only reads from streams or `std::FILE*` handles that the caller has already opened), does not read environment
|
files (it only reads from streams or `std::FILE*` handles that the caller has already opened), does not read environment
|
||||||
variables, and does not implement cryptography or handle credentials.
|
variables, and does not implement cryptography or handle credentials.
|
||||||
|
|
||||||
The primary threat is therefore **untrusted input**: JSON text or binary data (BJData, BSON, CBOR, MessagePack, UBJSON)
|
The primary threat is therefore **untrusted input**: JSON text or binary data (BJData, BON8, BSON, CBOR, MessagePack, UBJSON)
|
||||||
that an attacker controls, passed to [`parse`](../api/basic_json/parse.md), [`accept`](../api/basic_json/accept.md),
|
that an attacker controls, passed to [`parse`](../api/basic_json/parse.md), [`accept`](../api/basic_json/accept.md),
|
||||||
[`sax_parse`](../api/basic_json/sax_parse.md), or one of the `from_*` functions such as
|
[`sax_parse`](../api/basic_json/sax_parse.md), or one of the `from_*` functions such as
|
||||||
[`from_cbor`](../api/basic_json/from_cbor.md). Such input may try to
|
[`from_cbor`](../api/basic_json/from_cbor.md). Such input may try to
|
||||||
|
|||||||
@@ -12,7 +12,7 @@ violations will result in a failed build.
|
|||||||
|
|
||||||
Note: C++20 modules support may hit compiler-specific issues not covered by the general compiler matrix below. See [Modules](../features/modules.md#known-issues) for known issues and workarounds.
|
Note: C++20 modules support may hit compiler-specific issues not covered by the general compiler matrix below. See [Modules](../features/modules.md#known-issues) for known issues and workarounds.
|
||||||
|
|
||||||
Note: Some modern features (like C++20 ranges or filesystem support) may be disabled on specific broken or incomplete toolchains even when standard feature-test macros indicate support. See [`JSON_HAS_RANGES`](../api/macros/json_has_ranges.md) and [`JSON_HAS_FILESYSTEM`](../api/macros/json_has_filesystem.md) for details on known exclusions.
|
Note: Some modern features (like C++20 ranges or filesystem support) may be disabled on specific broken or incomplete toolchains even when standard feature-test macros indicate support. See [`JSON_HAS_RANGES`](../api/macros/json_has_ranges.md), [`JSON_HAS_RANGE_VIEW_CONVERSION`](../api/macros/json_has_range_view_conversion.md), and [`JSON_HAS_FILESYSTEM`](../api/macros/json_has_filesystem.md) for details on known exclusions.
|
||||||
|
|
||||||
- [x] The library is compiled with 50+ different C++ compilers with different operating systems and platforms,
|
- [x] The library is compiled with 50+ different C++ compilers with different operating systems and platforms,
|
||||||
including the oldest versions known to compile the library.
|
including the oldest versions known to compile the library.
|
||||||
@@ -107,7 +107,7 @@ Note: Some modern features (like C++20 ranges or filesystem support) may be disa
|
|||||||
- [x] The library is compiled with all C++ language revisions (C++11, C++14, C++17, C++20, C++23, and C++26) to detect
|
- [x] The library is compiled with all C++ language revisions (C++11, C++14, C++17, C++20, C++23, and C++26) to detect
|
||||||
and fix language deprecations early.
|
and fix language deprecations early.
|
||||||
- [x] The library is checked for compiler warnings:
|
- [x] The library is checked for compiler warnings:
|
||||||
- On Clang, `-Weverything` is used with 8 exceptions.
|
- On Clang, `-Weverything` is used with 7 exceptions.
|
||||||
|
|
||||||
??? abstract "Clang warnings"
|
??? abstract "Clang warnings"
|
||||||
|
|
||||||
|
|||||||
@@ -217,7 +217,8 @@ json j = numbers; // [1,2,3]
|
|||||||
```
|
```
|
||||||
|
|
||||||
This requires [`JSON_HAS_RANGES`](../api/macros/json_has_ranges.md) to be enabled and is unavailable on MinGW due
|
This requires [`JSON_HAS_RANGES`](../api/macros/json_has_ranges.md) to be enabled and is unavailable on MinGW due
|
||||||
to incomplete C++20 ranges support there.
|
to incomplete C++20 ranges support there; see
|
||||||
|
[`JSON_HAS_RANGE_VIEW_CONVERSION`](../api/macros/json_has_range_view_conversion.md).
|
||||||
|
|
||||||
## Your own types
|
## Your own types
|
||||||
|
|
||||||
|
|||||||
@@ -82,6 +82,45 @@ To override the built-in check, define `JSON_HAS_FILESYSTEM` or `JSON_HAS_EXPERI
|
|||||||
|
|
||||||
See [full documentation of `JSON_HAS_FILESYSTEM` and `JSON_HAS_EXPERIMENTAL_FILESYSTEM`](../api/macros/json_has_filesystem.md).
|
See [full documentation of `JSON_HAS_FILESYSTEM` and `JSON_HAS_EXPERIMENTAL_FILESYSTEM`](../api/macros/json_has_filesystem.md).
|
||||||
|
|
||||||
|
## `JSON_HAS_RANGES`
|
||||||
|
|
||||||
|
The library uses `std::ranges` (and concepts) where available, for example, to parse from C++20 ranges and to
|
||||||
|
construct JSON arrays from range views. The library detects whether the standard library supports ranges and
|
||||||
|
disables the support on toolchains with an incomplete implementation. To override the built-in check, define
|
||||||
|
`JSON_HAS_RANGES` to `1` or `0`.
|
||||||
|
|
||||||
|
See [full documentation of `JSON_HAS_RANGES`](../api/macros/json_has_ranges.md).
|
||||||
|
|
||||||
|
## `JSON_HAS_RANGE_VIEW_CONVERSION`
|
||||||
|
|
||||||
|
When `JSON_HAS_RANGES` is enabled (and the compiler is not MinGW), a JSON array can be constructed directly from a C++20
|
||||||
|
range view such as `std::views::filter(...)`. To override the built-in check, define `JSON_HAS_RANGE_VIEW_CONVERSION` to
|
||||||
|
`1` or `0`.
|
||||||
|
|
||||||
|
See [full documentation of `JSON_HAS_RANGE_VIEW_CONVERSION`](../api/macros/json_has_range_view_conversion.md).
|
||||||
|
|
||||||
|
## `JSON_HAS_STATIC_RTTI`
|
||||||
|
|
||||||
|
The library detects whether the compiler supports run time type information (RTTI), which it needs, for instance, to
|
||||||
|
exclude `std::any` from the candidate types of the implicit conversion on C++17. To override the built-in check, define
|
||||||
|
`JSON_HAS_STATIC_RTTI` to `1` or `0`.
|
||||||
|
|
||||||
|
See [full documentation of `JSON_HAS_STATIC_RTTI`](../api/macros/json_has_static_rtti.md).
|
||||||
|
|
||||||
|
## `JSON_HAS_STD_FORMAT`
|
||||||
|
|
||||||
|
When compiling with C++20 and a standard library that provides `<format>`, the library provides a `std::formatter`
|
||||||
|
specialization for JSON values. To override the built-in check, define `JSON_HAS_STD_FORMAT` to `1` or `0`.
|
||||||
|
|
||||||
|
See [full documentation of `JSON_HAS_STD_FORMAT`](../api/macros/json_has_std_format.md).
|
||||||
|
|
||||||
|
## `JSON_HAS_THREE_WAY_COMPARISON`
|
||||||
|
|
||||||
|
When the compiler and standard library support 3-way comparison (the spaceship operator `<=>`), the library provides it
|
||||||
|
for JSON values. To override the built-in check, define `JSON_HAS_THREE_WAY_COMPARISON` to `1` or `0`.
|
||||||
|
|
||||||
|
See [full documentation of `JSON_HAS_THREE_WAY_COMPARISON`](../api/macros/json_has_three_way_comparison.md).
|
||||||
|
|
||||||
## `JSON_NOEXCEPTION`
|
## `JSON_NOEXCEPTION`
|
||||||
|
|
||||||
Exceptions can be switched off by defining the symbol `JSON_NOEXCEPTION`.
|
Exceptions can be switched off by defining the symbol `JSON_NOEXCEPTION`.
|
||||||
|
|||||||
@@ -101,3 +101,9 @@ follows:
|
|||||||
|
|
||||||
- Introduced inline namespace (`json_v3_11_0[_abi-tag]*`) in version 3.11.0.
|
- Introduced inline namespace (`json_v3_11_0[_abi-tag]*`) in version 3.11.0.
|
||||||
- Changed structure of inline namespace in version 3.11.2.
|
- Changed structure of inline namespace in version 3.11.2.
|
||||||
|
- Added ABI tag `_dp` ([`JSON_DIAGNOSTIC_POSITIONS`](../api/macros/json_diagnostic_positions.md)) in version 3.12.0.
|
||||||
|
- Added ABI tags `_bics` ([`JSON_BRACE_INIT_COPY_SEMANTICS`](../api/macros/json_brace_init_copy_semantics.md)), `_psp`
|
||||||
|
([`JSON_PRECISE_STREAM_POSITION`](../api/macros/json_precise_stream_position.md)), `_snul`
|
||||||
|
([`JSON_STRICT_NUL_HANDLING`](../api/macros/json_strict_nul_handling.md)), `_sbu8`
|
||||||
|
([`JSON_STRICT_BINARY_UTF8`](../api/macros/json_strict_binary_utf8.md)), and `_ekmo`
|
||||||
|
([`JSON_USE_OBJECTS_FOR_ENUM_KEYED_MAPS`](../api/macros/json_use_objects_for_enum_keyed_maps.md)) in version 3.13.0.
|
||||||
@@ -82,13 +82,12 @@ flowchart TD
|
|||||||
|
|
||||||
- Numbers with a decimal digit or scientific notation are always stored as `#!c double`.
|
- Numbers with a decimal digit or scientific notation are always stored as `#!c double`.
|
||||||
- The number types can be changed, see [Template number types](#template-number-types).
|
- The number types can be changed, see [Template number types](#template-number-types).
|
||||||
- The library converts integers and floating-point numbers itself, independent of the locale. Floating-point
|
- Integers are converted by the library's own digit parser. Floating-point numbers are converted with
|
||||||
numbers are correctly rounded (to nearest, ties to even). Only a `#!c long double` that is not IEEE 754 binary64
|
[`std::from_chars`](https://en.cppreference.com/w/cpp/utility/from_chars) if the library is compiled with C++17
|
||||||
(e.g., the 80-bit x87 format) is converted with `#!cpp std::from_chars` where available, or else with
|
and the standard library supports it, then with an exact fast path for `#!c double` values with few significant
|
||||||
[`std::strtold`](https://en.cppreference.com/w/cpp/string/byte/strtof). For that call, the library temporarily
|
digits, and otherwise with the locale-aware
|
||||||
replaces the `.` with the decimal point of the current locale (which may be longer than one byte, e.g., in
|
[`std::strtod`](https://en.cppreference.com/w/cpp/string/byte/strtof) (`std::strtof`/`std::strtold` for the
|
||||||
`fa_IR.UTF-8`), so the result does not depend on the locale either. Changing the locale in another thread during
|
other floating-point types). Before version 3.13.0, the conversion was realized by
|
||||||
parsing is undefined behavior of the C library, though. Before version 3.13.0, the conversion was realized by
|
|
||||||
[`std::strtoull`](https://en.cppreference.com/w/cpp/string/byte/strtoul),
|
[`std::strtoull`](https://en.cppreference.com/w/cpp/string/byte/strtoul),
|
||||||
[`std::strtoll`](https://en.cppreference.com/w/cpp/string/byte/strtol), and `std::strtod`, respectively.
|
[`std::strtoll`](https://en.cppreference.com/w/cpp/string/byte/strtol), and `std::strtod`, respectively.
|
||||||
|
|
||||||
@@ -101,10 +100,10 @@ flowchart TD
|
|||||||
### Number limits
|
### Number limits
|
||||||
|
|
||||||
- Any 64-bit signed or unsigned integer can be stored without loss of precision.
|
- Any 64-bit signed or unsigned integer can be stored without loss of precision.
|
||||||
- Numbers exceeding the limits of `#!c double` (i.e., numbers whose rounded value is not satisfying
|
- Numbers exceeding the limits of `#!c double` (i.e., numbers that after conversion via
|
||||||
|
[`std::strtod`](https://en.cppreference.com/w/cpp/string/byte/strtof) are not satisfying
|
||||||
[`std::isfinite`](https://en.cppreference.com/w/cpp/numeric/math/isfinite) such as `#!c 1E400`) will throw exception
|
[`std::isfinite`](https://en.cppreference.com/w/cpp/numeric/math/isfinite) such as `#!c 1E400`) will throw exception
|
||||||
[`json.exception.out_of_range.406`](../../home/exceptions.md#jsonexceptionout_of_range406) during parsing. Numbers too
|
[`json.exception.out_of_range.406`](../../home/exceptions.md#jsonexceptionout_of_range406) during parsing.
|
||||||
small for `#!c double` (such as `#!c 1E-400`) become zero, with the sign of the number.
|
|
||||||
- Floating-point numbers are rounded to the next number representable as `double`. For instance
|
- Floating-point numbers are rounded to the next number representable as `double`. For instance
|
||||||
`#!c 3.141592653589793238462643383279` is stored as [`0x400921fb54442d18`](https://float.exposed/0x400921fb54442d18).
|
`#!c 3.141592653589793238462643383279` is stored as [`0x400921fb54442d18`](https://float.exposed/0x400921fb54442d18).
|
||||||
This is the same behavior as the code `#!c double x = 3.141592653589793238462643383279;`.
|
This is the same behavior as the code `#!c double x = 3.141592653589793238462643383279;`.
|
||||||
|
|||||||
@@ -30,9 +30,9 @@ Requirements are split into two groups:
|
|||||||
diagnosed with dedicated error messages, and violating most of them results in a compiler error somewhere inside
|
diagnosed with dedicated error messages, and violating most of them results in a compiler error somewhere inside
|
||||||
the library. Four violations are not caught at compile time at all:
|
the library. Four violations are not caught at compile time at all:
|
||||||
|
|
||||||
- A [`StringType`](#stringtype) whose `data()` is not null-terminated compiles and silently misparses numbers
|
- A [`StringType`](#stringtype) whose `data()` is not null-terminated compiles and can silently misparse
|
||||||
stored as a `#!cpp long double` that is not IEEE 754 binary64 (e.g., the 80-bit x87 format), because the lexer
|
floating-point numbers, because the lexer may hand the buffer to `#!cpp std::strtod`, which reads up to the
|
||||||
hands the buffer to `#!cpp std::strtold`.
|
terminating null character.
|
||||||
- A stateful [`AllocatorType`](#allocatortype) compiles and silently ignores its state: allocation, deallocation,
|
- A stateful [`AllocatorType`](#allocatortype) compiles and silently ignores its state: allocation, deallocation,
|
||||||
and [`get_allocator()`](../../api/basic_json/get_allocator.md) each use a different default-constructed instance.
|
and [`get_allocator()`](../../api/basic_json/get_allocator.md) each use a different default-constructed instance.
|
||||||
- The two [cross-specialization conversions](#cross-specialization-conversions) below. These abort on an assertion
|
- The two [cross-specialization conversions](#cross-specialization-conversions) below. These abort on an assertion
|
||||||
@@ -353,21 +353,16 @@ using array_t = ArrayType<basic_json, AllocatorType<basic_json>>;
|
|||||||
### Always required
|
### Always required
|
||||||
|
|
||||||
- A member type `value_type` that is one byte wide and `char`-compatible. The library stores and processes UTF-8
|
- A member type `value_type` that is one byte wide and `char`-compatible. The library stores and processes UTF-8
|
||||||
encoded `char` data and passes `data()` to functions that take a `#!cpp const char*`, such as `#!cpp std::strtold`
|
encoded `char` data and passes `data()` to functions that take a `#!cpp const char*`, such as `#!cpp std::strtod`.
|
||||||
(only used to parse a `#!cpp long double` that is not IEEE 754 binary64, see
|
|
||||||
[`NumberFloatType`](#numberfloattype)).
|
|
||||||
`#!cpp std::wstring`, `#!cpp std::u16string`, and `#!cpp std::u32string` are **not** valid choices; see the FAQ on
|
`#!cpp std::wstring`, `#!cpp std::u16string`, and `#!cpp std::u32string` are **not** valid choices; see the FAQ on
|
||||||
[wide string handling](../../home/faq.md#wide-string-handling).
|
[wide string handling](../../home/faq.md#wide-string-handling).
|
||||||
- Constructors: default, copy, move, from `#!cpp const char*` (which must not be `#!cpp explicit`), from
|
- Constructors: default, copy, move, from `#!cpp const char*` (which must not be `#!cpp explicit`), from
|
||||||
`#!cpp (const char*, size_type)`, and from `#!cpp (size_type, char)`; and copy or move assignment.
|
`#!cpp (const char*, size_type)`, and from `#!cpp (size_type, char)`; and copy or move assignment.
|
||||||
- Member functions `size()`, `clear()`, `resize(n, c)`, `data()`, `push_back(char)`, and `operator[]`
|
- Member functions `size()`, `clear()`, `resize(n, c)`, `data()`, `push_back(char)`, and `operator[]`
|
||||||
(const and non-const, returning references). `c_str()` and `back()` are **not** required.
|
(const and non-const, returning references). `c_str()` and `back()` are **not** required.
|
||||||
- `data()` must return a pointer to a contiguous, **null-terminated** buffer. `#!cpp float`, `#!cpp double`, and a
|
- `data()` must return a pointer to a contiguous, **null-terminated** buffer -- the parser may hand it to
|
||||||
`#!cpp long double` that is IEEE 754 binary64 are converted by the library itself and do not depend on this. For any
|
`#!cpp std::strtod`, which reads up to the null character. A type whose `data()` is not null-terminated does not
|
||||||
other `NumberFloatType` (a `#!cpp long double` of another format), the parser falls back to `#!cpp std::strtold` when
|
fail to compile; it can silently misparse floating-point numbers.
|
||||||
`#!cpp std::from_chars` is not available or declines the token, and `std::strtold` reads up to the null character. A type whose `data()`
|
|
||||||
is not null-terminated does not fail to compile; with such a `NumberFloatType` it can silently misparse
|
|
||||||
floating-point numbers.
|
|
||||||
- `append(const char*, size_type)`, used by [`dump`](../../api/basic_json/dump.md), and `append(const StringType&)`,
|
- `append(const char*, size_type)`, used by [`dump`](../../api/basic_json/dump.md), and `append(const StringType&)`,
|
||||||
used by the CBOR reader for indefinite-length strings. The library's internal string concatenation additionally has
|
used by the CBOR reader for indefinite-length strings. The library's internal string concatenation additionally has
|
||||||
to append a `#!cpp char` and a `#!cpp const char*`; for each it selects between `append(arg)`, `#!cpp operator+=`,
|
to append a `#!cpp char` and a `#!cpp const char*`; for each it selects between `append(arg)`, `#!cpp operator+=`,
|
||||||
@@ -546,10 +541,9 @@ therefore silently changes parse results rather than raising an error. See
|
|||||||
|
|
||||||
`NumberFloatType` must be one of `#!cpp float`, `#!cpp double`, or `#!cpp long double`:
|
`NumberFloatType` must be one of `#!cpp float`, `#!cpp double`, or `#!cpp long double`:
|
||||||
|
|
||||||
- The [parser](../parsing/index.md) converts number literals to `#!cpp float`, `#!cpp double`, and a
|
- The [parser](../parsing/index.md) converts number literals with `#!cpp std::from_chars` or, as a fallback, with
|
||||||
`#!cpp long double` that is IEEE 754 binary64 itself; other `#!cpp long double` formats are converted with
|
`#!cpp std::strtof`, `#!cpp std::strtod`, or `#!cpp std::strtold`; the library provides overloads for exactly these
|
||||||
`#!cpp std::from_chars` where available, or with `#!cpp std::strtold`. The library provides overloads for exactly
|
three types.
|
||||||
these three types.
|
|
||||||
- [`dump`](../../api/basic_json/dump.md) falls back to `#!cpp std::snprintf` with the `%g` and `%Lg` conversion
|
- [`dump`](../../api/basic_json/dump.md) falls back to `#!cpp std::snprintf` with the `%g` and `%Lg` conversion
|
||||||
specifiers, for which the library likewise provides only `#!cpp double` and `#!cpp long double` overloads
|
specifiers, for which the library likewise provides only `#!cpp double` and `#!cpp long double` overloads
|
||||||
(`#!cpp float` is promoted to `#!cpp double`).
|
(`#!cpp float` is promoted to `#!cpp double`).
|
||||||
|
|||||||
@@ -34,7 +34,7 @@ flowchart LR
|
|||||||
|
|
||||||
- **JSON text** is read by an [input adapter](#input-adapters), tokenized by the lexer, and turned into SAX events by
|
- **JSON text** is read by an [input adapter](#input-adapters), tokenized by the lexer, and turned into SAX events by
|
||||||
the parser.
|
the parser.
|
||||||
- **Binary formats** (BJData, BSON, CBOR, MessagePack, UBJSON) are read by an input adapter and turned into the same SAX
|
- **Binary formats** (BJData, BON8, BSON, CBOR, MessagePack, UBJSON) are read by an input adapter and turned into the same SAX
|
||||||
events by the `binary_reader`.
|
events by the `binary_reader`.
|
||||||
- A [SAX consumer](#sax-interface) receives the events. The one used by [`parse`](../api/basic_json/parse.md) builds a
|
- A [SAX consumer](#sax-interface) receives the events. The one used by [`parse`](../api/basic_json/parse.md) builds a
|
||||||
`basic_json` value tree.
|
`basic_json` value tree.
|
||||||
|
|||||||
@@ -6,7 +6,7 @@ There are myriads of [JSON](https://json.org) libraries out there, and each may
|
|||||||
|
|
||||||
- **Trivial integration**. Our whole code consists of a single header file [`json.hpp`](https://github.com/nlohmann/json/blob/develop/single_include/nlohmann/json.hpp). That's it. No library, no subproject, no dependencies, no complex build system. The class is written in vanilla C++11. All in all, everything should require no adjustment of your compiler flags or project settings.
|
- **Trivial integration**. Our whole code consists of a single header file [`json.hpp`](https://github.com/nlohmann/json/blob/develop/single_include/nlohmann/json.hpp). That's it. No library, no subproject, no dependencies, no complex build system. The class is written in vanilla C++11. All in all, everything should require no adjustment of your compiler flags or project settings.
|
||||||
|
|
||||||
- **Serious testing**. Our class is heavily [unit-tested](https://github.com/nlohmann/json/tree/develop/tests/src) and covers [100%](https://coveralls.io/r/nlohmann/json) of the code, including all exceptional behavior. Furthermore, we checked with [Valgrind](http://valgrind.org) and the [Clang Sanitizers](https://clang.llvm.org/docs/index.html) that there are no memory leaks. [Google OSS-Fuzz](https://github.com/google/oss-fuzz/tree/master/projects/json) additionally runs fuzz tests against all parsers 24/7, effectively executing billions of tests so far. To maintain high quality, the project is following the [OpenSSF Best Practices](https://www.bestpractices.dev/projects/289).
|
- **Serious testing**. Our class is heavily [unit-tested](https://github.com/nlohmann/json/tree/develop/tests/src) and covers [100%](https://coveralls.io/r/nlohmann/json) of the code, including all exceptional behavior. Furthermore, we checked with [Valgrind](https://valgrind.org) and the [Clang Sanitizers](https://clang.llvm.org/docs/index.html) that there are no memory leaks. [Google OSS-Fuzz](https://github.com/google/oss-fuzz/tree/master/projects/json) additionally runs fuzz tests against all parsers 24/7, effectively executing billions of tests so far. To maintain high quality, the project is following the [OpenSSF Best Practices](https://www.bestpractices.dev/projects/289).
|
||||||
|
|
||||||
Other aspects were not so important to us:
|
Other aspects were not so important to us:
|
||||||
|
|
||||||
@@ -14,4 +14,4 @@ Other aspects were not so important to us:
|
|||||||
|
|
||||||
- **Speed**. There are certainly [faster JSON libraries](https://github.com/miloyip/nativejson-benchmark#parsing-time) out there. However, if your goal is to speed up your development by adding JSON support with a single header, then this library is the way to go. If you know how to use a `std::vector` or `std::map`, you are already set.
|
- **Speed**. There are certainly [faster JSON libraries](https://github.com/miloyip/nativejson-benchmark#parsing-time) out there. However, if your goal is to speed up your development by adding JSON support with a single header, then this library is the way to go. If you know how to use a `std::vector` or `std::map`, you are already set.
|
||||||
|
|
||||||
See the [contribution guidelines](https://github.com/nlohmann/json/blob/master/.github/CONTRIBUTING.md#please-dont) for more information.
|
See the [contribution guidelines](https://github.com/nlohmann/json/blob/develop/.github/CONTRIBUTING.md#please-dont) for more information.
|
||||||
@@ -104,7 +104,7 @@ See [documentation of `JSON_DIAGNOSTICS`](../api/macros/json_diagnostics.md) for
|
|||||||
## Parse errors
|
## Parse errors
|
||||||
|
|
||||||
The library throws this exception when a parse error occurs. Parse errors
|
The library throws this exception when a parse error occurs. Parse errors
|
||||||
can occur during the deserialization of JSON text, CBOR, MessagePack, as well
|
can occur during the deserialization of JSON text or of one of the binary formats (BJData, BON8, BSON, CBOR, MessagePack, UBJSON), as well
|
||||||
as when using JSON Patch.
|
as when using JSON Patch.
|
||||||
|
|
||||||
Exceptions have ids 1xx.
|
Exceptions have ids 1xx.
|
||||||
@@ -190,7 +190,7 @@ This error indicates a syntax error while deserializing a JSON text. The error m
|
|||||||
!!! tip
|
!!! tip
|
||||||
|
|
||||||
- Make sure the input is correctly read. Try to write the input to standard output to check if, for instance, the input file was successfully opened.
|
- Make sure the input is correctly read. Try to write the input to standard output to check if, for instance, the input file was successfully opened.
|
||||||
- Paste the input to a JSON validator like <http://jsonlint.com> or a tool like [jq](https://stedolan.github.io/jq/).
|
- Paste the input to a JSON validator like <https://jsonlint.com> or a tool like [jq](https://jqlang.github.io/jq/).
|
||||||
|
|
||||||
### json.exception.parse_error.102
|
### json.exception.parse_error.102
|
||||||
|
|
||||||
|
|||||||
@@ -20,4 +20,4 @@ The class contains a slightly modified version of the Grisu2 algorithm from Flor
|
|||||||
|
|
||||||
The class contains a copy of [Hedley](https://nemequ.github.io/hedley/) from Evan Nemerson which is licensed as [CC0-1.0](https://creativecommons.org/publicdomain/zero/1.0/).
|
The class contains a copy of [Hedley](https://nemequ.github.io/hedley/) from Evan Nemerson which is licensed as [CC0-1.0](https://creativecommons.org/publicdomain/zero/1.0/).
|
||||||
|
|
||||||
The class contains an adapted version of the Eisel-Lemire algorithm, its table of powers of five, and its digit comparison for long numbers from [fast_float](https://github.com/fastfloat/fast_float) by Daniel Lemire and contributors, which is available under the [MIT License](https://opensource.org/licenses/MIT) (used here), the Apache 2.0 License, and the Boost Software License. Copyright © 2021 The fast_float authors
|
The class contains an adapted version of the Eisel-Lemire algorithm and its table of powers of five from [fast_float](https://github.com/fastfloat/fast_float) by Daniel Lemire and contributors, which is available under the [MIT License](https://opensource.org/licenses/MIT) (used here), the Apache 2.0 License, and the Boost Software License. Copyright © 2021 The fast_float authors
|
||||||
@@ -26,7 +26,7 @@ Fixes bugs found in 3.11.3 and adds several features. All changes are backward-c
|
|||||||
[BJData](../features/binary_formats/bjdata.md) draft 3 and unsigned 64-bit integers for
|
[BJData](../features/binary_formats/bjdata.md) draft 3 and unsigned 64-bit integers for
|
||||||
[BSON](../features/binary_formats/bson.md).
|
[BSON](../features/binary_formats/bson.md).
|
||||||
- Adds multidimensional C-array conversion and UTF-8 encoded `std::filesystem::path` conversions, and
|
- Adds multidimensional C-array conversion and UTF-8 encoded `std::filesystem::path` conversions, and
|
||||||
lowers the minimum [CMake](../integration/cmake.md) version to allow CMake 4.0.
|
raises the minimum [CMake](../integration/cmake.md) version to 3.5 and supports CMake 4.0.
|
||||||
|
|
||||||
[Full release notes](https://github.com/nlohmann/json/releases/tag/v3.12.0).
|
[Full release notes](https://github.com/nlohmann/json/releases/tag/v3.12.0).
|
||||||
|
|
||||||
|
|||||||
@@ -2,8 +2,8 @@ cmake_minimum_required(VERSION 3.15)
|
|||||||
|
|
||||||
include("cmake/HunterGate.cmake")
|
include("cmake/HunterGate.cmake")
|
||||||
HunterGate(
|
HunterGate(
|
||||||
URL "https://github.com/cpp-pm/hunter/archive/v0.23.297.tar.gz"
|
URL "https://github.com/cpp-pm/hunter/archive/v0.26.12.tar.gz"
|
||||||
SHA1 "3319fe6a3b08090df7df98dee75134d68e2ef5a3"
|
SHA1 "6498c5d0dec25d7fffb2b0574ebaf265179b894d"
|
||||||
)
|
)
|
||||||
|
|
||||||
project(json_example)
|
project(json_example)
|
||||||
|
|||||||
@@ -2,12 +2,30 @@
|
|||||||
|
|
||||||
# Creates a `<path>.md` sibling of each HTML output (for example,
|
# Creates a `<path>.md` sibling of each HTML output (for example,
|
||||||
# `features/comments/` becomes `features/comments.md`) so agents and tools can
|
# `features/comments/` becomes `features/comments.md`) so agents and tools can
|
||||||
# fetch the raw Markdown directly instead of parsing rendered HTML.
|
# fetch the raw Markdown directly instead of parsing rendered HTML. The
|
||||||
|
# `--8<-- "path"` lines of pymdownx.snippets are expanded with the extension's
|
||||||
|
# own preprocessor and the settings from mkdocs.yml, so the copies contain the
|
||||||
|
# included example code and files instead of the include directives.
|
||||||
|
|
||||||
|
import io
|
||||||
import os
|
import os
|
||||||
import shutil
|
|
||||||
|
import markdown
|
||||||
|
from pymdownx.snippets import SnippetMissingError
|
||||||
|
|
||||||
_pages = []
|
_pages = []
|
||||||
|
_snippets = None
|
||||||
|
|
||||||
|
|
||||||
|
def on_config(config):
|
||||||
|
global _snippets
|
||||||
|
md = markdown.Markdown(
|
||||||
|
extensions=["pymdownx.snippets"],
|
||||||
|
extension_configs={"pymdownx.snippets": config["mdx_configs"].get("pymdownx.snippets", {})},
|
||||||
|
)
|
||||||
|
_snippets = md.preprocessors["snippet"]
|
||||||
|
_snippets.auto_append = [] # the glossary is only needed to render abbreviations
|
||||||
|
return config
|
||||||
|
|
||||||
|
|
||||||
def on_files(files, config):
|
def on_files(files, config):
|
||||||
@@ -22,4 +40,11 @@ def on_post_build(config):
|
|||||||
url = file.url.rstrip("/")
|
url = file.url.rstrip("/")
|
||||||
target = os.path.join(site_dir, (url or "index") + ".md")
|
target = os.path.join(site_dir, (url or "index") + ".md")
|
||||||
os.makedirs(os.path.dirname(target), exist_ok=True)
|
os.makedirs(os.path.dirname(target), exist_ok=True)
|
||||||
shutil.copyfile(file.abs_src_path, target)
|
with io.open(file.abs_src_path, encoding="utf-8", newline="") as source:
|
||||||
|
text = source.read()
|
||||||
|
try:
|
||||||
|
text = "\n".join(_snippets.run(text.split("\n")))
|
||||||
|
except (SnippetMissingError, OSError):
|
||||||
|
pass # keep the include directives; the regular build reports the missing file
|
||||||
|
with io.open(target, "w", encoding="utf-8", newline="") as copy:
|
||||||
|
copy.write(text)
|
||||||
@@ -1,7 +1,7 @@
|
|||||||
<!-- https://squidfunk.github.io/mkdocs-material/reference/tooltips/#adding-a-glossary -->
|
<!-- https://squidfunk.github.io/mkdocs-material/reference/tooltips/#adding-a-glossary -->
|
||||||
|
|
||||||
*[ADL]: Argument-dependent lookup
|
*[ADL]: Argument-dependent lookup
|
||||||
*[API]: Application Programming Interfaces
|
*[API]: Application Programming Interface
|
||||||
*[ASCII]: American Standard Code for Information Interchange
|
*[ASCII]: American Standard Code for Information Interchange
|
||||||
*[BDFL]: Benevolent Dictator for Life
|
*[BDFL]: Benevolent Dictator for Life
|
||||||
*[BJData]: Binary JData
|
*[BJData]: Binary JData
|
||||||
|
|||||||
@@ -299,6 +299,7 @@ nav:
|
|||||||
- 'JSON_DISABLE_TUPLE_REFERENCE_CONVERSION': api/macros/json_disable_tuple_reference_conversion.md
|
- 'JSON_DISABLE_TUPLE_REFERENCE_CONVERSION': api/macros/json_disable_tuple_reference_conversion.md
|
||||||
- 'JSON_HAS_CPP_11, JSON_HAS_CPP_14, JSON_HAS_CPP_17, JSON_HAS_CPP_20, JSON_HAS_CPP_23, JSON_HAS_CPP_26': api/macros/json_has_cpp_11.md
|
- 'JSON_HAS_CPP_11, JSON_HAS_CPP_14, JSON_HAS_CPP_17, JSON_HAS_CPP_20, JSON_HAS_CPP_23, JSON_HAS_CPP_26': api/macros/json_has_cpp_11.md
|
||||||
- 'JSON_HAS_EXPERIMENTAL_FILESYSTEM, JSON_HAS_FILESYSTEM': api/macros/json_has_filesystem.md
|
- 'JSON_HAS_EXPERIMENTAL_FILESYSTEM, JSON_HAS_FILESYSTEM': api/macros/json_has_filesystem.md
|
||||||
|
- 'JSON_HAS_RANGE_VIEW_CONVERSION': api/macros/json_has_range_view_conversion.md
|
||||||
- 'JSON_HAS_RANGES': api/macros/json_has_ranges.md
|
- 'JSON_HAS_RANGES': api/macros/json_has_ranges.md
|
||||||
- 'JSON_HAS_STATIC_RTTI': api/macros/json_has_static_rtti.md
|
- 'JSON_HAS_STATIC_RTTI': api/macros/json_has_static_rtti.md
|
||||||
- 'JSON_HAS_STD_FORMAT': api/macros/json_has_std_format.md
|
- 'JSON_HAS_STD_FORMAT': api/macros/json_has_std_format.md
|
||||||
|
|||||||
@@ -9,9 +9,8 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include <cstdint> // uint64_t
|
#include <cstdint> // uint64_t
|
||||||
#include <cstring> // memcpy
|
#if !defined(__SIZEOF_INT128__) && defined(_MSC_VER) && (defined(_M_X64) || defined(_M_ARM64))
|
||||||
#if defined(_MSC_VER) && (defined(_M_X64) || defined(_M_ARM64)) && (!defined(__SIZEOF_INT128__) || (!defined(__GNUC__) && !defined(__clang__)))
|
#include <intrin0.h> // __umulh, _umul128
|
||||||
#include <intrin0.h> // __umulh, _umul128, _BitScanForward64, _BitScanReverse64
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include <nlohmann/detail/abi_macros.hpp>
|
#include <nlohmann/detail/abi_macros.hpp>
|
||||||
@@ -29,10 +28,6 @@ inline int count_leading_zeros(std::uint64_t x) noexcept
|
|||||||
{
|
{
|
||||||
#if defined(__GNUC__) || defined(__clang__)
|
#if defined(__GNUC__) || defined(__clang__)
|
||||||
return __builtin_clzll(x);
|
return __builtin_clzll(x);
|
||||||
#elif defined(_MSC_VER) && (defined(_M_X64) || defined(_M_ARM64))
|
|
||||||
unsigned long index = 0; // NOLINT(runtime/int): the type _BitScan*64 takes
|
|
||||||
_BitScanReverse64(&index, x);
|
|
||||||
return 63 - static_cast<int>(index);
|
|
||||||
#else
|
#else
|
||||||
int n = 0;
|
int n = 0;
|
||||||
for (int shift = 32; shift != 0; shift >>= 1)
|
for (int shift = 32; shift != 0; shift >>= 1)
|
||||||
@@ -47,29 +42,6 @@ inline int count_leading_zeros(std::uint64_t x) noexcept
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
/// number of trailing zero bits of x (x != 0)
|
|
||||||
inline int count_trailing_zeros(std::uint64_t x) noexcept
|
|
||||||
{
|
|
||||||
#if defined(__GNUC__) || defined(__clang__)
|
|
||||||
return __builtin_ctzll(x);
|
|
||||||
#elif defined(_MSC_VER) && (defined(_M_X64) || defined(_M_ARM64))
|
|
||||||
unsigned long index = 0; // NOLINT(runtime/int): the type _BitScan*64 takes
|
|
||||||
_BitScanForward64(&index, x);
|
|
||||||
return static_cast<int>(index);
|
|
||||||
#else
|
|
||||||
int n = 0;
|
|
||||||
for (int shift = 32; shift != 0; shift >>= 1)
|
|
||||||
{
|
|
||||||
if ((x << (64 - shift)) == 0)
|
|
||||||
{
|
|
||||||
n += shift;
|
|
||||||
x >>= shift;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return n;
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
/// the 128-bit product of two 64-bit numbers
|
/// the 128-bit product of two 64-bit numbers
|
||||||
struct uint128_parts
|
struct uint128_parts
|
||||||
{
|
{
|
||||||
@@ -103,26 +75,15 @@ inline uint128_parts full_multiplication(std::uint64_t a, std::uint64_t b) noexc
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
/// eight bytes as a little-endian word (a single load on little-endian targets)
|
/// eight bytes as a little-endian word (compilers fold this into one load on
|
||||||
inline std::uint64_t read_eight_bytes(const unsigned char* b) noexcept
|
/// little-endian targets)
|
||||||
|
inline std::uint64_t read_eight_bytes(const char* p) noexcept
|
||||||
{
|
{
|
||||||
#if defined(_MSC_VER) || defined(__x86_64__) || defined(__i386__) || (defined(__BYTE_ORDER__) && defined(__ORDER_LITTLE_ENDIAN__) && __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__)
|
const auto* b = reinterpret_cast<const unsigned char*>(p); // NOLINT(cppcoreguidelines-pro-type-reinterpret-cast)
|
||||||
// the byte order already matches (all MSVC targets are little-endian)
|
|
||||||
std::uint64_t result = 0;
|
|
||||||
std::memcpy(&result, b, sizeof(result));
|
|
||||||
return result;
|
|
||||||
#else
|
|
||||||
return static_cast<std::uint64_t>(b[0]) | (static_cast<std::uint64_t>(b[1]) << 8u)
|
return static_cast<std::uint64_t>(b[0]) | (static_cast<std::uint64_t>(b[1]) << 8u)
|
||||||
| (static_cast<std::uint64_t>(b[2]) << 16u) | (static_cast<std::uint64_t>(b[3]) << 24u)
|
| (static_cast<std::uint64_t>(b[2]) << 16u) | (static_cast<std::uint64_t>(b[3]) << 24u)
|
||||||
| (static_cast<std::uint64_t>(b[4]) << 32u) | (static_cast<std::uint64_t>(b[5]) << 40u)
|
| (static_cast<std::uint64_t>(b[4]) << 32u) | (static_cast<std::uint64_t>(b[5]) << 40u)
|
||||||
| (static_cast<std::uint64_t>(b[6]) << 48u) | (static_cast<std::uint64_t>(b[7]) << 56u);
|
| (static_cast<std::uint64_t>(b[6]) << 48u) | (static_cast<std::uint64_t>(b[7]) << 56u);
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
/// eight bytes as a little-endian word
|
|
||||||
inline std::uint64_t read_eight_bytes(const char* p) noexcept
|
|
||||||
{
|
|
||||||
return read_eight_bytes(reinterpret_cast<const unsigned char*>(p)); // NOLINT(cppcoreguidelines-pro-type-reinterpret-cast)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace detail
|
} // namespace detail
|
||||||
|
|||||||
@@ -221,44 +221,6 @@ class lexer : public lexer_base<BasicJsonType>
|
|||||||
// scan functions
|
// scan functions
|
||||||
/////////////////////
|
/////////////////////
|
||||||
|
|
||||||
/// contiguous input: try to decode the 4 hex digits following `\\u`
|
|
||||||
/// directly from the input buffer via hex_codepoint(), instead of 4 calls
|
|
||||||
/// to get(). On success, advances the adapter and the position counters
|
|
||||||
/// exactly as those 4 get() calls would (a hex digit is never '\n', so
|
|
||||||
/// only the flat counters move) and leaves @a current holding the last of
|
|
||||||
/// the 4 digits, just as the last such get() would; the codepoint is
|
|
||||||
/// written to @a out. Makes no state change and returns false - for a
|
|
||||||
/// pending unget, fewer than 4 remaining bytes, or any of the 4 bytes not
|
|
||||||
/// being a hex digit - so the caller falls back unchanged to the
|
|
||||||
/// per-character loop, which then reports the same diagnostic (stopping
|
|
||||||
/// at the first invalid digit) as before this optimization.
|
|
||||||
bool get_codepoint_bulk(std::true_type /*bulk*/, int& out)
|
|
||||||
{
|
|
||||||
if (next_unget || ia.bulk_remaining() < 4)
|
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
const char_type* const raw = ia.bulk_data();
|
|
||||||
const int codepoint = hex_codepoint(reinterpret_cast<const unsigned char*>(raw));
|
|
||||||
if (codepoint < 0)
|
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
ia.bulk_skip(4);
|
|
||||||
// a hex digit is never a newline, so only the flat counters advance
|
|
||||||
position.chars_read_total += 4;
|
|
||||||
position.chars_read_current_line += 4;
|
|
||||||
current = char_traits<char_type>::to_int_type(raw[3]);
|
|
||||||
out = codepoint;
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// streaming input: no bulk fast path
|
|
||||||
bool get_codepoint_bulk(std::false_type /*bulk*/, int& /*out*/) const noexcept
|
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
@brief get codepoint from 4 hex characters following `\\u`
|
@brief get codepoint from 4 hex characters following `\\u`
|
||||||
|
|
||||||
@@ -278,14 +240,6 @@ class lexer : public lexer_base<BasicJsonType>
|
|||||||
{
|
{
|
||||||
// this function only makes sense after reading `\u`
|
// this function only makes sense after reading `\u`
|
||||||
JSON_ASSERT(current == 'u');
|
JSON_ASSERT(current == 'u');
|
||||||
|
|
||||||
// contiguous input: decode all 4 hex digits directly from the buffer
|
|
||||||
int fast_codepoint = 0;
|
|
||||||
if (get_codepoint_bulk(std::integral_constant<bool, bulk_scan> {}, fast_codepoint))
|
|
||||||
{
|
|
||||||
return fast_codepoint;
|
|
||||||
}
|
|
||||||
|
|
||||||
int codepoint = 0;
|
int codepoint = 0;
|
||||||
|
|
||||||
const auto factors = { 12u, 8u, 4u, 0u };
|
const auto factors = { 12u, 8u, 4u, 0u };
|
||||||
@@ -1090,11 +1044,9 @@ class lexer : public lexer_base<BasicJsonType>
|
|||||||
token_type::parse_error otherwise
|
token_type::parse_error otherwise
|
||||||
|
|
||||||
@note The scanner is independent of the current locale: token_buffer
|
@note The scanner is independent of the current locale: token_buffer
|
||||||
always holds `.`. The conversion of float and double does not use
|
always holds `.`. Only the std::strtod fallback of convert_number()
|
||||||
the locale either. Only the std::strtold fallback of
|
depends on the locale, and it looks up the decimal point right
|
||||||
convert_number() for long double formats other than binary64
|
before converting (see detail::convert_float_locale_aware()).
|
||||||
depends on it, and it looks up the decimal point right before
|
|
||||||
converting (see detail::convert_float_locale_aware()).
|
|
||||||
*/
|
*/
|
||||||
token_type scan_number() // lgtm [cpp/use-of-goto] `goto` is used in this function to implement the number-parsing state machine described above. By design, any finite input will eventually reach the "done" state or return token_type::parse_error. In each intermediate state, 1 byte of the input is appended to the token_buffer vector, and only the already initialized variables token_buffer, number_type, and error_message are manipulated.
|
token_type scan_number() // lgtm [cpp/use-of-goto] `goto` is used in this function to implement the number-parsing state machine described above. By design, any finite input will eventually reach the "done" state or return token_type::parse_error. In each intermediate state, 1 byte of the input is appended to the token_buffer vector, and only the already initialized variables token_buffer, number_type, and error_message are manipulated.
|
||||||
{
|
{
|
||||||
@@ -1107,7 +1059,7 @@ class lexer : public lexer_base<BasicJsonType>
|
|||||||
|
|
||||||
// offset just past the last mantissa byte in token_buffer (i.e. the
|
// offset just past the last mantissa byte in token_buffer (i.e. the
|
||||||
// index of 'e'/'E', or the whole token when there is no exponent).
|
// index of 'e'/'E', or the whole token when there is no exponent).
|
||||||
// convert_number() uses it to split the token; npos means
|
// convert_number() uses it to count significant digits; npos means
|
||||||
// "not seen an exponent yet" and is resolved at scan_number_done
|
// "not seen an exponent yet" and is resolved at scan_number_done
|
||||||
std::size_t mantissa_end = std::string::npos;
|
std::size_t mantissa_end = std::string::npos;
|
||||||
|
|
||||||
@@ -1437,8 +1389,8 @@ scan_number_done:
|
|||||||
@param[in] mantissa_end offset just past the last mantissa byte in
|
@param[in] mantissa_end offset just past the last mantissa byte in
|
||||||
token_buffer (the index of 'e'/'E', or
|
token_buffer (the index of 'e'/'E', or
|
||||||
token_buffer.size() when there is no exponent);
|
token_buffer.size() when there is no exponent);
|
||||||
with decimal_point_position, it locates the parts
|
used to skip Clinger's fast path when it cannot
|
||||||
of a float token without scanning it again
|
possibly succeed - see detail::mantissa_fits_clinger()
|
||||||
*/
|
*/
|
||||||
token_type convert_number(token_type number_type, std::size_t mantissa_end)
|
token_type convert_number(token_type number_type, std::size_t mantissa_end)
|
||||||
{
|
{
|
||||||
@@ -1492,11 +1444,10 @@ scan_number_done:
|
|||||||
}
|
}
|
||||||
|
|
||||||
// this code is reached if we parse a floating-point number or if an
|
// this code is reached if we parse a floating-point number or if an
|
||||||
// integer conversion above overflowed. float and double (and long
|
// integer conversion above overflowed. Prefer std::from_chars
|
||||||
// double where it is binary64) are converted by the library itself,
|
// (Eisel-Lemire, locale-independent, correctly rounded) when available;
|
||||||
// correctly rounded and independent of the locale; other long double
|
// otherwise the exact Clinger fast path (double only); otherwise the
|
||||||
// formats use std::from_chars when available, otherwise the
|
// locale-aware strtof/strtod/strtold.
|
||||||
// locale-aware strtold.
|
|
||||||
if (convert_float_fast(num_begin, num_end, decimal_point_position, mantissa_end, value_float))
|
if (convert_float_fast(num_begin, num_end, decimal_point_position, mantissa_end, value_float))
|
||||||
{
|
{
|
||||||
return token_type::value_float;
|
return token_type::value_float;
|
||||||
|
|||||||
File diff suppressed because it is too large.
Load diff
@@ -22,10 +22,6 @@ namespace detail
|
|||||||
constexpr std::int64_t pow5_128_smallest_power = -342;
|
constexpr std::int64_t pow5_128_smallest_power = -342;
|
||||||
constexpr std::int64_t pow5_128_largest_power = 308;
|
constexpr std::int64_t pow5_128_largest_power = 308;
|
||||||
|
|
||||||
// every entry of pow5_128() holds two 64-bit halves of 5^q, one per covered power of 5
|
|
||||||
static_assert((pow5_128_largest_power - pow5_128_smallest_power + 1) * 2 == 1302,
|
|
||||||
"pow5_128_smallest_power/pow5_128_largest_power must match the size of the pow5_128() table");
|
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
@brief 128-bit approximations of 5^q for q in [-342, 308]
|
@brief 128-bit approximations of 5^q for q in [-342, 308]
|
||||||
|
|
||||||
|
|||||||
@@ -8,12 +8,10 @@
|
|||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include <array> // array
|
|
||||||
#include <cstddef> // size_t
|
#include <cstddef> // size_t
|
||||||
#include <cstdint> // uint64_t, uint8_t
|
#include <cstdint> // uint64_t
|
||||||
#include <cstring> // memcpy
|
#include <cstring> // memcpy
|
||||||
|
|
||||||
#include <nlohmann/detail/bit_ops.hpp>
|
|
||||||
#include <nlohmann/detail/macro_scope.hpp>
|
#include <nlohmann/detail/macro_scope.hpp>
|
||||||
|
|
||||||
// Optional SIMD backend for bulk UTF-8 validation. This is an opt-in external
|
// Optional SIMD backend for bulk UTF-8 validation. This is an opt-in external
|
||||||
@@ -71,12 +69,18 @@ inline std::size_t find_string_special(const unsigned char* data, std::size_t n)
|
|||||||
std::size_t i = 0;
|
std::size_t i = 0;
|
||||||
for (; i + 8 <= n; i += 8)
|
for (; i + 8 <= n; i += 8)
|
||||||
{
|
{
|
||||||
const std::uint64_t special = swar_string_special(read_eight_bytes(data + i));
|
std::uint64_t word = 0;
|
||||||
if (special != 0)
|
std::memcpy(&word, data + i, sizeof(word));
|
||||||
|
if (swar_string_special(word) != 0)
|
||||||
{
|
{
|
||||||
// the lowest flagged byte is the first special one: the borrows of
|
// a special byte is in this word; locate it (endian-agnostic)
|
||||||
// the subtractions can only flag bytes above a true hit
|
for (std::size_t j = 0; j < 8; ++j)
|
||||||
return i + (static_cast<std::size_t>(count_trailing_zeros(special)) / 8);
|
{
|
||||||
|
if (is_string_special(data[i + j]))
|
||||||
|
{
|
||||||
|
return i + j;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
for (; i < n; ++i)
|
for (; i < n; ++i)
|
||||||
@@ -110,7 +114,8 @@ inline std::size_t find_ascii_copyable_run(const unsigned char* data, std::size_
|
|||||||
std::size_t i = 0;
|
std::size_t i = 0;
|
||||||
for (; i + 8 <= n; i += 8)
|
for (; i + 8 <= n; i += 8)
|
||||||
{
|
{
|
||||||
const std::uint64_t v = read_eight_bytes(data + i);
|
std::uint64_t v = 0;
|
||||||
|
std::memcpy(&v, data + i, sizeof(v));
|
||||||
const std::uint64_t q = v ^ 0x2222222222222222ull; // '"' (0x22)
|
const std::uint64_t q = v ^ 0x2222222222222222ull; // '"' (0x22)
|
||||||
const std::uint64_t b = v ^ 0x5C5C5C5C5C5C5C5Cull; // '\\' (0x5C)
|
const std::uint64_t b = v ^ 0x5C5C5C5C5C5C5C5Cull; // '\\' (0x5C)
|
||||||
const std::uint64_t d = v ^ 0x7F7F7F7F7F7F7F7Full; // DEL (0x7F)
|
const std::uint64_t d = v ^ 0x7F7F7F7F7F7F7F7Full; // DEL (0x7F)
|
||||||
@@ -121,9 +126,7 @@ inline std::size_t find_ascii_copyable_run(const unsigned char* data, std::size_
|
|||||||
| (v & high); // >= 0x80
|
| (v & high); // >= 0x80
|
||||||
if (stop != 0)
|
if (stop != 0)
|
||||||
{
|
{
|
||||||
// the lowest flagged byte is the first one to stop at (see
|
break;
|
||||||
// find_string_special())
|
|
||||||
return i + (static_cast<std::size_t>(count_trailing_zeros(stop)) / 8);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
for (; i < n; ++i)
|
for (; i < n; ++i)
|
||||||
@@ -250,18 +253,12 @@ inline std::size_t scalar_string_bulk_run(const unsigned char* data, std::size_t
|
|||||||
{
|
{
|
||||||
break; // end of buffer, or a quote/escape/control byte
|
break; // end of buffer, or a quote/escape/control byte
|
||||||
}
|
}
|
||||||
// a run of multi-byte sequences (e.g. CJK text) is validated sequence
|
const std::size_t seq = validate_one_utf8(data + pos, n - pos);
|
||||||
// by sequence without searching for the next special byte in between
|
if (seq == 0)
|
||||||
do
|
|
||||||
{
|
{
|
||||||
const std::size_t seq = validate_one_utf8(data + pos, n - pos);
|
break; // ill-formed or truncated: let the byte path diagnose it
|
||||||
if (seq == 0)
|
|
||||||
{
|
|
||||||
return pos; // ill-formed or truncated: let the byte path diagnose it
|
|
||||||
}
|
|
||||||
pos += seq;
|
|
||||||
}
|
}
|
||||||
while (pos < n && data[pos] >= 0x80u);
|
pos += seq;
|
||||||
}
|
}
|
||||||
return pos;
|
return pos;
|
||||||
}
|
}
|
||||||
@@ -276,7 +273,8 @@ inline std::size_t find_string_delimiter(const unsigned char* data, std::size_t
|
|||||||
std::size_t i = 0;
|
std::size_t i = 0;
|
||||||
for (; i + 8 <= n; i += 8)
|
for (; i + 8 <= n; i += 8)
|
||||||
{
|
{
|
||||||
const std::uint64_t v = read_eight_bytes(data + i);
|
std::uint64_t v = 0;
|
||||||
|
std::memcpy(&v, data + i, sizeof(v));
|
||||||
const std::uint64_t q = v ^ 0x2222222222222222ull;
|
const std::uint64_t q = v ^ 0x2222222222222222ull;
|
||||||
const std::uint64_t b = v ^ 0x5C5C5C5C5C5C5C5Cull;
|
const std::uint64_t b = v ^ 0x5C5C5C5C5C5C5C5Cull;
|
||||||
const std::uint64_t hit = ((q - ones) & ~q & high)
|
const std::uint64_t hit = ((q - ones) & ~q & high)
|
||||||
@@ -284,8 +282,14 @@ inline std::size_t find_string_delimiter(const unsigned char* data, std::size_t
|
|||||||
| ((v - 0x2020202020202020ull) & ~v & high);
|
| ((v - 0x2020202020202020ull) & ~v & high);
|
||||||
if (hit != 0)
|
if (hit != 0)
|
||||||
{
|
{
|
||||||
// the lowest flagged byte is the first delimiter (see find_string_special())
|
for (std::size_t j = 0; j < 8; ++j)
|
||||||
return i + (static_cast<std::size_t>(count_trailing_zeros(hit)) / 8);
|
{
|
||||||
|
const unsigned char c = data[i + j];
|
||||||
|
if (c == '\"' || c == '\\' || c < 0x20u)
|
||||||
|
{
|
||||||
|
return i + j;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
for (; i < n; ++i)
|
for (; i < n; ++i)
|
||||||
@@ -316,50 +320,5 @@ inline std::size_t string_bulk_run(const unsigned char* data, std::size_t n) noe
|
|||||||
return scalar_string_bulk_run(data, n);
|
return scalar_string_bulk_run(data, n);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Decode the 4 hex digits at [data, data+4) - the digits following a `\u`
|
|
||||||
// escape - into a codepoint 0x0000..0xFFFF via one table lookup per byte
|
|
||||||
// (after yyjson's read_hex_u16), or return -1 if any of the 4 bytes is not a
|
|
||||||
// hex digit ('0'..'9', 'A'..'F', 'a'..'f'). The caller must already have
|
|
||||||
// checked that 4 bytes are available; used by lexer::get_codepoint()'s
|
|
||||||
// contiguous fast path. On -1 it falls back to the byte-at-a-time loop, which
|
|
||||||
// stops at the first invalid digit, so the reported error and position are
|
|
||||||
// unaffected by this fast path.
|
|
||||||
inline int hex_codepoint(const unsigned char* data) noexcept
|
|
||||||
{
|
|
||||||
static const std::array<std::uint8_t, 256> hex_digit_table = // NOLINT(cppcoreguidelines-avoid-non-const-global-variables)
|
|
||||||
{
|
|
||||||
{
|
|
||||||
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, // 00..0F
|
|
||||||
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, // 10..1F
|
|
||||||
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, // 20..2F
|
|
||||||
0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, // 30..3F ('0'..'9')
|
|
||||||
0xFF, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, // 40..4F ('A'..'F')
|
|
||||||
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, // 50..5F
|
|
||||||
0xFF, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, // 60..6F ('a'..'f')
|
|
||||||
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, // 70..7F
|
|
||||||
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, // 80..8F
|
|
||||||
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, // 90..9F
|
|
||||||
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, // A0..AF
|
|
||||||
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, // B0..BF
|
|
||||||
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, // C0..CF
|
|
||||||
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, // D0..DF
|
|
||||||
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, // E0..EF
|
|
||||||
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF // F0..FF
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
const std::uint8_t d0 = hex_digit_table[data[0]];
|
|
||||||
const std::uint8_t d1 = hex_digit_table[data[1]];
|
|
||||||
const std::uint8_t d2 = hex_digit_table[data[2]];
|
|
||||||
const std::uint8_t d3 = hex_digit_table[data[3]];
|
|
||||||
// every valid digit is <= 0xF; the combined OR only exceeds it if at
|
|
||||||
// least one of the four bytes was not a hex digit (looked up as 0xFF)
|
|
||||||
if ((d0 | d1 | d2 | d3) > 0x0F)
|
|
||||||
{
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
return (d0 << 12) | (d1 << 8) | (d2 << 4) | d3;
|
|
||||||
}
|
|
||||||
|
|
||||||
} // namespace detail
|
} // namespace detail
|
||||||
NLOHMANN_JSON_NAMESPACE_END
|
NLOHMANN_JSON_NAMESPACE_END
|
||||||
Generated
+438
-897
File diff suppressed because it is too large.
Load diff
@@ -1,599 +0,0 @@
|
|||||||
// __ _____ _____ _____
|
|
||||||
// __| | __| | | | JSON for Modern C++ (supporting code)
|
|
||||||
// | | |__ | | | | | | version 3.12.0
|
|
||||||
// |_____|_____|_____|_|___| https://github.com/nlohmann/json
|
|
||||||
//
|
|
||||||
// SPDX-FileCopyrightText: 2013-2026 Niels Lohmann <https://nlohmann.me>
|
|
||||||
// SPDX-License-Identifier: MIT
|
|
||||||
|
|
||||||
#pragma once
|
|
||||||
|
|
||||||
#include <array> // array
|
|
||||||
#include <cstdint> // uint32_t, uint64_t
|
|
||||||
|
|
||||||
// Number tokens that are hard to round correctly, with the IEEE-754 binary64
|
|
||||||
// and binary32 bits of their correctly rounded values (ties to even; infinity
|
|
||||||
// for an overflow, a signed zero for an underflow).
|
|
||||||
//
|
|
||||||
// For doubles and floats around 0, the smallest normal number, 1, 2^24, 2^53,
|
|
||||||
// 0.1, and the largest finite number, and for random ones, the exact midpoint
|
|
||||||
// m to the next number gives: m, m with one unit more and less in the last
|
|
||||||
// digit, m with "01" and "0...01" appended, m with trailing zeros, and m cut
|
|
||||||
// after 17 to 30 digits (rounded down and up, so that the rounding is decided
|
|
||||||
// after the 19th digit), in fixed and exponent notation, 30% of them negative.
|
|
||||||
// Tokens longer than 80 characters are left out, except for four of 700 digits
|
|
||||||
// and more. Zeros, underflow, overflow, huge exponents, and integers beyond 64
|
|
||||||
// bits complete the set. Of the 508 tokens, 134 (as double) and 150 (as
|
|
||||||
// float) need the exact comparison with the midpoint (detail::digit_comparison()).
|
|
||||||
//
|
|
||||||
// The expected bits were computed with exact rational arithmetic in Python
|
|
||||||
// (fractions.Fraction) and cross-checked with Python's float(); strtod_l and
|
|
||||||
// strtof_l of Apple's libc and of glibc agree. Generated by
|
|
||||||
// compact_hard_cases.py 5 (with hard_cases.py), see the pull request that
|
|
||||||
// added this file.
|
|
||||||
|
|
||||||
namespace float_hard_cases
|
|
||||||
{
|
|
||||||
|
|
||||||
struct hard_case
|
|
||||||
{
|
|
||||||
const char* token;
|
|
||||||
std::uint64_t bits64;
|
|
||||||
std::uint32_t bits32;
|
|
||||||
};
|
|
||||||
|
|
||||||
inline const std::array<hard_case, 508>& cases()
|
|
||||||
{
|
|
||||||
static const std::array<hard_case, 508> table =
|
|
||||||
{
|
|
||||||
{
|
|
||||||
{"-2.4703282292062327e-324", 0x8000000000000000u, 0x80000000u},
|
|
||||||
{"24703282292062328e-340", 0x0000000000000001u, 0x00000000u},
|
|
||||||
{"247032822920623272e-341", 0x0000000000000000u, 0x00000000u},
|
|
||||||
{"-0.2470328229206232721e-323", 0x8000000000000001u, 0x80000000u},
|
|
||||||
{"-0.24703282292062327208e-323", 0x8000000000000000u, 0x80000000u},
|
|
||||||
{"-2.4703282292062327209e-324", 0x8000000000000001u, 0x80000000u},
|
|
||||||
{"2.47032822920623272088e-324", 0x0000000000000000u, 0x00000000u},
|
|
||||||
{"247032822920623272089e-344", 0x0000000000000001u, 0x00000000u},
|
|
||||||
{"-247032822920623272088284396434e-353", 0x8000000000000000u, 0x80000000u},
|
|
||||||
{"0.247032822920623272088284396435e-323", 0x0000000000000001u, 0x00000000u},
|
|
||||||
{"-74109846876186981e-340", 0x8000000000000001u, 0x80000000u},
|
|
||||||
{"0.74109846876186982e-323", 0x0000000000000002u, 0x00000000u},
|
|
||||||
{"-0.7410984687618698162e-323", 0x8000000000000001u, 0x80000000u},
|
|
||||||
{"-7.410984687618698163e-324", 0x8000000000000002u, 0x80000000u},
|
|
||||||
{"7.4109846876186981626e-324", 0x0000000000000001u, 0x00000000u},
|
|
||||||
{"-74109846876186981627e-343", 0x8000000000000002u, 0x80000000u},
|
|
||||||
{"-741098468761869816264e-344", 0x8000000000000001u, 0x80000000u},
|
|
||||||
{"0.741098468761869816265e-323", 0x0000000000000002u, 0x00000000u},
|
|
||||||
{"0.741098468761869816264853189302e-323", 0x0000000000000001u, 0x00000000u},
|
|
||||||
{"-7.41098468761869816264853189303e-324", 0x8000000000000002u, 0x80000000u},
|
|
||||||
{"0.22250738585072006e-307", 0x000FFFFFFFFFFFFEu, 0x00000000u},
|
|
||||||
{"2.2250738585072007e-308", 0x000FFFFFFFFFFFFFu, 0x00000000u},
|
|
||||||
{"2.225073858507200641e-308", 0x000FFFFFFFFFFFFEu, 0x00000000u},
|
|
||||||
{"-2225073858507200642e-326", 0x800FFFFFFFFFFFFFu, 0x80000000u},
|
|
||||||
{"22250738585072006419e-327", 0x000FFFFFFFFFFFFEu, 0x00000000u},
|
|
||||||
{"0.2225073858507200642e-307", 0x000FFFFFFFFFFFFFu, 0x00000000u},
|
|
||||||
{"0.222507385850720064199e-307", 0x000FFFFFFFFFFFFEu, 0x00000000u},
|
|
||||||
{"2.225073858507200642e-308", 0x000FFFFFFFFFFFFFu, 0x00000000u},
|
|
||||||
{"-2.22507385850720064199176395546e-308", 0x800FFFFFFFFFFFFEu, 0x80000000u},
|
|
||||||
{"222507385850720064199176395547e-337", 0x000FFFFFFFFFFFFFu, 0x00000000u},
|
|
||||||
{"-2.2250738585072011e-308", 0x800FFFFFFFFFFFFFu, 0x80000000u},
|
|
||||||
{"-22250738585072012e-324", 0x8010000000000000u, 0x80000000u},
|
|
||||||
{"-2225073858507201136e-326", 0x800FFFFFFFFFFFFFu, 0x80000000u},
|
|
||||||
{"0.2225073858507201137e-307", 0x0010000000000000u, 0x00000000u},
|
|
||||||
{"0.2225073858507201136e-307", 0x000FFFFFFFFFFFFFu, 0x00000000u},
|
|
||||||
{"-2.2250738585072011361e-308", 0x8010000000000000u, 0x80000000u},
|
|
||||||
{"2.22507385850720113605e-308", 0x000FFFFFFFFFFFFFu, 0x00000000u},
|
|
||||||
{"222507385850720113606e-328", 0x0010000000000000u, 0x00000000u},
|
|
||||||
{"22250738585072011360574097967e-336", 0x000FFFFFFFFFFFFFu, 0x00000000u},
|
|
||||||
{"0.222507385850720113605740979671e-307", 0x0010000000000000u, 0x00000000u},
|
|
||||||
{"22250738585072016e-324", 0x0010000000000000u, 0x00000000u},
|
|
||||||
{"0.22250738585072017e-307", 0x0010000000000001u, 0x00000000u},
|
|
||||||
{"0.222507385850720163e-307", 0x0010000000000000u, 0x00000000u},
|
|
||||||
{"2.225073858507201631e-308", 0x0010000000000001u, 0x00000000u},
|
|
||||||
{"-2.2250738585072016301e-308", 0x8010000000000000u, 0x80000000u},
|
|
||||||
{"22250738585072016302e-327", 0x0010000000000001u, 0x00000000u},
|
|
||||||
{"-222507385850720163012e-328", 0x8010000000000000u, 0x80000000u},
|
|
||||||
{"0.222507385850720163013e-307", 0x0010000000000001u, 0x00000000u},
|
|
||||||
{"0.222507385850720163012305563795e-307", 0x0010000000000000u, 0x00000000u},
|
|
||||||
{"-2.22507385850720163012305563796e-308", 0x8010000000000001u, 0x80000000u},
|
|
||||||
{"0.17976931348623156E+309", 0x7FEFFFFFFFFFFFFEu, 0x7F800000u},
|
|
||||||
{"1.7976931348623157e308", 0x7FEFFFFFFFFFFFFFu, 0x7F800000u},
|
|
||||||
{"1.797693134862315608e308", 0x7FEFFFFFFFFFFFFEu, 0x7F800000u},
|
|
||||||
{"-1797693134862315609e290", 0xFFEFFFFFFFFFFFFFu, 0xFF800000u},
|
|
||||||
{"-17976931348623156083e289", 0xFFEFFFFFFFFFFFFEu, 0xFF800000u},
|
|
||||||
{"-0.17976931348623156084E+309", 0xFFEFFFFFFFFFFFFFu, 0xFF800000u},
|
|
||||||
{"0.179769313486231560835E+309", 0x7FEFFFFFFFFFFFFEu, 0x7F800000u},
|
|
||||||
{"-1.79769313486231560836e308", 0xFFEFFFFFFFFFFFFFu, 0xFF800000u},
|
|
||||||
{"1.79769313486231560835325876058e308", 0x7FEFFFFFFFFFFFFEu, 0x7F800000u},
|
|
||||||
{"179769313486231560835325876059e279", 0x7FEFFFFFFFFFFFFFu, 0x7F800000u},
|
|
||||||
{"1.7976931348623158e308", 0x7FEFFFFFFFFFFFFFu, 0x7F800000u},
|
|
||||||
{"17976931348623159e292", 0x7FF0000000000000u, 0x7F800000u},
|
|
||||||
{"1797693134862315807e290", 0x7FEFFFFFFFFFFFFFu, 0x7F800000u},
|
|
||||||
{"0.1797693134862315808E+309", 0x7FF0000000000000u, 0x7F800000u},
|
|
||||||
{"0.17976931348623158079E+309", 0x7FEFFFFFFFFFFFFFu, 0x7F800000u},
|
|
||||||
{"-1.797693134862315808e308", 0xFFF0000000000000u, 0xFF800000u},
|
|
||||||
{"1.79769313486231580793e308", 0x7FEFFFFFFFFFFFFFu, 0x7F800000u},
|
|
||||||
{"179769313486231580794e288", 0x7FF0000000000000u, 0x7F800000u},
|
|
||||||
{"179769313486231580793728971405e279", 0x7FEFFFFFFFFFFFFFu, 0x7F800000u},
|
|
||||||
{"-0.179769313486231580793728971406E+309", 0xFFF0000000000000u, 0xFF800000u},
|
|
||||||
{"100000000000000011102230246251565404236316680908203125e-53", 0x3FF0000000000000u, 0x3F800000u},
|
|
||||||
{"-1.00000000000000011102230246251565404236316680908203126", 0xBFF0000000000001u, 0xBF800000u},
|
|
||||||
{"1.00000000000000011102230246251565404236316680908203124e0", 0x3FF0000000000000u, 0x3F800000u},
|
|
||||||
{"10000000000000001110223024625156540423631668090820312501e-55", 0x3FF0000000000001u, 0x3F800000u},
|
|
||||||
{"1.00000000000000011102230246251565404236316680908203125000000000000000000001", 0x3FF0000000000001u, 0x3F800000u},
|
|
||||||
{"10000000000000001e-16", 0x3FF0000000000000u, 0x3F800000u},
|
|
||||||
{"1.0000000000000002", 0x3FF0000000000001u, 0x3F800000u},
|
|
||||||
{"1.000000000000000111", 0x3FF0000000000000u, 0x3F800000u},
|
|
||||||
{"1.000000000000000112e0", 0x3FF0000000000001u, 0x3F800000u},
|
|
||||||
{"1.000000000000000111e0", 0x3FF0000000000000u, 0x3F800000u},
|
|
||||||
{"-10000000000000001111e-19", 0xBFF0000000000001u, 0xBF800000u},
|
|
||||||
{"-100000000000000011102e-20", 0xBFF0000000000000u, 0xBF800000u},
|
|
||||||
{"-1.00000000000000011103", 0xBFF0000000000001u, 0xBF800000u},
|
|
||||||
{"1.00000000000000011102230246251", 0x3FF0000000000000u, 0x3F800000u},
|
|
||||||
{"1.00000000000000011102230246252e0", 0x3FF0000000000001u, 0x3F800000u},
|
|
||||||
{"-0.999999999999999944488848768742172978818416595458984375", 0xBFF0000000000000u, 0xBF800000u},
|
|
||||||
{"-9.99999999999999944488848768742172978818416595458984376e-1", 0xBFF0000000000000u, 0xBF800000u},
|
|
||||||
{"999999999999999944488848768742172978818416595458984374e-54", 0x3FEFFFFFFFFFFFFFu, 0x3F800000u},
|
|
||||||
{"0.99999999999999994448884876874217297881841659545898437501", 0x3FF0000000000000u, 0x3F800000u},
|
|
||||||
{"9.99999999999999944488848768742172978818416595458984375000000000000000000001e-1", 0x3FF0000000000000u, 0x3F800000u},
|
|
||||||
{"-0.99999999999999994", 0xBFEFFFFFFFFFFFFFu, 0xBF800000u},
|
|
||||||
{"9.9999999999999995e-1", 0x3FF0000000000000u, 0x3F800000u},
|
|
||||||
{"9.999999999999999444e-1", 0x3FEFFFFFFFFFFFFFu, 0x3F800000u},
|
|
||||||
{"9999999999999999445e-19", 0x3FF0000000000000u, 0x3F800000u},
|
|
||||||
{"99999999999999994448e-20", 0x3FEFFFFFFFFFFFFFu, 0x3F800000u},
|
|
||||||
{"-0.99999999999999994449", 0xBFF0000000000000u, 0xBF800000u},
|
|
||||||
{"0.999999999999999944488", 0x3FEFFFFFFFFFFFFFu, 0x3F800000u},
|
|
||||||
{"-9.99999999999999944489e-1", 0xBFF0000000000000u, 0xBF800000u},
|
|
||||||
{"9.99999999999999944488848768742e-1", 0x3FEFFFFFFFFFFFFFu, 0x3F800000u},
|
|
||||||
{"999999999999999944488848768743e-30", 0x3FF0000000000000u, 0x3F800000u},
|
|
||||||
{"-9.007199254740993e15", 0xC340000000000000u, 0xDA000000u},
|
|
||||||
{"9007199254740994e0", 0x4340000000000001u, 0x5A000000u},
|
|
||||||
{"9007199254740992", 0x4340000000000000u, 0x5A000000u},
|
|
||||||
{"9.00719925474099301e15", 0x4340000000000001u, 0x5A000000u},
|
|
||||||
{"9007199254740993000000000000000000001e-21", 0x4340000000000001u, 0x5A000000u},
|
|
||||||
{"-9007199254740993.000000000000000000000000000000", 0xC340000000000000u, 0xDA000000u},
|
|
||||||
{"90071992547409915e-1", 0x4340000000000000u, 0x5A000000u},
|
|
||||||
{"-9007199254740991.6", 0xC340000000000000u, 0xDA000000u},
|
|
||||||
{"9.0071992547409914e15", 0x433FFFFFFFFFFFFFu, 0x5A000000u},
|
|
||||||
{"-9007199254740991501e-3", 0xC340000000000000u, 0xDA000000u},
|
|
||||||
{"9007199254740991.5000000000000000000001", 0x4340000000000000u, 0x5A000000u},
|
|
||||||
{"9.0071992547409915000000000000000000000000000000e15", 0x4340000000000000u, 0x5A000000u},
|
|
||||||
{"0.100000000000000012490009027033011079765856266021728515625", 0x3FB999999999999Au, 0x3DCCCCCDu},
|
|
||||||
{"1.00000000000000012490009027033011079765856266021728515626e-1", 0x3FB999999999999Bu, 0x3DCCCCCDu},
|
|
||||||
{"100000000000000012490009027033011079765856266021728515624e-57", 0x3FB999999999999Au, 0x3DCCCCCDu},
|
|
||||||
{"0.10000000000000001249000902703301107976585626602172851562501", 0x3FB999999999999Bu, 0x3DCCCCCDu},
|
|
||||||
{"0.10000000000000001", 0x3FB999999999999Au, 0x3DCCCCCDu},
|
|
||||||
{"1.0000000000000002e-1", 0x3FB999999999999Bu, 0x3DCCCCCDu},
|
|
||||||
{"-1.000000000000000124e-1", 0xBFB999999999999Au, 0xBDCCCCCDu},
|
|
||||||
{"1000000000000000125e-19", 0x3FB999999999999Bu, 0x3DCCCCCDu},
|
|
||||||
{"-10000000000000001249e-20", 0xBFB999999999999Au, 0xBDCCCCCDu},
|
|
||||||
{"0.1000000000000000125", 0x3FB999999999999Bu, 0x3DCCCCCDu},
|
|
||||||
{"0.10000000000000001249", 0x3FB999999999999Au, 0x3DCCCCCDu},
|
|
||||||
{"1.00000000000000012491e-1", 0x3FB999999999999Bu, 0x3DCCCCCDu},
|
|
||||||
{"1.00000000000000012490009027033e-1", 0x3FB999999999999Au, 0x3DCCCCCDu},
|
|
||||||
{"100000000000000012490009027034e-30", 0x3FB999999999999Bu, 0x3DCCCCCDu},
|
|
||||||
{"2.45134755833537796875e14", 0x42EBDE5C4164D83Au, 0x575EF2E2u},
|
|
||||||
{"-245134755833537796876e-6", 0xC2EBDE5C4164D83Au, 0xD75EF2E2u},
|
|
||||||
{"-245134755833537.796874", 0xC2EBDE5C4164D839u, 0xD75EF2E2u},
|
|
||||||
{"2.4513475583353779687501e14", 0x42EBDE5C4164D83Au, 0x575EF2E2u},
|
|
||||||
{"245134755833537796875000000000000000000001e-27", 0x42EBDE5C4164D83Au, 0x575EF2E2u},
|
|
||||||
{"245134755833537.796875000000000000000000000000000000", 0x42EBDE5C4164D83Au, 0x575EF2E2u},
|
|
||||||
{"2.4513475583353779e14", 0x42EBDE5C4164D839u, 0x575EF2E2u},
|
|
||||||
{"2451347558335378e-1", 0x42EBDE5C4164D83Au, 0x575EF2E2u},
|
|
||||||
{"2451347558335377968e-4", 0x42EBDE5C4164D839u, 0x575EF2E2u},
|
|
||||||
{"245134755833537.7969", 0x42EBDE5C4164D83Au, 0x575EF2E2u},
|
|
||||||
{"245134755833537.79687", 0x42EBDE5C4164D839u, 0x575EF2E2u},
|
|
||||||
{"2.4513475583353779688e14", 0x42EBDE5C4164D83Au, 0x575EF2E2u},
|
|
||||||
{"181510327827821147441864013671875e-23", 0x41DB0C11CB91CE38u, 0x4ED8608Eu},
|
|
||||||
{"-1815103278.27821147441864013671876", 0xC1DB0C11CB91CE38u, 0xCED8608Eu},
|
|
||||||
{"1.81510327827821147441864013671874e9", 0x41DB0C11CB91CE37u, 0x4ED8608Eu},
|
|
||||||
{"18151032782782114744186401367187501e-25", 0x41DB0C11CB91CE38u, 0x4ED8608Eu},
|
|
||||||
{"1815103278.27821147441864013671875000000000000000000001", 0x41DB0C11CB91CE38u, 0x4ED8608Eu},
|
|
||||||
{"-1.81510327827821147441864013671875000000000000000000000000000000e9", 0xC1DB0C11CB91CE38u, 0xCED8608Eu},
|
|
||||||
{"18151032782782114e-7", 0x41DB0C11CB91CE37u, 0x4ED8608Eu},
|
|
||||||
{"1815103278.2782115", 0x41DB0C11CB91CE38u, 0x4ED8608Eu},
|
|
||||||
{"1815103278.278211474", 0x41DB0C11CB91CE37u, 0x4ED8608Eu},
|
|
||||||
{"-1.815103278278211475e9", 0xC1DB0C11CB91CE38u, 0xCED8608Eu},
|
|
||||||
{"1.8151032782782114744e9", 0x41DB0C11CB91CE37u, 0x4ED8608Eu},
|
|
||||||
{"-18151032782782114745e-10", 0xC1DB0C11CB91CE38u, 0xCED8608Eu},
|
|
||||||
{"181510327827821147441e-11", 0x41DB0C11CB91CE37u, 0x4ED8608Eu},
|
|
||||||
{"1815103278.27821147442", 0x41DB0C11CB91CE38u, 0x4ED8608Eu},
|
|
||||||
{"1815103278.27821147441864013671", 0x41DB0C11CB91CE37u, 0x4ED8608Eu},
|
|
||||||
{"1.81510327827821147441864013672e9", 0x41DB0C11CB91CE38u, 0x4ED8608Eu},
|
|
||||||
{"3809325632181785344", 0x43CA6EB8BD69FE2Au, 0x5E5375C6u},
|
|
||||||
{"3.809325632181785345e18", 0x43CA6EB8BD69FE2Au, 0x5E5375C6u},
|
|
||||||
{"3809325632181785343e0", 0x43CA6EB8BD69FE29u, 0x5E5375C6u},
|
|
||||||
{"3809325632181785344.01", 0x43CA6EB8BD69FE2Au, 0x5E5375C6u},
|
|
||||||
{"3.809325632181785344000000000000000000001e18", 0x43CA6EB8BD69FE2Au, 0x5E5375C6u},
|
|
||||||
{"3809325632181785344000000000000000000000000000000e-30", 0x43CA6EB8BD69FE2Au, 0x5E5375C6u},
|
|
||||||
{"3809325632181785300", 0x43CA6EB8BD69FE29u, 0x5E5375C6u},
|
|
||||||
{"3.8093256321817854e18", 0x43CA6EB8BD69FE2Au, 0x5E5375C6u},
|
|
||||||
{"4.046966549916366943359375e12", 0x428D7210076CE2F0u, 0x546B9080u},
|
|
||||||
{"4046966549916366943359376e-12", 0x428D7210076CE2F0u, 0x546B9080u},
|
|
||||||
{"4046966549916.366943359374", 0x428D7210076CE2EFu, 0x546B9080u},
|
|
||||||
{"4.04696654991636694335937501e12", 0x428D7210076CE2F0u, 0x546B9080u},
|
|
||||||
{"4046966549916366943359375000000000000000000001e-33", 0x428D7210076CE2F0u, 0x546B9080u},
|
|
||||||
{"-4046966549916.366943359375000000000000000000000000000000", 0xC28D7210076CE2F0u, 0xD46B9080u},
|
|
||||||
{"4.0469665499163669e12", 0x428D7210076CE2EFu, 0x546B9080u},
|
|
||||||
{"4046966549916367e-3", 0x428D7210076CE2F0u, 0x546B9080u},
|
|
||||||
{"4046966549916366943e-6", 0x428D7210076CE2EFu, 0x546B9080u},
|
|
||||||
{"4046966549916.366944", 0x428D7210076CE2F0u, 0x546B9080u},
|
|
||||||
{"4046966549916.3669433", 0x428D7210076CE2EFu, 0x546B9080u},
|
|
||||||
{"4.0469665499163669434e12", 0x428D7210076CE2F0u, 0x546B9080u},
|
|
||||||
{"-4.04696654991636694335e12", 0xC28D7210076CE2EFu, 0xD46B9080u},
|
|
||||||
{"404696654991636694336e-8", 0x428D7210076CE2F0u, 0x546B9080u},
|
|
||||||
{"28093802557000874e154", 0x63529C3B77330BDBu, 0x7F800000u},
|
|
||||||
{"0.28093802557000875E+171", 0x63529C3B77330BDCu, 0x7F800000u},
|
|
||||||
{"0.2809380255700087447E+171", 0x63529C3B77330BDBu, 0x7F800000u},
|
|
||||||
{"2.809380255700087448e170", 0x63529C3B77330BDCu, 0x7F800000u},
|
|
||||||
{"2.8093802557000874472e170", 0x63529C3B77330BDBu, 0x7F800000u},
|
|
||||||
{"28093802557000874473e151", 0x63529C3B77330BDCu, 0x7F800000u},
|
|
||||||
{"280938025570008744728e150", 0x63529C3B77330BDBu, 0x7F800000u},
|
|
||||||
{"-0.280938025570008744729E+171", 0xE3529C3B77330BDCu, 0xFF800000u},
|
|
||||||
{"-0.280938025570008744728403667979E+171", 0xE3529C3B77330BDBu, 0xFF800000u},
|
|
||||||
{"2.8093802557000874472840366798e170", 0x63529C3B77330BDCu, 0x7F800000u},
|
|
||||||
{"0.39523280297734525e-154", 0x1FE0F51BF17FD374u, 0x00000000u},
|
|
||||||
{"-3.9523280297734526e-155", 0x9FE0F51BF17FD375u, 0x80000000u},
|
|
||||||
{"3.952328029773452547e-155", 0x1FE0F51BF17FD374u, 0x00000000u},
|
|
||||||
{"3952328029773452548e-173", 0x1FE0F51BF17FD375u, 0x00000000u},
|
|
||||||
{"-39523280297734525478e-174", 0x9FE0F51BF17FD374u, 0x80000000u},
|
|
||||||
{"0.39523280297734525479e-154", 0x1FE0F51BF17FD375u, 0x00000000u},
|
|
||||||
{"-0.395232802977345254787e-154", 0x9FE0F51BF17FD374u, 0x80000000u},
|
|
||||||
{"-3.95232802977345254788e-155", 0x9FE0F51BF17FD375u, 0x80000000u},
|
|
||||||
{"-3.95232802977345254787245825501e-155", 0x9FE0F51BF17FD374u, 0x80000000u},
|
|
||||||
{"395232802977345254787245825502e-184", 0x1FE0F51BF17FD375u, 0x00000000u},
|
|
||||||
{"-1.0790205420931879e-276", 0x86A3209CA6233255u, 0x80000000u},
|
|
||||||
{"-1079020542093188e-291", 0x86A3209CA6233256u, 0x80000000u},
|
|
||||||
{"-1079020542093187947e-294", 0x86A3209CA6233255u, 0x80000000u},
|
|
||||||
{"0.1079020542093187948e-275", 0x06A3209CA6233256u, 0x00000000u},
|
|
||||||
{"0.1079020542093187947e-275", 0x06A3209CA6233255u, 0x00000000u},
|
|
||||||
{"1.0790205420931879471e-276", 0x06A3209CA6233256u, 0x00000000u},
|
|
||||||
{"1.07902054209318794701e-276", 0x06A3209CA6233255u, 0x00000000u},
|
|
||||||
{"-107902054209318794702e-296", 0x86A3209CA6233256u, 0x80000000u},
|
|
||||||
{"107902054209318794701153285302e-305", 0x06A3209CA6233255u, 0x00000000u},
|
|
||||||
{"-0.107902054209318794701153285303e-275", 0x86A3209CA6233256u, 0x80000000u},
|
|
||||||
{"58530471071351308e-228", 0x1413B446E6A16A3Bu, 0x00000000u},
|
|
||||||
{"-0.58530471071351309e-211", 0x9413B446E6A16A3Cu, 0x80000000u},
|
|
||||||
{"0.5853047107135130893e-211", 0x1413B446E6A16A3Bu, 0x00000000u},
|
|
||||||
{"-5.853047107135130894e-212", 0x9413B446E6A16A3Cu, 0x80000000u},
|
|
||||||
{"5.853047107135130893e-212", 0x1413B446E6A16A3Bu, 0x00000000u},
|
|
||||||
{"58530471071351308931e-231", 0x1413B446E6A16A3Cu, 0x00000000u},
|
|
||||||
{"-585304710713513089304e-232", 0x9413B446E6A16A3Bu, 0x80000000u},
|
|
||||||
{"0.585304710713513089305e-211", 0x1413B446E6A16A3Cu, 0x00000000u},
|
|
||||||
{"-0.585304710713513089304248824438e-211", 0x9413B446E6A16A3Bu, 0x80000000u},
|
|
||||||
{"5.85304710713513089304248824439e-212", 0x1413B446E6A16A3Cu, 0x00000000u},
|
|
||||||
{"0.19334214893983531e-78", 0x2F96ECBF1CFB10F6u, 0x00000000u},
|
|
||||||
{"1.9334214893983532e-79", 0x2F96ECBF1CFB10F7u, 0x00000000u},
|
|
||||||
{"1.933421489398353102e-79", 0x2F96ECBF1CFB10F6u, 0x00000000u},
|
|
||||||
{"1933421489398353103e-97", 0x2F96ECBF1CFB10F7u, 0x00000000u},
|
|
||||||
{"19334214893983531023e-98", 0x2F96ECBF1CFB10F6u, 0x00000000u},
|
|
||||||
{"0.19334214893983531024e-78", 0x2F96ECBF1CFB10F7u, 0x00000000u},
|
|
||||||
{"0.193342148939835310231e-78", 0x2F96ECBF1CFB10F6u, 0x00000000u},
|
|
||||||
{"1.93342148939835310232e-79", 0x2F96ECBF1CFB10F7u, 0x00000000u},
|
|
||||||
{"-1.93342148939835310231359014704e-79", 0xAF96ECBF1CFB10F6u, 0x80000000u},
|
|
||||||
{"193342148939835310231359014705e-108", 0x2F96ECBF1CFB10F7u, 0x00000000u},
|
|
||||||
{"2.9873358928024455e227", 0x6F2938807814E8A2u, 0x7F800000u},
|
|
||||||
{"29873358928024456e211", 0x6F2938807814E8A3u, 0x7F800000u},
|
|
||||||
{"298733589280244551e210", 0x6F2938807814E8A2u, 0x7F800000u},
|
|
||||||
{"0.2987335892802445511E+228", 0x6F2938807814E8A3u, 0x7F800000u},
|
|
||||||
{"0.29873358928024455109E+228", 0x6F2938807814E8A2u, 0x7F800000u},
|
|
||||||
{"2.987335892802445511e227", 0x6F2938807814E8A3u, 0x7F800000u},
|
|
||||||
{"-2.98733589280244551098e227", 0xEF2938807814E8A2u, 0xFF800000u},
|
|
||||||
{"-298733589280244551099e207", 0xEF2938807814E8A3u, 0xFF800000u},
|
|
||||||
{"298733589280244551098081559931e198", 0x6F2938807814E8A2u, 0x7F800000u},
|
|
||||||
{"0.298733589280244551098081559932E+228", 0x6F2938807814E8A3u, 0x7F800000u},
|
|
||||||
{"7.0064923216240853e-46", 0x3690000000000000u, 0x00000000u},
|
|
||||||
{"70064923216240854e-62", 0x3690000000000000u, 0x00000001u},
|
|
||||||
{"7006492321624085354e-64", 0x3690000000000000u, 0x00000000u},
|
|
||||||
{"-0.7006492321624085355e-45", 0xB690000000000000u, 0x80000001u},
|
|
||||||
{"0.70064923216240853546e-45", 0x3690000000000000u, 0x00000000u},
|
|
||||||
{"7.0064923216240853547e-46", 0x3690000000000000u, 0x00000001u},
|
|
||||||
{"7.00649232162408535461e-46", 0x3690000000000000u, 0x00000000u},
|
|
||||||
{"-700649232162408535462e-66", 0xB690000000000000u, 0x80000001u},
|
|
||||||
{"-700649232162408535461864791644e-75", 0xB690000000000000u, 0x80000000u},
|
|
||||||
{"0.700649232162408535461864791645e-45", 0x3690000000000000u, 0x00000001u},
|
|
||||||
{"21019476964872256e-61", 0x36A8000000000000u, 0x00000001u},
|
|
||||||
{"0.21019476964872257e-44", 0x36A8000000000000u, 0x00000002u},
|
|
||||||
{"-0.2101947696487225606e-44", 0xB6A8000000000000u, 0x80000001u},
|
|
||||||
{"-2.101947696487225607e-45", 0xB6A8000000000000u, 0x80000002u},
|
|
||||||
{"2.1019476964872256063e-45", 0x36A8000000000000u, 0x00000001u},
|
|
||||||
{"21019476964872256064e-64", 0x36A8000000000000u, 0x00000002u},
|
|
||||||
{"-210194769648722560638e-65", 0xB6A8000000000000u, 0x80000001u},
|
|
||||||
{"-0.210194769648722560639e-44", 0xB6A8000000000000u, 0x80000002u},
|
|
||||||
{"-0.210194769648722560638559437493e-44", 0xB6A8000000000000u, 0x80000001u},
|
|
||||||
{"2.10194769648722560638559437494e-45", 0x36A8000000000000u, 0x00000002u},
|
|
||||||
{"0.11754941406275178e-37", 0x380FFFFFA0000000u, 0x007FFFFEu},
|
|
||||||
{"1.1754941406275179e-38", 0x380FFFFFA0000000u, 0x007FFFFFu},
|
|
||||||
{"-1.175494140627517859e-38", 0xB80FFFFFA0000000u, 0x807FFFFEu},
|
|
||||||
{"117549414062751786e-55", 0x380FFFFFA0000000u, 0x007FFFFFu},
|
|
||||||
{"-11754941406275178592e-57", 0xB80FFFFFA0000000u, 0x807FFFFEu},
|
|
||||||
{"0.11754941406275178593e-37", 0x380FFFFFA0000000u, 0x007FFFFFu},
|
|
||||||
{"0.117549414062751785924e-37", 0x380FFFFFA0000000u, 0x007FFFFEu},
|
|
||||||
{"1.17549414062751785925e-38", 0x380FFFFFA0000000u, 0x007FFFFFu},
|
|
||||||
{"-1.17549414062751785924617589866e-38", 0xB80FFFFFA0000000u, 0x807FFFFEu},
|
|
||||||
{"117549414062751785924617589867e-67", 0x380FFFFFA0000000u, 0x007FFFFFu},
|
|
||||||
{"1.1754942807573642e-38", 0x380FFFFFDFFFFFFFu, 0x007FFFFFu},
|
|
||||||
{"11754942807573643e-54", 0x380FFFFFE0000000u, 0x00800000u},
|
|
||||||
{"1175494280757364291e-56", 0x380FFFFFE0000000u, 0x007FFFFFu},
|
|
||||||
{"0.1175494280757364292e-37", 0x380FFFFFE0000000u, 0x00800000u},
|
|
||||||
{"0.11754942807573642917e-37", 0x380FFFFFE0000000u, 0x007FFFFFu},
|
|
||||||
{"-1.1754942807573642918e-38", 0xB80FFFFFE0000000u, 0x80800000u},
|
|
||||||
{"-1.17549428075736429172e-38", 0xB80FFFFFE0000000u, 0x807FFFFFu},
|
|
||||||
{"-117549428075736429173e-58", 0xB80FFFFFE0000000u, 0x80800000u},
|
|
||||||
{"117549428075736429172788299103e-67", 0x380FFFFFE0000000u, 0x007FFFFFu},
|
|
||||||
{"0.117549428075736429172788299104e-37", 0x380FFFFFE0000000u, 0x00800000u},
|
|
||||||
{"11754944208872107e-54", 0x3810000010000000u, 0x00800000u},
|
|
||||||
{"-0.11754944208872108e-37", 0xB810000010000000u, 0x80800001u},
|
|
||||||
{"0.1175494420887210724e-37", 0x3810000010000000u, 0x00800000u},
|
|
||||||
{"1.175494420887210725e-38", 0x3810000010000000u, 0x00800001u},
|
|
||||||
{"1.1754944208872107242e-38", 0x3810000010000000u, 0x00800000u},
|
|
||||||
{"-11754944208872107243e-57", 0xB810000010000000u, 0x80800001u},
|
|
||||||
{"-11754944208872107242e-57", 0xB810000010000000u, 0x80800000u},
|
|
||||||
{"0.117549442088721072421e-37", 0x3810000010000000u, 0x00800001u},
|
|
||||||
{"0.11754944208872107242095900834e-37", 0x3810000010000000u, 0x00800000u},
|
|
||||||
{"-1.17549442088721072420959008341e-38", 0xB810000010000000u, 0x80800001u},
|
|
||||||
{"340282336497324057985868971510891282432", 0x47EFFFFFD0000000u, 0x7F7FFFFEu},
|
|
||||||
{"-3.40282336497324057985868971510891282433e38", 0xC7EFFFFFD0000000u, 0xFF7FFFFFu},
|
|
||||||
{"340282336497324057985868971510891282431e0", 0x47EFFFFFD0000000u, 0x7F7FFFFEu},
|
|
||||||
{"340282336497324057985868971510891282432.01", 0x47EFFFFFD0000000u, 0x7F7FFFFFu},
|
|
||||||
{"3.40282336497324057985868971510891282432000000000000000000001e38", 0x47EFFFFFD0000000u, 0x7F7FFFFFu},
|
|
||||||
{"340282336497324057985868971510891282432000000000000000000000000000000e-30", 0x47EFFFFFD0000000u, 0x7F7FFFFEu},
|
|
||||||
{"340282336497324050000000000000000000000", 0x47EFFFFFD0000000u, 0x7F7FFFFEu},
|
|
||||||
{"3.4028233649732406e38", 0x47EFFFFFD0000000u, 0x7F7FFFFFu},
|
|
||||||
{"3.402823364973240579e38", 0x47EFFFFFD0000000u, 0x7F7FFFFEu},
|
|
||||||
{"340282336497324058e21", 0x47EFFFFFD0000000u, 0x7F7FFFFFu},
|
|
||||||
{"34028233649732405798e19", 0x47EFFFFFD0000000u, 0x7F7FFFFEu},
|
|
||||||
{"340282336497324057990000000000000000000", 0x47EFFFFFD0000000u, 0x7F7FFFFFu},
|
|
||||||
{"340282336497324057985000000000000000000", 0x47EFFFFFD0000000u, 0x7F7FFFFEu},
|
|
||||||
{"3.40282336497324057986e38", 0x47EFFFFFD0000000u, 0x7F7FFFFFu},
|
|
||||||
{"3.4028233649732405798586897151e38", 0x47EFFFFFD0000000u, 0x7F7FFFFEu},
|
|
||||||
{"340282336497324057985868971511e9", 0x47EFFFFFD0000000u, 0x7F7FFFFFu},
|
|
||||||
{"3.40282356779733661637539395458142568448e38", 0x47EFFFFFF0000000u, 0x7F800000u},
|
|
||||||
{"-340282356779733661637539395458142568449e0", 0xC7EFFFFFF0000000u, 0xFF800000u},
|
|
||||||
{"340282356779733661637539395458142568447", 0x47EFFFFFF0000000u, 0x7F7FFFFFu},
|
|
||||||
{"3.4028235677973366163753939545814256844801e38", 0x47EFFFFFF0000000u, 0x7F800000u},
|
|
||||||
{"340282356779733661637539395458142568448000000000000000000001e-21", 0x47EFFFFFF0000000u, 0x7F800000u},
|
|
||||||
{"340282356779733661637539395458142568448.000000000000000000000000000000", 0x47EFFFFFF0000000u, 0x7F800000u},
|
|
||||||
{"3.4028235677973366e38", 0x47EFFFFFF0000000u, 0x7F7FFFFFu},
|
|
||||||
{"-34028235677973367e22", 0xC7EFFFFFF0000000u, 0xFF800000u},
|
|
||||||
{"3402823567797336616e20", 0x47EFFFFFF0000000u, 0x7F7FFFFFu},
|
|
||||||
{"340282356779733661700000000000000000000", 0x47EFFFFFF0000000u, 0x7F800000u},
|
|
||||||
{"340282356779733661630000000000000000000", 0x47EFFFFFF0000000u, 0x7F7FFFFFu},
|
|
||||||
{"3.4028235677973366164e38", 0x47EFFFFFF0000000u, 0x7F800000u},
|
|
||||||
{"3.40282356779733661637e38", 0x47EFFFFFF0000000u, 0x7F7FFFFFu},
|
|
||||||
{"340282356779733661638e18", 0x47EFFFFFF0000000u, 0x7F800000u},
|
|
||||||
{"-340282356779733661637539395458e9", 0xC7EFFFFFF0000000u, 0xFF7FFFFFu},
|
|
||||||
{"340282356779733661637539395459000000000", 0x47EFFFFFF0000000u, 0x7F800000u},
|
|
||||||
{"-1000000059604644775390625e-24", 0xBFF0000010000000u, 0xBF800000u},
|
|
||||||
{"-1.000000059604644775390626", 0xBFF0000010000000u, 0xBF800001u},
|
|
||||||
{"-1.000000059604644775390624e0", 0xBFF0000010000000u, 0xBF800000u},
|
|
||||||
{"100000005960464477539062501e-26", 0x3FF0000010000000u, 0x3F800001u},
|
|
||||||
{"1.000000059604644775390625000000000000000000001", 0x3FF0000010000000u, 0x3F800001u},
|
|
||||||
{"1.000000059604644775390625000000000000000000000000000000e0", 0x3FF0000010000000u, 0x3F800000u},
|
|
||||||
{"-10000000596046447e-16", 0xBFF0000010000000u, 0xBF800000u},
|
|
||||||
{"1.0000000596046448", 0x3FF0000010000000u, 0x3F800001u},
|
|
||||||
{"1.000000059604644775", 0x3FF0000010000000u, 0x3F800000u},
|
|
||||||
{"-1.000000059604644776e0", 0xBFF0000010000000u, 0xBF800001u},
|
|
||||||
{"-1.0000000596046447753e0", 0xBFF0000010000000u, 0xBF800000u},
|
|
||||||
{"10000000596046447754e-19", 0x3FF0000010000000u, 0x3F800001u},
|
|
||||||
{"100000005960464477539e-20", 0x3FF0000010000000u, 0x3F800000u},
|
|
||||||
{"-1.0000000596046447754", 0xBFF0000010000000u, 0xBF800001u},
|
|
||||||
{"0.9999999701976776123046875", 0x3FEFFFFFF0000000u, 0x3F800000u},
|
|
||||||
{"9.999999701976776123046876e-1", 0x3FEFFFFFF0000000u, 0x3F800000u},
|
|
||||||
{"9999999701976776123046874e-25", 0x3FEFFFFFF0000000u, 0x3F7FFFFFu},
|
|
||||||
{"0.999999970197677612304687501", 0x3FEFFFFFF0000000u, 0x3F800000u},
|
|
||||||
{"-9.999999701976776123046875000000000000000000001e-1", 0xBFEFFFFFF0000000u, 0xBF800000u},
|
|
||||||
{"-9999999701976776123046875000000000000000000000000000000e-55", 0xBFEFFFFFF0000000u, 0xBF800000u},
|
|
||||||
{"0.99999997019767761", 0x3FEFFFFFF0000000u, 0x3F7FFFFFu},
|
|
||||||
{"-9.9999997019767762e-1", 0xBFEFFFFFF0000000u, 0xBF800000u},
|
|
||||||
{"-9.999999701976776123e-1", 0xBFEFFFFFF0000000u, 0xBF7FFFFFu},
|
|
||||||
{"9999999701976776124e-19", 0x3FEFFFFFF0000000u, 0x3F800000u},
|
|
||||||
{"9999999701976776123e-19", 0x3FEFFFFFF0000000u, 0x3F7FFFFFu},
|
|
||||||
{"0.99999997019767761231", 0x3FEFFFFFF0000000u, 0x3F800000u},
|
|
||||||
{"-0.999999970197677612304", 0xBFEFFFFFF0000000u, 0xBF7FFFFFu},
|
|
||||||
{"9.99999970197677612305e-1", 0x3FEFFFFFF0000000u, 0x3F800000u},
|
|
||||||
{"-1.6777217e7", 0xC170000010000000u, 0xCB800000u},
|
|
||||||
{"16777218e0", 0x4170000020000000u, 0x4B800001u},
|
|
||||||
{"16777216", 0x4170000000000000u, 0x4B800000u},
|
|
||||||
{"-1.677721701e7", 0xC17000001028F5C3u, 0xCB800001u},
|
|
||||||
{"-16777217000000000000000000001e-21", 0xC170000010000000u, 0xCB800001u},
|
|
||||||
{"16777217.000000000000000000000000000000", 0x4170000010000000u, 0x4B800000u},
|
|
||||||
{"167772155e-1", 0x416FFFFFF0000000u, 0x4B800000u},
|
|
||||||
{"16777215.6", 0x416FFFFFF3333333u, 0x4B800000u},
|
|
||||||
{"1.67772154e7", 0x416FFFFFECCCCCCDu, 0x4B7FFFFFu},
|
|
||||||
{"16777215501e-3", 0x416FFFFFF0083127u, 0x4B800000u},
|
|
||||||
{"-16777215.5000000000000000000001", 0xC16FFFFFF0000000u, 0xCB800000u},
|
|
||||||
{"-1.67772155000000000000000000000000000000e7", 0xC16FFFFFF0000000u, 0xCB800000u},
|
|
||||||
{"0.1000000052154064178466796875", 0x3FB99999B0000000u, 0x3DCCCCCEu},
|
|
||||||
{"1.000000052154064178466796876e-1", 0x3FB99999B0000000u, 0x3DCCCCCEu},
|
|
||||||
{"-1000000052154064178466796874e-28", 0xBFB99999B0000000u, 0xBDCCCCCDu},
|
|
||||||
{"0.100000005215406417846679687501", 0x3FB99999B0000000u, 0x3DCCCCCEu},
|
|
||||||
{"1.000000052154064178466796875000000000000000000001e-1", 0x3FB99999B0000000u, 0x3DCCCCCEu},
|
|
||||||
{"-1000000052154064178466796875000000000000000000000000000000e-58", 0xBFB99999B0000000u, 0xBDCCCCCEu},
|
|
||||||
{"-0.10000000521540641", 0xBFB99999AFFFFFFFu, 0xBDCCCCCDu},
|
|
||||||
{"-1.0000000521540642e-1", 0xBFB99999B0000000u, 0xBDCCCCCEu},
|
|
||||||
{"1.000000052154064178e-1", 0x3FB99999B0000000u, 0x3DCCCCCDu},
|
|
||||||
{"-1000000052154064179e-19", 0xBFB99999B0000000u, 0xBDCCCCCEu},
|
|
||||||
{"10000000521540641784e-20", 0x3FB99999B0000000u, 0x3DCCCCCDu},
|
|
||||||
{"0.10000000521540641785", 0x3FB99999B0000000u, 0x3DCCCCCEu},
|
|
||||||
{"0.100000005215406417846", 0x3FB99999B0000000u, 0x3DCCCCCDu},
|
|
||||||
{"1.00000005215406417847e-1", 0x3FB99999B0000000u, 0x3DCCCCCEu},
|
|
||||||
{"5.429001220703125e3", 0x40B5350050000000u, 0x45A9A802u},
|
|
||||||
{"-5429001220703126e-12", 0xC0B5350050000001u, 0xC5A9A803u},
|
|
||||||
{"-5429.001220703124", 0xC0B535004FFFFFFFu, 0xC5A9A802u},
|
|
||||||
{"5.42900122070312501e3", 0x40B5350050000000u, 0x45A9A803u},
|
|
||||||
{"5429001220703125000000000000000000001e-33", 0x40B5350050000000u, 0x45A9A803u},
|
|
||||||
{"-5429.001220703125000000000000000000000000000000", 0xC0B5350050000000u, 0xC5A9A802u},
|
|
||||||
{"503719056e0", 0x41BE062490000000u, 0x4DF03124u},
|
|
||||||
{"503719057", 0x41BE062491000000u, 0x4DF03125u},
|
|
||||||
{"5.03719055e8", 0x41BE06248F000000u, 0x4DF03124u},
|
|
||||||
{"50371905601e-2", 0x41BE062490028F5Cu, 0x4DF03125u},
|
|
||||||
{"503719056.000000000000000000001", 0x41BE062490000000u, 0x4DF03125u},
|
|
||||||
{"5.03719056000000000000000000000000000000e8", 0x41BE062490000000u, 0x4DF03124u},
|
|
||||||
{"-92331620", 0xC196037990000000u, 0xCCB01BCCu},
|
|
||||||
{"9.233163e7", 0x41960379B8000000u, 0x4CB01BCEu},
|
|
||||||
{"9233161e1", 0x4196037968000000u, 0x4CB01BCBu},
|
|
||||||
{"92331620.1", 0x4196037990666666u, 0x4CB01BCDu},
|
|
||||||
{"9.233162000000000000000000001e7", 0x4196037990000000u, 0x4CB01BCDu},
|
|
||||||
{"9233162000000000000000000000000000000e-29", 0x4196037990000000u, 0x4CB01BCCu},
|
|
||||||
{"3.002458625e6", 0x4146E82D50000000u, 0x4A37416Au},
|
|
||||||
{"3002458626e-3", 0x4146E82D5020C49Cu, 0x4A37416Bu},
|
|
||||||
{"3002458.624", 0x4146E82D4FDF3B64u, 0x4A37416Au},
|
|
||||||
{"-3.00245862501e6", 0xC146E82D500053E3u, 0xCA37416Bu},
|
|
||||||
{"3002458625000000000000000000001e-24", 0x4146E82D50000000u, 0x4A37416Bu},
|
|
||||||
{"3002458.625000000000000000000000000000000", 0x4146E82D50000000u, 0x4A37416Au},
|
|
||||||
{"-1095485584696182596504479582065262592e1", 0xC7A07BA830000000u, 0xFD03DD42u},
|
|
||||||
{"10954855846961825965044795820652625930", 0x47A07BA830000000u, 0x7D03DD42u},
|
|
||||||
{"1.095485584696182596504479582065262591e37", 0x47A07BA830000000u, 0x7D03DD41u},
|
|
||||||
{"109548558469618259650447958206526259201e-1", 0x47A07BA830000000u, 0x7D03DD42u},
|
|
||||||
{"-10954855846961825965044795820652625920.00000000000000000001", 0xC7A07BA830000000u, 0xFD03DD42u},
|
|
||||||
{"1.095485584696182596504479582065262592000000000000000000000000000000e37", 0x47A07BA830000000u, 0x7D03DD42u},
|
|
||||||
{"10954855846961825e21", 0x47A07BA830000000u, 0x7D03DD41u},
|
|
||||||
{"10954855846961826000000000000000000000", 0x47A07BA830000000u, 0x7D03DD42u},
|
|
||||||
{"10954855846961825960000000000000000000", 0x47A07BA830000000u, 0x7D03DD41u},
|
|
||||||
{"1.095485584696182597e37", 0x47A07BA830000000u, 0x7D03DD42u},
|
|
||||||
{"1.0954855846961825965e37", 0x47A07BA830000000u, 0x7D03DD41u},
|
|
||||||
{"-10954855846961825966e18", 0xC7A07BA830000000u, 0xFD03DD42u},
|
|
||||||
{"10954855846961825965e18", 0x47A07BA830000000u, 0x7D03DD41u},
|
|
||||||
{"10954855846961825965100000000000000000", 0x47A07BA830000000u, 0x7D03DD42u},
|
|
||||||
{"10954855846961825965044795820600000000", 0x47A07BA830000000u, 0x7D03DD41u},
|
|
||||||
{"-1.09548558469618259650447958207e37", 0xC7A07BA830000000u, 0xFD03DD42u},
|
|
||||||
{"1.6449216019182103706535606608388384863861375606575165875256061553955078126e-21", 0x3B9F125A50000000u, 0x1CF892D3u},
|
|
||||||
{"-16449216019182103706535606608388384863861375606575165875256061553955078124e-94", 0xBB9F125A50000000u, 0x9CF892D2u},
|
|
||||||
{"-0.0000000000000000000016449216019182103", 0xBB9F125A50000000u, 0x9CF892D2u},
|
|
||||||
{"-1.6449216019182104e-21", 0xBB9F125A50000000u, 0x9CF892D3u},
|
|
||||||
{"-1.64492160191821037e-21", 0xBB9F125A50000000u, 0x9CF892D2u},
|
|
||||||
{"-1644921601918210371e-39", 0xBB9F125A50000000u, 0x9CF892D3u},
|
|
||||||
{"-16449216019182103706e-40", 0xBB9F125A50000000u, 0x9CF892D2u},
|
|
||||||
{"0.0000000000000000000016449216019182103707", 0x3B9F125A50000000u, 0x1CF892D3u},
|
|
||||||
{"0.00000000000000000000164492160191821037065", 0x3B9F125A50000000u, 0x1CF892D2u},
|
|
||||||
{"1.64492160191821037066e-21", 0x3B9F125A50000000u, 0x1CF892D3u},
|
|
||||||
{"1.64492160191821037065356066083e-21", 0x3B9F125A50000000u, 0x1CF892D2u},
|
|
||||||
{"164492160191821037065356066084e-50", 0x3B9F125A50000000u, 0x1CF892D3u},
|
|
||||||
{"6.565061509609222412109375e-1", 0x3FE5021930000000u, 0x3F2810CAu},
|
|
||||||
{"6565061509609222412109376e-25", 0x3FE5021930000000u, 0x3F2810CAu},
|
|
||||||
{"0.6565061509609222412109374", 0x3FE5021930000000u, 0x3F2810C9u},
|
|
||||||
{"6.56506150960922241210937501e-1", 0x3FE5021930000000u, 0x3F2810CAu},
|
|
||||||
{"6565061509609222412109375000000000000000000001e-46", 0x3FE5021930000000u, 0x3F2810CAu},
|
|
||||||
{"-0.6565061509609222412109375000000000000000000000000000000", 0xBFE5021930000000u, 0xBF2810CAu},
|
|
||||||
{"6.5650615096092224e-1", 0x3FE5021930000000u, 0x3F2810C9u},
|
|
||||||
{"-65650615096092225e-17", 0xBFE5021930000000u, 0xBF2810CAu},
|
|
||||||
{"6565061509609222412e-19", 0x3FE5021930000000u, 0x3F2810C9u},
|
|
||||||
{"0.6565061509609222413", 0x3FE5021930000000u, 0x3F2810CAu},
|
|
||||||
{"0.65650615096092224121", 0x3FE5021930000000u, 0x3F2810C9u},
|
|
||||||
{"6.5650615096092224122e-1", 0x3FE5021930000000u, 0x3F2810CAu},
|
|
||||||
{"-6.5650615096092224121e-1", 0xBFE5021930000000u, 0xBF2810C9u},
|
|
||||||
{"656506150960922241211e-21", 0x3FE5021930000000u, 0x3F2810CAu},
|
|
||||||
{"18014627239033005156980393746124491372029297053813934326171875e-77", 0x3CA9F63970000000u, 0x254FB1CCu},
|
|
||||||
{"0.00000000000000018014627239033005156980393746124491372029297053813934326171876", 0x3CA9F63970000000u, 0x254FB1CCu},
|
|
||||||
{"-1.8014627239033005156980393746124491372029297053813934326171874e-16", 0xBCA9F63970000000u, 0xA54FB1CBu},
|
|
||||||
{"1801462723903300515698039374612449137202929705381393432617187501e-79", 0x3CA9F63970000000u, 0x254FB1CCu},
|
|
||||||
{"18014627239033005e-32", 0x3CA9F63970000000u, 0x254FB1CBu},
|
|
||||||
{"0.00000000000000018014627239033006", 0x3CA9F63970000000u, 0x254FB1CCu},
|
|
||||||
{"0.0000000000000001801462723903300515", 0x3CA9F63970000000u, 0x254FB1CBu},
|
|
||||||
{"-1.801462723903300516e-16", 0xBCA9F63970000000u, 0xA54FB1CCu},
|
|
||||||
{"-1.8014627239033005156e-16", 0xBCA9F63970000000u, 0xA54FB1CBu},
|
|
||||||
{"18014627239033005157e-35", 0x3CA9F63970000000u, 0x254FB1CCu},
|
|
||||||
{"180146272390330051569e-36", 0x3CA9F63970000000u, 0x254FB1CBu},
|
|
||||||
{"-0.00000000000000018014627239033005157", 0xBCA9F63970000000u, 0xA54FB1CCu},
|
|
||||||
{"0.000000000000000180146272390330051569803937461", 0x3CA9F63970000000u, 0x254FB1CBu},
|
|
||||||
{"1.80146272390330051569803937462e-16", 0x3CA9F63970000000u, 0x254FB1CCu},
|
|
||||||
{"0.05534819327294826507568359375", 0x3FAC569930000000u, 0x3D62B4CAu},
|
|
||||||
{"-5.534819327294826507568359376e-2", 0xBFAC569930000000u, 0xBD62B4CAu},
|
|
||||||
{"5534819327294826507568359374e-29", 0x3FAC569930000000u, 0x3D62B4C9u},
|
|
||||||
{"-0.0553481932729482650756835937501", 0xBFAC569930000000u, 0xBD62B4CAu},
|
|
||||||
{"5.534819327294826507568359375000000000000000000001e-2", 0x3FAC569930000000u, 0x3D62B4CAu},
|
|
||||||
{"5534819327294826507568359375000000000000000000000000000000e-59", 0x3FAC569930000000u, 0x3D62B4CAu},
|
|
||||||
{"0.055348193272948265", 0x3FAC569930000000u, 0x3D62B4C9u},
|
|
||||||
{"5.5348193272948266e-2", 0x3FAC569930000000u, 0x3D62B4CAu},
|
|
||||||
{"5.534819327294826507e-2", 0x3FAC569930000000u, 0x3D62B4C9u},
|
|
||||||
{"5534819327294826508e-20", 0x3FAC569930000000u, 0x3D62B4CAu},
|
|
||||||
{"55348193272948265075e-21", 0x3FAC569930000000u, 0x3D62B4C9u},
|
|
||||||
{"-0.055348193272948265076", 0xBFAC569930000000u, 0xBD62B4CAu},
|
|
||||||
{"0.0553481932729482650756", 0x3FAC569930000000u, 0x3D62B4C9u},
|
|
||||||
{"-5.53481932729482650757e-2", 0xBFAC569930000000u, 0xBD62B4CAu},
|
|
||||||
{"5.179692133247783258005389047985340416e36", 0x478F2C9450000000u, 0x7C7964A2u},
|
|
||||||
{"5179692133247783258005389047985340417e0", 0x478F2C9450000000u, 0x7C7964A3u},
|
|
||||||
{"5179692133247783258005389047985340415", 0x478F2C9450000000u, 0x7C7964A2u},
|
|
||||||
{"-5.17969213324778325800538904798534041601e36", 0xC78F2C9450000000u, 0xFC7964A3u},
|
|
||||||
{"-5179692133247783258005389047985340416000000000000000000001e-21", 0xC78F2C9450000000u, 0xFC7964A3u},
|
|
||||||
{"-5179692133247783258005389047985340416.000000000000000000000000000000", 0xC78F2C9450000000u, 0xFC7964A2u},
|
|
||||||
{"5.1796921332477832e36", 0x478F2C9450000000u, 0x7C7964A2u},
|
|
||||||
{"51796921332477833e20", 0x478F2C9450000000u, 0x7C7964A3u},
|
|
||||||
{"-5179692133247783258e18", 0xC78F2C9450000000u, 0xFC7964A2u},
|
|
||||||
{"5179692133247783259000000000000000000", 0x478F2C9450000000u, 0x7C7964A3u},
|
|
||||||
{"5179692133247783258000000000000000000", 0x478F2C9450000000u, 0x7C7964A2u},
|
|
||||||
{"5.1796921332477832581e36", 0x478F2C9450000000u, 0x7C7964A3u},
|
|
||||||
{"-5.179692133247783258e36", 0xC78F2C9450000000u, 0xFC7964A2u},
|
|
||||||
{"-517969213324778325801e16", 0xC78F2C9450000000u, 0xFC7964A3u},
|
|
||||||
{"517969213324778325800538904798e7", 0x478F2C9450000000u, 0x7C7964A2u},
|
|
||||||
{"5179692133247783258005389047990000000", 0x478F2C9450000000u, 0x7C7964A3u},
|
|
||||||
{
|
|
||||||
"0.22250738585072011360574097967091319759348195463516456480234261097248222220210769455165295239081350"
|
|
||||||
"8791414915891303962110687008643869459464552765720740782062174337998814106326732925355228688137214901"
|
|
||||||
"2981122451451889849057222307285255133155755015914397476397983411801999323962548289017107081850690630"
|
|
||||||
"6666559949382757725720157630626906633326475653000092458883164330377797918696120494973903778297049050"
|
|
||||||
"5108060994073026293712895895000358379996720725430436028407889577179615094551674824347103070260914462"
|
|
||||||
"1572289880258182545180325707018860872113128079512233426288368622321503775666622503982534335974568884"
|
|
||||||
"4239002654981983854879482922068947216898310996983658468140228542433306603398508864458040010349339704"
|
|
||||||
"2756718644338377048603786162277173854562306587467901408672332763671875e-307", 0x0010000000000000u, 0x00000000u
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"2.22507385850720113605740979670913197593481954635164564802342610972482222202107694551652952390813508"
|
|
||||||
"7914149158913039621106870086438694594645527657207407820621743379988141063267329253552286881372149012"
|
|
||||||
"9811224514518898490572223072852551331557550159143974763979834118019993239625482890171070818506906306"
|
|
||||||
"6665599493827577257201576306269066333264756530000924588831643303777979186961204949739037782970490505"
|
|
||||||
"1080609940730262937128958950003583799967207254304360284078895771796150945516748243471030702609144621"
|
|
||||||
"5722898802581825451803257070188608721131280795122334262883686223215037756666225039825343359745688844"
|
|
||||||
"2390026549819838548794829220689472168983109969836584681402285424333066033985088644580400103493397042"
|
|
||||||
"756718644338377048603786162277173854562306587467901408672332763671875000000000000000000001e-308", 0x0010000000000000u, 0x00000000u
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"0.11754942807573642917278829910357665133228589927589904276829631184250030649651730385585324256680905"
|
|
||||||
"8189392089843750000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
|
|
||||||
"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
|
|
||||||
"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
|
|
||||||
"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
|
|
||||||
"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
|
|
||||||
"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
|
|
||||||
"00000000000000000000000000000000000000000000000000000000000000000e-37", 0x380FFFFFE0000000u, 0x00800000u
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"1175494280757364291727882991035766513322858992758990427682963118425003064965173038558532425668090581"
|
|
||||||
"8939208984375000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
|
|
||||||
"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
|
|
||||||
"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
|
|
||||||
"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
|
|
||||||
"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
|
|
||||||
"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
|
|
||||||
"00000000000001e-751", 0x380FFFFFE0000000u, 0x00800000u
|
|
||||||
},
|
|
||||||
{"0", 0x0000000000000000u, 0x00000000u},
|
|
||||||
{"-0", 0x8000000000000000u, 0x80000000u},
|
|
||||||
{"0.0", 0x0000000000000000u, 0x00000000u},
|
|
||||||
{"-0.0", 0x8000000000000000u, 0x80000000u},
|
|
||||||
{"0e999999999999999999999", 0x0000000000000000u, 0x00000000u},
|
|
||||||
{"-0.000e-99999", 0x8000000000000000u, 0x80000000u},
|
|
||||||
{"1e-400", 0x0000000000000000u, 0x00000000u},
|
|
||||||
{"-1e-400", 0x8000000000000000u, 0x80000000u},
|
|
||||||
{"1e400", 0x7FF0000000000000u, 0x7F800000u},
|
|
||||||
{"-1e400", 0xFFF0000000000000u, 0xFF800000u},
|
|
||||||
{"1e-50", 0x358DEE7A4AD4B81Fu, 0x00000000u},
|
|
||||||
{"-1e-50", 0xB58DEE7A4AD4B81Fu, 0x80000000u},
|
|
||||||
{"1e39", 0x48078287F49C4A1Du, 0x7F800000u},
|
|
||||||
{"-1e39", 0xC8078287F49C4A1Du, 0xFF800000u},
|
|
||||||
{"1e99999999999999999999999999", 0x7FF0000000000000u, 0x7F800000u},
|
|
||||||
{"1e-99999999999999999999999999", 0x0000000000000000u, 0x00000000u},
|
|
||||||
{"1e0000000000000000000000000000000000000000308", 0x7FE1CCF385EBC8A0u, 0x7F800000u},
|
|
||||||
{"123456789012345678901234567890e-30", 0x3FBF9ADD3746F65Fu, 0x3DFCD6EAu},
|
|
||||||
{"18446744073709551615", 0x43F0000000000000u, 0x5F800000u},
|
|
||||||
{"18446744073709551616", 0x43F0000000000000u, 0x5F800000u},
|
|
||||||
{"-9223372036854775808", 0xC3E0000000000000u, 0xDF000000u},
|
|
||||||
{"-9223372036854775809", 0xC3E0000000000000u, 0xDF000000u},
|
|
||||||
}
|
|
||||||
};
|
|
||||||
return table;
|
|
||||||
}
|
|
||||||
|
|
||||||
} // namespace float_hard_cases
|
|
||||||
+106
-560
@@ -13,20 +13,16 @@
|
|||||||
using nlohmann::json;
|
using nlohmann::json;
|
||||||
|
|
||||||
#include <array> // array
|
#include <array> // array
|
||||||
|
#include <cfloat> // FLT_EVAL_METHOD
|
||||||
#include <cstdint> // uint32_t, uint64_t
|
#include <cstdint> // uint32_t, uint64_t
|
||||||
#include <cstdio> // snprintf
|
|
||||||
#include <cstdlib> // strtod
|
#include <cstdlib> // strtod
|
||||||
#include <cstring> // memcpy
|
#include <cstring> // memcpy
|
||||||
#include <limits> // numeric_limits
|
#include <limits> // numeric_limits
|
||||||
#include <map> // map
|
|
||||||
#include <random> // mt19937
|
|
||||||
#include <sstream> // stringstream
|
#include <sstream> // stringstream
|
||||||
#include <string> // string
|
#include <string> // string
|
||||||
#include <utility> // pair
|
#include <utility> // pair
|
||||||
#include <vector> // vector
|
#include <vector> // vector
|
||||||
|
|
||||||
#include "float_hard_cases.hpp"
|
|
||||||
|
|
||||||
namespace
|
namespace
|
||||||
{
|
{
|
||||||
// shortcut to scan a string literal
|
// shortcut to scan a string literal
|
||||||
@@ -262,7 +258,7 @@ TEST_CASE("lexer number fast path")
|
|||||||
"123456789012345678901234567890", // huge -> float
|
"123456789012345678901234567890", // huge -> float
|
||||||
"0.30000000000000004", "2.2250738585072014e-308", "1e308",
|
"0.30000000000000004", "2.2250738585072014e-308", "1e308",
|
||||||
// high-precision / wide-exponent values that exercise the
|
// high-precision / wide-exponent values that exercise the
|
||||||
// Eisel-Lemire path beyond the Clinger subset
|
// std::from_chars (Eisel-Lemire) path beyond the Clinger subset
|
||||||
"1.7976931348623157e308", "1.2345678901234567e-250",
|
"1.7976931348623157e308", "1.2345678901234567e-250",
|
||||||
"9007199254740993", "5e-324", "1e-320"
|
"9007199254740993", "5e-324", "1e-320"
|
||||||
};
|
};
|
||||||
@@ -284,18 +280,20 @@ TEST_CASE("lexer number fast path")
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
SECTION("significant digits around Clinger's fast path")
|
SECTION("significant-digit gate for the Clinger fast path")
|
||||||
{
|
{
|
||||||
// Clinger's fast path needs a significand of at most 2^53, which
|
// Clinger's fast path needs a significand below 2^53, so it cannot
|
||||||
// tokens with 17 or more significant digits exceed. The conversion
|
// succeed once the mantissa has 17 or more significant digits (the
|
||||||
// splits the token at the positions the scanners recorded, so leading
|
// significand would be at least 10^16). The lexer skips the attempt
|
||||||
// zeros must not count as digits - "0.1234567890123456" has 16
|
// there. That is only allowed to save work: every value must still come
|
||||||
// significant digits, not 17 - and both scanners must agree.
|
// out bit-exactly, and both scanners must agree. In particular the gate
|
||||||
|
// must not fire for tokens whose leading zeros merely look like extra
|
||||||
|
// digits - "0.1234567890123456" has 16 significant digits, not 17.
|
||||||
const std::vector<std::string> numbers =
|
const std::vector<std::string> numbers =
|
||||||
{
|
{
|
||||||
"1234567890123456", // 16 significant digits
|
"1234567890123456", // 16 significant digits
|
||||||
"12345678901234567", // 17
|
"12345678901234567", // 17 -> attempt skipped
|
||||||
"123456789012345678", // 18
|
"123456789012345678", // 18 -> attempt skipped
|
||||||
"0.1234567890123456", // 16: the leading "0" is not significant
|
"0.1234567890123456", // 16: the leading "0" is not significant
|
||||||
"0.12345678901234567", // 17
|
"0.12345678901234567", // 17
|
||||||
"0.00000000000000001", // 1, in a long token
|
"0.00000000000000001", // 1, in a long token
|
||||||
@@ -666,323 +664,46 @@ TEST_CASE("lexer string fast path")
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_CASE("lexer escape fast path")
|
TEST_CASE("parse_float_fast declines what it cannot convert exactly")
|
||||||
{
|
{
|
||||||
// json::accept() never throws, so this section stays covered without
|
// The lexer only hands well-formed numbers to parse_float_fast, so the
|
||||||
// exceptions; it pins which of the cases below are valid/invalid and
|
// malformed ones below can only be passed to it directly. Declining is
|
||||||
// checks the contiguous and streaming paths agree on that classification.
|
// always safe: the caller then falls back to a slower, exact conversion.
|
||||||
SECTION("accept() parity")
|
const auto fast = [](const std::string & s, double & out)
|
||||||
{
|
{
|
||||||
const std::vector<std::pair<std::string, bool>> cases =
|
return nlohmann::detail::parse_float_fast(s.data(), s.data() + s.size(), out);
|
||||||
{
|
|
||||||
{"\\u0041", true}, {"\\u00e4", true}, {"\\u00E4", true},
|
|
||||||
{"\\uD83D\\uDE00", true},
|
|
||||||
{"\\u12", false}, {"\\u12G4", false}, {"\\uXYZW", false},
|
|
||||||
{"\\uD800", false}, {"\\uD800A", false}, {"\\uD800\\u0041", false},
|
|
||||||
{"\\uDC00", false}, {"\\u", false}
|
|
||||||
};
|
|
||||||
|
|
||||||
for (const auto& c : cases)
|
|
||||||
{
|
|
||||||
for (const std::size_t offset :
|
|
||||||
{
|
|
||||||
std::size_t{0}, std::size_t{9}
|
|
||||||
})
|
|
||||||
{
|
|
||||||
const std::string doc = "[\"" + std::string(offset, 'a') + c.first + "\"]";
|
|
||||||
CAPTURE(doc)
|
|
||||||
CHECK(json::accept(doc) == c.second);
|
|
||||||
std::stringstream ss(doc);
|
|
||||||
CHECK(json::accept(ss) == c.second);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#if !defined(JSON_NOEXCEPTION)
|
|
||||||
// the full outcome of parsing @a doc: the parsed value, or the exact
|
|
||||||
// error message, so a mismatch in either is caught
|
|
||||||
const auto outcome = [](const std::string & doc, bool streaming) -> std::string
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
if (streaming)
|
|
||||||
{
|
|
||||||
std::stringstream ss(doc);
|
|
||||||
const json j = json::parse(ss);
|
|
||||||
return j.dump();
|
|
||||||
}
|
|
||||||
const json j = json::parse(doc);
|
|
||||||
return j.dump();
|
|
||||||
}
|
|
||||||
catch (const json::exception& e)
|
|
||||||
{
|
|
||||||
return {e.what()};
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
|
double out = 0;
|
||||||
|
|
||||||
SECTION("contiguous vs streaming parity")
|
#if defined(FLT_EVAL_METHOD) && FLT_EVAL_METHOD != 0
|
||||||
{
|
// without true double precision, the fast path declines everything
|
||||||
const std::vector<std::string> escapes =
|
CHECK_FALSE(fast("1.5", out));
|
||||||
{
|
#else
|
||||||
"\\u0041", // "A"
|
CHECK(fast("1.5", out));
|
||||||
"\\u00e4", // "ä" (lowercase hex)
|
CHECK(out == 1.5);
|
||||||
"\\u00E4", // "ä" (uppercase hex)
|
CHECK(fast("+2.5e1", out));
|
||||||
"\\uD83D\\uDE00", // valid surrogate pair (an emoji)
|
CHECK(out == 25.0);
|
||||||
"\\u12", // truncated: only 2 hex digits before the closing quote
|
CHECK(fast("-25E-1", out));
|
||||||
"\\u12G4", // invalid hex digit at the 3rd position
|
CHECK(out == -2.5);
|
||||||
"\\uXYZW", // all 4 bytes invalid
|
CHECK(fast("1e", out));
|
||||||
"\\uD800", // lone high surrogate, string ends right after
|
CHECK(out == 1.0);
|
||||||
"\\uD800A", // high surrogate not followed by another \u escape
|
|
||||||
"\\uD800\\u0041", // high surrogate followed by \u, but not a low surrogate
|
|
||||||
"\\uDC00", // lone low surrogate
|
|
||||||
"\\u", // '\u' with nothing after (closing quote right away)
|
|
||||||
};
|
|
||||||
|
|
||||||
// once at the start of the string and once past the first 8-byte SWAR
|
|
||||||
// word of the outer string_bulk_run, so the escape is reached both
|
|
||||||
// right after the opening quote and mid-run
|
|
||||||
for (const auto& escape : escapes)
|
|
||||||
{
|
|
||||||
for (const std::size_t offset :
|
|
||||||
{
|
|
||||||
std::size_t{0}, std::size_t{9}
|
|
||||||
})
|
|
||||||
{
|
|
||||||
const std::string doc = "[\"" + std::string(offset, 'a') + escape + "\"]";
|
|
||||||
CAPTURE(doc)
|
|
||||||
CHECK(outcome(doc, false) == outcome(doc, true));
|
|
||||||
}
|
|
||||||
|
|
||||||
// the escape is the last thing before end of input: no closing
|
|
||||||
// quote at all
|
|
||||||
const std::string truncated_doc = "[\"" + escape;
|
|
||||||
CAPTURE(truncated_doc)
|
|
||||||
CHECK(outcome(truncated_doc, false) == outcome(truncated_doc, true));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
SECTION("truncated \\u escape at every distance from the end of input")
|
|
||||||
{
|
|
||||||
// ia.bulk_remaining() must correctly report fewer than 4 bytes for
|
|
||||||
// every possible count of trailing hex-looking bytes (0, 1, 2, or 3)
|
|
||||||
// before end of input, so the fast path declines and the byte path
|
|
||||||
// alone reports the "must be followed by 4 hex digits" error, at the
|
|
||||||
// same position, in every case
|
|
||||||
for (const std::string& tail :
|
|
||||||
{
|
|
||||||
std::string{}, std::string("1"), std::string("12"), std::string("123")
|
|
||||||
})
|
|
||||||
{
|
|
||||||
const std::string doc = "[\"\\u" + tail;
|
|
||||||
CAPTURE(doc)
|
|
||||||
CHECK(outcome(doc, false) == outcome(doc, true));
|
|
||||||
CHECK(outcome(doc, false).find("must be followed by 4 hex digits") != std::string::npos);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
SECTION("invalid hex digit at every position of the 4")
|
|
||||||
{
|
|
||||||
// the fast path must decline for *any* invalid byte among the 4, not
|
|
||||||
// just the first, and the byte path must then stop at exactly that
|
|
||||||
// position - same as it always has
|
|
||||||
for (std::size_t bad_pos = 0; bad_pos < 4; ++bad_pos)
|
|
||||||
{
|
|
||||||
std::string digits = "1234";
|
|
||||||
digits[bad_pos] = 'g'; // not a hex digit
|
|
||||||
const std::string doc = "[\"\\u" + digits + "\"]";
|
|
||||||
CAPTURE(doc)
|
|
||||||
CHECK(outcome(doc, false) == outcome(doc, true));
|
|
||||||
CHECK(outcome(doc, false).find("must be followed by 4 hex digits") != std::string::npos);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
SECTION("random escapes")
|
|
||||||
{
|
|
||||||
// A seeded PRNG builds the 4 bytes following `\u` from a mix of hex
|
|
||||||
// digits and non-hex bytes, at varying distances from the start of
|
|
||||||
// the string, to compare the two scanners on many more shapes than
|
|
||||||
// are practical to enumerate by hand.
|
|
||||||
std::mt19937 gen(7654321); // NOLINT(cert-msc32-c,cert-msc51-cpp,bugprone-random-generator-seed)
|
|
||||||
const std::string hex_alphabet = "0123456789AaBbCcDdEeFf";
|
|
||||||
std::uniform_int_distribution<std::size_t> pick_hex(0, hex_alphabet.size() - 1);
|
|
||||||
std::uniform_int_distribution<int> pick_byte(1, 255); // never NUL
|
|
||||||
std::uniform_int_distribution<int> pick_is_hex(0, 4); // 4-in-5 chance of a hex digit
|
|
||||||
std::uniform_int_distribution<std::size_t> pick_offset(0, 12);
|
|
||||||
|
|
||||||
std::vector<std::string> mismatches;
|
|
||||||
for (int iter = 0; iter < 3000; ++iter)
|
|
||||||
{
|
|
||||||
std::string digits;
|
|
||||||
for (int i = 0; i < 4; ++i)
|
|
||||||
{
|
|
||||||
if (pick_is_hex(gen) != 0)
|
|
||||||
{
|
|
||||||
digits += hex_alphabet[pick_hex(gen)];
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
char c = static_cast<char>(pick_byte(gen));
|
|
||||||
if (c == '"' || c == '\\')
|
|
||||||
{
|
|
||||||
// keep the string well-formed apart from the escape
|
|
||||||
// itself, so any mismatch is attributable to the \u
|
|
||||||
// handling and not to an unrelated quote/escape
|
|
||||||
c = 'z';
|
|
||||||
}
|
|
||||||
digits += c;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
const std::string doc = "[\"" + std::string(pick_offset(gen), 'a') + "\\u" + digits + "\"]";
|
|
||||||
if (outcome(doc, false) != outcome(doc, true))
|
|
||||||
{
|
|
||||||
mismatches.push_back(doc);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
CAPTURE(mismatches)
|
|
||||||
CHECK(mismatches.empty());
|
|
||||||
}
|
|
||||||
#endif
|
#endif
|
||||||
}
|
|
||||||
|
|
||||||
namespace
|
// not a number
|
||||||
{
|
CHECK_FALSE(fast("", out));
|
||||||
// the index of the decimal point (or npos) and of the end of the mantissa of a
|
CHECK_FALSE(fast("-", out));
|
||||||
// number token, which the lexer records while scanning it
|
CHECK_FALSE(fast(".", out));
|
||||||
std::pair<std::size_t, std::size_t> float_token_layout(const std::string& s)
|
CHECK_FALSE(fast("1.2.3", out));
|
||||||
{
|
CHECK_FALSE(fast("1x", out));
|
||||||
std::size_t dot = std::string::npos;
|
CHECK_FALSE(fast("1e+", out));
|
||||||
std::size_t mantissa_end = s.size();
|
CHECK_FALSE(fast("1e1x", out));
|
||||||
for (std::size_t i = 0; i < s.size(); ++i)
|
|
||||||
{
|
|
||||||
if (s[i] == '.')
|
|
||||||
{
|
|
||||||
dot = i;
|
|
||||||
}
|
|
||||||
else if (s[i] == 'e' || s[i] == 'E')
|
|
||||||
{
|
|
||||||
mantissa_end = i;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return {dot, mantissa_end};
|
|
||||||
}
|
|
||||||
|
|
||||||
template<typename FloatType>
|
// numbers that are not represented exactly on the fast path
|
||||||
FloatType parse_native(const std::string& s)
|
CHECK_FALSE(fast("12345678901234567890", out));
|
||||||
{
|
CHECK_FALSE(fast("1e10000", out));
|
||||||
const auto layout = float_token_layout(s);
|
CHECK_FALSE(fast("9007199254740993", out));
|
||||||
return nlohmann::detail::parse_float_native<FloatType>(s.data(), s.data() + s.size(), layout.first, layout.second);
|
CHECK_FALSE(fast("1e23", out));
|
||||||
}
|
CHECK_FALSE(fast("1e-23", out));
|
||||||
|
|
||||||
std::uint64_t bits_of(double d)
|
|
||||||
{
|
|
||||||
std::uint64_t b = 0;
|
|
||||||
std::memcpy(&b, &d, sizeof(b));
|
|
||||||
return b;
|
|
||||||
}
|
|
||||||
|
|
||||||
std::uint32_t bits_of(float f)
|
|
||||||
{
|
|
||||||
std::uint32_t b = 0;
|
|
||||||
std::memcpy(&b, &f, sizeof(b));
|
|
||||||
return b;
|
|
||||||
}
|
|
||||||
|
|
||||||
std::uint64_t native_bits64(const std::string& s)
|
|
||||||
{
|
|
||||||
return bits_of(parse_native<double>(s));
|
|
||||||
}
|
|
||||||
|
|
||||||
std::uint32_t native_bits32(const std::string& s)
|
|
||||||
{
|
|
||||||
return bits_of(parse_native<float>(s));
|
|
||||||
}
|
|
||||||
} // namespace
|
|
||||||
|
|
||||||
TEST_CASE("parse_float_native rounds correctly")
|
|
||||||
{
|
|
||||||
SECTION("double")
|
|
||||||
{
|
|
||||||
CHECK(native_bits64("1.5") == 0x3FF8000000000000u);
|
|
||||||
CHECK(native_bits64("0.1") == 0x3FB999999999999Au);
|
|
||||||
CHECK(native_bits64("-0.0") == 0x8000000000000000u);
|
|
||||||
CHECK(native_bits64("0e999999999999999999999") == 0u);
|
|
||||||
// 2^53 + 1 is exactly between two doubles: ties to even, unless more digits follow
|
|
||||||
CHECK(native_bits64("9007199254740993") == 0x4340000000000000u);
|
|
||||||
CHECK(native_bits64("9007199254740993.0000000000000000001") == 0x4340000000000001u);
|
|
||||||
CHECK(native_bits64("9007199254740992.9999999999999999999") == 0x4340000000000000u);
|
|
||||||
// 1 + 2^-53 exactly (a tie), and one unit in the 55th digit around it
|
|
||||||
CHECK(native_bits64("1.00000000000000011102230246251565404236316680908203125") == 0x3FF0000000000000u);
|
|
||||||
CHECK(native_bits64("1.00000000000000011102230246251565404236316680908203126") == 0x3FF0000000000001u);
|
|
||||||
CHECK(native_bits64("1.00000000000000011102230246251565404236316680908203124") == 0x3FF0000000000000u);
|
|
||||||
// subnormal and overflow boundaries
|
|
||||||
CHECK(native_bits64("2.4703282292062327e-324") == 0u);
|
|
||||||
CHECK(native_bits64("2.4703282292062328e-324") == 1u);
|
|
||||||
CHECK(native_bits64("2.2250738585072011e-308") == 0x000FFFFFFFFFFFFFu);
|
|
||||||
CHECK(native_bits64("2.2250738585072012e-308") == 0x0010000000000000u);
|
|
||||||
CHECK(native_bits64("1.7976931348623157e308") == 0x7FEFFFFFFFFFFFFFu);
|
|
||||||
CHECK(native_bits64("1.7976931348623159e308") == 0x7FF0000000000000u);
|
|
||||||
CHECK(native_bits64("-1e400") == 0xFFF0000000000000u);
|
|
||||||
CHECK(native_bits64("-1e-400") == 0x8000000000000000u);
|
|
||||||
// exponents and zeros far beyond the range cancel out
|
|
||||||
CHECK(native_bits64("0." + std::string(1000, '0') + "1e1001") == 0x3FF0000000000000u);
|
|
||||||
CHECK(native_bits64("1" + std::string(1000, '0') + "e-1000") == 0x3FF0000000000000u);
|
|
||||||
CHECK(native_bits64("1e-99999999999999999999999") == 0u);
|
|
||||||
CHECK(native_bits64("1E+99999999999999999999999") == 0x7FF0000000000000u);
|
|
||||||
// more digits than any midpoint has (769): only whether a nonzero digit follows matters
|
|
||||||
const std::string tie = "1.00000000000000011102230246251565404236316680908203125";
|
|
||||||
CHECK(native_bits64(tie + std::string(800, '0')) == 0x3FF0000000000000u);
|
|
||||||
CHECK(native_bits64(tie + std::string(800, '0') + "1") == 0x3FF0000000000001u);
|
|
||||||
}
|
|
||||||
|
|
||||||
SECTION("float")
|
|
||||||
{
|
|
||||||
CHECK(native_bits32("1.5") == 0x3FC00000u);
|
|
||||||
CHECK(native_bits32("0.1") == 0x3DCCCCCDu);
|
|
||||||
CHECK(native_bits32("-0.0") == 0x80000000u);
|
|
||||||
// 2^24 + 1 is exactly between two floats
|
|
||||||
CHECK(native_bits32("16777217") == 0x4B800000u);
|
|
||||||
CHECK(native_bits32("16777217.000000000000000000001") == 0x4B800001u);
|
|
||||||
CHECK(native_bits32("16777218.999999999999999999999") == 0x4B800001u);
|
|
||||||
CHECK(native_bits32("16777219") == 0x4B800002u);
|
|
||||||
// subnormal and overflow boundaries
|
|
||||||
CHECK(native_bits32("3.4028235677973366e38") == 0x7F7FFFFFu);
|
|
||||||
CHECK(native_bits32("3.4028235677973367e38") == 0x7F800000u);
|
|
||||||
CHECK(native_bits32("7.006492321624085e-46") == 0u);
|
|
||||||
CHECK(native_bits32("7.006492321624086e-46") == 1u);
|
|
||||||
CHECK(native_bits32("1.1754942e-38") == 0x007FFFFFu);
|
|
||||||
CHECK(native_bits32("-1.17549435e-38") == 0x80800000u);
|
|
||||||
CHECK(native_bits32("1e39") == 0x7F800000u);
|
|
||||||
CHECK(native_bits32("-1e-50") == 0x80000000u);
|
|
||||||
// not rounded through double: its double would round to another float
|
|
||||||
CHECK(native_bits32("1.00000005960464477539062500000000001") == 0x3F800001u);
|
|
||||||
CHECK(native_bits32("9007199254740993") == 0x5A000000u);
|
|
||||||
}
|
|
||||||
|
|
||||||
SECTION("the conversion shared with other parsers")
|
|
||||||
{
|
|
||||||
// convert_float() gives the lexer's results, for every type
|
|
||||||
const std::vector<std::string> tokens =
|
|
||||||
{
|
|
||||||
"0", "-0.0", "1.5", "0.1", "1e-400", "-2.5E+3", "123456789012345678901234567890",
|
|
||||||
"9007199254740993.0000000000000000001", "4.9406564584124654e-324"
|
|
||||||
};
|
|
||||||
using float_json = nlohmann::basic_json<std::map, std::vector, std::string, bool, std::int64_t, std::uint64_t, float>;
|
|
||||||
using long_double_json = nlohmann::basic_json<std::map, std::vector, std::string, bool, std::int64_t, std::uint64_t, long double>;
|
|
||||||
for (const auto& t : tokens)
|
|
||||||
{
|
|
||||||
CAPTURE(t)
|
|
||||||
const auto layout = float_token_layout(t);
|
|
||||||
const char* const first = t.data();
|
|
||||||
const char* const last = first + t.size();
|
|
||||||
const auto d = nlohmann::detail::convert_float<double>(first, last, layout.first, layout.second);
|
|
||||||
const auto f = nlohmann::detail::convert_float<float>(first, last, layout.first, layout.second);
|
|
||||||
const auto ld = nlohmann::detail::convert_float<long double>(first, last, layout.first, layout.second);
|
|
||||||
CHECK(bits_of(d) == bits_of(json::parse(t).get<double>()));
|
|
||||||
CHECK(bits_of(f) == bits_of(float_json::parse(t).get<float>()));
|
|
||||||
CHECK(ld == long_double_json::parse(t).get<long double>());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
namespace
|
namespace
|
||||||
@@ -1086,6 +807,40 @@ std::size_t big_bit_length(const big_uint& a)
|
|||||||
}
|
}
|
||||||
return n;
|
return n;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::uint64_t bits_of(double d)
|
||||||
|
{
|
||||||
|
std::uint64_t b = 0;
|
||||||
|
std::memcpy(&b, &d, sizeof(b));
|
||||||
|
return b;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool eisel_lemire(const std::string& s, double& out)
|
||||||
|
{
|
||||||
|
return nlohmann::detail::parse_float_eisel_lemire(s.data(), s.data() + s.size(), out);
|
||||||
|
}
|
||||||
|
|
||||||
|
// significant digits of a token, without trailing zeros
|
||||||
|
std::size_t significant_digits(const std::string& s)
|
||||||
|
{
|
||||||
|
std::string digits;
|
||||||
|
for (const char c : s)
|
||||||
|
{
|
||||||
|
if (c == 'e' || c == 'E')
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (c >= '0' && c <= '9' && !(digits.empty() && c == '0'))
|
||||||
|
{
|
||||||
|
digits += c;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
while (!digits.empty() && digits.back() == '0')
|
||||||
|
{
|
||||||
|
digits.pop_back();
|
||||||
|
}
|
||||||
|
return digits.size();
|
||||||
|
}
|
||||||
} // namespace
|
} // namespace
|
||||||
|
|
||||||
TEST_CASE("Eisel-Lemire float conversion")
|
TEST_CASE("Eisel-Lemire float conversion")
|
||||||
@@ -1513,33 +1268,26 @@ TEST_CASE("Eisel-Lemire float conversion")
|
|||||||
for (const auto& c : known)
|
for (const auto& c : known)
|
||||||
{
|
{
|
||||||
CAPTURE(c.first)
|
CAPTURE(c.first)
|
||||||
CHECK(native_bits64(c.first) == c.second);
|
double out = 0;
|
||||||
|
if (eisel_lemire(c.first, out))
|
||||||
|
{
|
||||||
|
CHECK(bits_of(out) == c.second);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// only tokens with more than 19 significant digits are left to
|
||||||
|
// strtod: those whose value lies too close to a tie
|
||||||
|
CHECK(significant_digits(c.first) > 19);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
SECTION("binary32")
|
|
||||||
{
|
|
||||||
using binary32 = nlohmann::detail::ieee_binary_format<24>;
|
|
||||||
CHECK(nlohmann::detail::eisel_lemire<binary32>(0, 1) == 0x3F800000u);
|
|
||||||
CHECK(nlohmann::detail::eisel_lemire<binary32>(-1, 1) == 0x3DCCCCCDu);
|
|
||||||
CHECK(nlohmann::detail::eisel_lemire<binary32>(-1, 15) == 0x3FC00000u);
|
|
||||||
CHECK(nlohmann::detail::eisel_lemire<binary32>(0, 16777217) == 0x4B800000u); // tie, to even
|
|
||||||
CHECK(nlohmann::detail::eisel_lemire<binary32>(0, 16777219) == 0x4B800002u); // tie, to even
|
|
||||||
CHECK(nlohmann::detail::eisel_lemire<binary32>(-45, 1) == 0x00000001u);
|
|
||||||
CHECK(nlohmann::detail::eisel_lemire<binary32>(-46, 7) == 0x00000000u);
|
|
||||||
CHECK(nlohmann::detail::eisel_lemire<binary32>(-46, 8) == 0x00000001u);
|
|
||||||
CHECK(nlohmann::detail::eisel_lemire<binary32>(-65, 9999999999999999999u) == 0x00000000u);
|
|
||||||
CHECK(nlohmann::detail::eisel_lemire<binary32>(20, 3402823466385288598u) == 0x7F7FFFFFu);
|
|
||||||
CHECK(nlohmann::detail::eisel_lemire<binary32>(20, 3402823669209384635u) == 0x7F800000u);
|
|
||||||
CHECK(nlohmann::detail::eisel_lemire<binary32>(39, 1) == 0x7F800000u);
|
|
||||||
CHECK(nlohmann::detail::eisel_lemire<binary32>(-5, 0) == 0x00000000u);
|
|
||||||
}
|
|
||||||
|
|
||||||
SECTION("round trip")
|
SECTION("round trip")
|
||||||
{
|
{
|
||||||
// every double written by to_chars and read back, and its 17-digit
|
// every double written by to_chars and read back, also with trailing
|
||||||
// form with trailing digits that make the token longer than 19 digits
|
// digits that make the token longer than 19 digits
|
||||||
std::uint64_t state = 5295;
|
std::uint64_t state = 5295;
|
||||||
|
std::size_t declined = 0;
|
||||||
for (int i = 0; i < 200000; ++i)
|
for (int i = 0; i < 200000; ++i)
|
||||||
{
|
{
|
||||||
state ^= state << 13u;
|
state ^= state << 13u;
|
||||||
@@ -1561,51 +1309,30 @@ TEST_CASE("Eisel-Lemire float conversion")
|
|||||||
const char* end = nlohmann::detail::to_chars(buffer.data(), buffer.data() + buffer.size(), d);
|
const char* end = nlohmann::detail::to_chars(buffer.data(), buffer.data() + buffer.size(), d);
|
||||||
const std::string token(buffer.data(), static_cast<std::size_t>(end - buffer.data()));
|
const std::string token(buffer.data(), static_cast<std::size_t>(end - buffer.data()));
|
||||||
CAPTURE(token)
|
CAPTURE(token)
|
||||||
CHECK(native_bits64(token) == b);
|
double out = 0;
|
||||||
|
REQUIRE(eisel_lemire(token, out));
|
||||||
|
CHECK(bits_of(out) == b);
|
||||||
|
|
||||||
// insert digits before the exponent of the 17-digit form: that
|
// insert digits before the exponent: the value moves by far less
|
||||||
// form lies strictly inside the rounding interval of the double
|
// than the distance to the rounding boundary, so it must not change
|
||||||
// (the shortest one may lie on its boundary), and the digits move
|
std::string longer = token;
|
||||||
// it by far less than the distance to the boundary, so the value
|
|
||||||
// must not change
|
|
||||||
std::array<char, 64> digits17{};
|
|
||||||
static_cast<void>(std::snprintf(digits17.data(), digits17.size(), "%.17g", d)); // NOLINT(cppcoreguidelines-pro-type-vararg,hicpp-vararg)
|
|
||||||
std::string longer = digits17.data();
|
|
||||||
const std::size_t e = longer.find('e');
|
const std::size_t e = longer.find('e');
|
||||||
const std::size_t dot = longer.find('.');
|
const std::size_t dot = longer.find('.');
|
||||||
const std::string extra = dot == std::string::npos ? ".000000000000000000001" : "000000000000000000001";
|
const std::string extra = dot == std::string::npos ? ".000000000000000000001" : "000000000000000000001";
|
||||||
longer.insert(e == std::string::npos ? longer.size() : e, extra);
|
longer.insert(e == std::string::npos ? longer.size() : e, extra);
|
||||||
CAPTURE(longer)
|
CAPTURE(longer)
|
||||||
CHECK(native_bits64(longer) == b);
|
if (eisel_lemire(longer, out))
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
SECTION("round trip, binary32")
|
|
||||||
{
|
|
||||||
std::uint32_t state = 5295;
|
|
||||||
for (int i = 0; i < 100000; ++i)
|
|
||||||
{
|
|
||||||
state ^= state << 13u;
|
|
||||||
state ^= state >> 17u;
|
|
||||||
state ^= state << 5u;
|
|
||||||
std::uint32_t b = state;
|
|
||||||
if ((b & 0x7F800000u) == 0x7F800000u)
|
|
||||||
{
|
{
|
||||||
continue; // infinity or NaN
|
CHECK(bits_of(out) == b);
|
||||||
}
|
}
|
||||||
if (i % 4 == 0)
|
else
|
||||||
{
|
{
|
||||||
b &= 0x807FFFFFu; // subnormals
|
// w and w + 1 round differently: only when the value is very
|
||||||
|
// close to a rounding boundary
|
||||||
|
++declined;
|
||||||
}
|
}
|
||||||
float f = 0;
|
|
||||||
std::memcpy(&f, &b, sizeof(f));
|
|
||||||
|
|
||||||
std::array<char, 64> buffer{};
|
|
||||||
const char* end = nlohmann::detail::to_chars(buffer.data(), buffer.data() + buffer.size(), f);
|
|
||||||
const std::string token(buffer.data(), static_cast<std::size_t>(end - buffer.data()));
|
|
||||||
CAPTURE(token)
|
|
||||||
CHECK(native_bits32(token) == b);
|
|
||||||
}
|
}
|
||||||
|
CHECK(declined < 1000); // 107 of the 200,000
|
||||||
}
|
}
|
||||||
|
|
||||||
SECTION("used by the lexer")
|
SECTION("used by the lexer")
|
||||||
@@ -1619,184 +1346,3 @@ TEST_CASE("Eisel-Lemire float conversion")
|
|||||||
"[json.exception.out_of_range.406] number overflow parsing '1.7976931348623159e308'", json::out_of_range&);
|
"[json.exception.out_of_range.406] number overflow parsing '1.7976931348623159e308'", json::out_of_range&);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
namespace
|
|
||||||
{
|
|
||||||
using float_json = nlohmann::basic_json<std::map, std::vector, std::string, bool, std::int64_t, std::uint64_t, float>;
|
|
||||||
|
|
||||||
// the bits of the float that parse() gives for a token, via both scanners;
|
|
||||||
// the value must be the same for both
|
|
||||||
template<typename Json, typename Bits>
|
|
||||||
void check_parse(const std::string& token, Bits expected, Bits infinity)
|
|
||||||
{
|
|
||||||
std::stringstream stream(token);
|
|
||||||
if ((expected & ~(Bits{1} << ((8 * sizeof(Bits)) - 1))) == infinity)
|
|
||||||
{
|
|
||||||
Json _;
|
|
||||||
CHECK_THROWS_WITH_AS(_ = Json::parse(token), ("[json.exception.out_of_range.406] number overflow parsing '" + token + "'").c_str(), typename Json::out_of_range&);
|
|
||||||
CHECK_THROWS_WITH_AS(_ = Json::parse(stream), ("[json.exception.out_of_range.406] number overflow parsing '" + token + "'").c_str(), typename Json::out_of_range&);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
const Json contiguous = Json::parse(token);
|
|
||||||
const Json streamed = Json::parse(stream);
|
|
||||||
if (contiguous.is_number_float()) // not an integer that fits
|
|
||||||
{
|
|
||||||
CHECK(bits_of(contiguous.template get<typename Json::number_float_t>()) == expected);
|
|
||||||
CHECK(bits_of(streamed.template get<typename Json::number_float_t>()) == expected);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
CHECK(streamed.is_number_integer());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} // namespace
|
|
||||||
|
|
||||||
TEST_CASE("float conversion of hard cases")
|
|
||||||
{
|
|
||||||
// see float_hard_cases.hpp
|
|
||||||
for (const auto& c : float_hard_cases::cases())
|
|
||||||
{
|
|
||||||
const std::string token = c.token;
|
|
||||||
CAPTURE(token)
|
|
||||||
CHECK(native_bits64(token) == c.bits64);
|
|
||||||
CHECK(native_bits32(token) == c.bits32);
|
|
||||||
check_parse<json>(token, c.bits64, std::uint64_t{0x7FF0000000000000u});
|
|
||||||
check_parse<float_json>(token, c.bits32, std::uint32_t{0x7F800000u});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST_CASE("float overflow and underflow in the parser")
|
|
||||||
{
|
|
||||||
SECTION("double")
|
|
||||||
{
|
|
||||||
check_parse<json>("1.7976931348623157e308", std::uint64_t{0x7FEFFFFFFFFFFFFFu}, std::uint64_t{0x7FF0000000000000u});
|
|
||||||
check_parse<json>("1.7976931348623159e308", std::uint64_t{0x7FF0000000000000u}, std::uint64_t{0x7FF0000000000000u});
|
|
||||||
check_parse<json>("-1e309", std::uint64_t{0xFFF0000000000000u}, std::uint64_t{0x7FF0000000000000u});
|
|
||||||
check_parse<json>("1" + std::string(400, '0'), std::uint64_t{0x7FF0000000000000u}, std::uint64_t{0x7FF0000000000000u});
|
|
||||||
check_parse<json>("1e99999999999999999999", std::uint64_t{0x7FF0000000000000u}, std::uint64_t{0x7FF0000000000000u});
|
|
||||||
// an underflow gives a zero with the sign of the token
|
|
||||||
check_parse<json>("1e-400", std::uint64_t{0}, std::uint64_t{0x7FF0000000000000u});
|
|
||||||
check_parse<json>("-1e-400", std::uint64_t{0x8000000000000000u}, std::uint64_t{0x7FF0000000000000u});
|
|
||||||
check_parse<json>("-2.4703282292062327e-324", std::uint64_t{0x8000000000000000u}, std::uint64_t{0x7FF0000000000000u});
|
|
||||||
check_parse<json>("0." + std::string(400, '0') + "1", std::uint64_t{0}, std::uint64_t{0x7FF0000000000000u});
|
|
||||||
}
|
|
||||||
|
|
||||||
SECTION("float")
|
|
||||||
{
|
|
||||||
check_parse<float_json>("3.4028234e38", std::uint32_t{0x7F7FFFFFu}, std::uint32_t{0x7F800000u});
|
|
||||||
check_parse<float_json>("3.4028236e38", std::uint32_t{0x7F800000u}, std::uint32_t{0x7F800000u});
|
|
||||||
check_parse<float_json>("-1e39", std::uint32_t{0xFF800000u}, std::uint32_t{0x7F800000u});
|
|
||||||
check_parse<float_json>("1e-46", std::uint32_t{0}, std::uint32_t{0x7F800000u});
|
|
||||||
check_parse<float_json>("-1e-46", std::uint32_t{0x80000000u}, std::uint32_t{0x7F800000u});
|
|
||||||
check_parse<float_json>("-7.006492321624085e-46", std::uint32_t{0x80000000u}, std::uint32_t{0x7F800000u});
|
|
||||||
check_parse<float_json>("-7.006492321624086e-46", std::uint32_t{0x80000001u}, std::uint32_t{0x7F800000u});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST_CASE("string scanning kernels")
|
|
||||||
{
|
|
||||||
// the word-at-a-time kernels must stop exactly where a byte-by-byte scan
|
|
||||||
// stops, for any content, length, and alignment
|
|
||||||
const auto reference_special = [](const unsigned char* data, std::size_t n)
|
|
||||||
{
|
|
||||||
std::size_t i = 0;
|
|
||||||
while (i < n && !nlohmann::detail::is_string_special(data[i]))
|
|
||||||
{
|
|
||||||
++i;
|
|
||||||
}
|
|
||||||
return i;
|
|
||||||
};
|
|
||||||
const auto reference_copyable = [](const unsigned char* data, std::size_t n)
|
|
||||||
{
|
|
||||||
std::size_t i = 0;
|
|
||||||
while (i < n && nlohmann::detail::is_ascii_copyable(data[i]))
|
|
||||||
{
|
|
||||||
++i;
|
|
||||||
}
|
|
||||||
return i;
|
|
||||||
};
|
|
||||||
const auto reference_bulk_run = [](const unsigned char* data, std::size_t n)
|
|
||||||
{
|
|
||||||
std::size_t i = 0;
|
|
||||||
while (i < n)
|
|
||||||
{
|
|
||||||
if (data[i] < 0x80u)
|
|
||||||
{
|
|
||||||
if (nlohmann::detail::is_string_special(data[i]))
|
|
||||||
{
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
++i;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
const std::size_t seq = nlohmann::detail::validate_one_utf8(data + i, n - i);
|
|
||||||
if (seq == 0)
|
|
||||||
{
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
i += seq;
|
|
||||||
}
|
|
||||||
return i;
|
|
||||||
};
|
|
||||||
|
|
||||||
// pieces: ordinary ASCII, stops, DEL, well-formed sequences of every
|
|
||||||
// length, and ill-formed or truncated ones
|
|
||||||
const std::vector<std::string> pieces =
|
|
||||||
{
|
|
||||||
"a", "Z", " ", "~", "0123456789", "\"", "\\", std::string(1, '\0'), "\n", "\x1F", "\x7F",
|
|
||||||
"\xC3\xA4", "\xE2\x82\xAC", "\xE6\x97\xA5\xE6\x9C\xAC", "\xF0\x9F\x98\x80", "\xED\x9F\xBF",
|
|
||||||
"\x80", "\xC0\x80", "\xC3", "\xE2\x82", "\xED\xA0\x80", "\xF4\x90\x80\x80", "\xFF",
|
|
||||||
};
|
|
||||||
std::uint64_t state = 5295;
|
|
||||||
const auto next = [&state]()
|
|
||||||
{
|
|
||||||
state ^= state << 13u;
|
|
||||||
state ^= state >> 7u;
|
|
||||||
state ^= state << 17u;
|
|
||||||
return state;
|
|
||||||
};
|
|
||||||
// the upper half as a 32-bit value: converts to std::size_t implicitly on
|
|
||||||
// every platform (a cast of std::uint64_t is useless where both are the
|
|
||||||
// same type, and required where std::size_t is 32 bits wide)
|
|
||||||
const auto next_small = [&next]()
|
|
||||||
{
|
|
||||||
return static_cast<std::uint32_t>(next() >> 32u);
|
|
||||||
};
|
|
||||||
for (int round = 0; round < 100000; ++round)
|
|
||||||
{
|
|
||||||
// mostly ordinary text, so that runs span several words
|
|
||||||
std::string text(next_small() % 8u, '.');
|
|
||||||
const std::size_t count = next_small() % 12u;
|
|
||||||
for (std::size_t k = 0; k < count; ++k)
|
|
||||||
{
|
|
||||||
const std::size_t p = (next() % 4 == 0) ? next_small() % pieces.size() : 0;
|
|
||||||
text += pieces[p];
|
|
||||||
text += std::string(next_small() % 10u, 'x');
|
|
||||||
}
|
|
||||||
const auto* data = reinterpret_cast<const unsigned char*>(text.data()); // NOLINT(cppcoreguidelines-pro-type-reinterpret-cast)
|
|
||||||
for (std::size_t offset = 0; offset < 3 && offset <= text.size(); ++offset)
|
|
||||||
{
|
|
||||||
const std::size_t n = text.size() - offset;
|
|
||||||
CAPTURE(text)
|
|
||||||
CAPTURE(offset)
|
|
||||||
CHECK(nlohmann::detail::find_string_special(data + offset, n) == reference_special(data + offset, n));
|
|
||||||
CHECK(nlohmann::detail::find_ascii_copyable_run(data + offset, n) == reference_copyable(data + offset, n));
|
|
||||||
CHECK(nlohmann::detail::scalar_string_bulk_run(data + offset, n) == reference_bulk_run(data + offset, n));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// the trailing-zero count, whichever implementation the compiler gets
|
|
||||||
for (int k = 0; k < 64; ++k)
|
|
||||||
{
|
|
||||||
const std::uint64_t bit = std::uint64_t{1} << k;
|
|
||||||
CHECK(nlohmann::detail::count_trailing_zeros(bit) == k);
|
|
||||||
CHECK(nlohmann::detail::count_trailing_zeros(bit | (bit << 1u) | 0x8000000000000000u) == k);
|
|
||||||
}
|
|
||||||
|
|
||||||
// eight bytes as a little-endian word, at any alignment
|
|
||||||
const std::array<unsigned char, 16> bytes = {{0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0xFF}};
|
|
||||||
CHECK(nlohmann::detail::read_eight_bytes(bytes.data()) == 0x0807060504030201u);
|
|
||||||
CHECK(nlohmann::detail::read_eight_bytes(bytes.data() + 1) == 0x0908070605040302u);
|
|
||||||
CHECK(nlohmann::detail::read_eight_bytes(bytes.data() + 8) == 0xFF0F0E0D0C0B0A09u);
|
|
||||||
CHECK(nlohmann::detail::read_eight_bytes(reinterpret_cast<const char*>(bytes.data()) + 3) == 0x0B0A090807060504u);
|
|
||||||
}
|
|
||||||
@@ -260,11 +260,10 @@ struct LocaleSwitchingSax final: public nlohmann::json_sax<json>
|
|||||||
|
|
||||||
TEST_CASE("locale changes between lexer construction and number conversion (#5198)")
|
TEST_CASE("locale changes between lexer construction and number conversion (#5198)")
|
||||||
{
|
{
|
||||||
// float and double are converted without the locale. A long double that
|
// The numbers are chosen so that the conversion also takes the strtod
|
||||||
// is not binary64 can take the strtold fallback, which honors the locale
|
// fallback, which honors the locale that is current at conversion time:
|
||||||
// that is current at conversion time. The numbers are chosen so that it
|
// too many significant digits for Clinger's fast path, an underflow that
|
||||||
// does: too many significant digits for Clinger's fast path, an underflow
|
// std::from_chars rejects, and a plain value.
|
||||||
// that std::from_chars rejects, and a plain value.
|
|
||||||
const std::vector<std::string> numbers = {"3.14159265358979323846", "1.5e-400", "12.34", "-0.000123456789012345678"};
|
const std::vector<std::string> numbers = {"3.14159265358979323846", "1.5e-400", "12.34", "-0.000123456789012345678"};
|
||||||
std::string text = "[";
|
std::string text = "[";
|
||||||
for (const auto& n : numbers)
|
for (const auto& n : numbers)
|
||||||
@@ -328,8 +327,7 @@ TEST_CASE("locale changes between lexer construction and number conversion (#519
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// a long double goes through std::strtold unless it is binary64 or
|
// a long double goes through std::strtold unless std::from_chars supports it
|
||||||
// std::from_chars supports it
|
|
||||||
{
|
{
|
||||||
bool switched = false;
|
bool switched = false;
|
||||||
const auto cb = [&](int /*depth*/, long_double_json::parse_event_t event, long_double_json& /*parsed*/) noexcept
|
const auto cb = [&](int /*depth*/, long_double_json::parse_event_t event, long_double_json& /*parsed*/) noexcept
|
||||||
@@ -355,15 +353,8 @@ TEST_CASE("locale with a multi-byte decimal point")
|
|||||||
{
|
{
|
||||||
// Some locales use a decimal point that is not a single character, e.g.
|
// Some locales use a decimal point that is not a single character, e.g.
|
||||||
// U+066B ARABIC DECIMAL SEPARATOR (two bytes in UTF-8). It cannot be
|
// U+066B ARABIC DECIMAL SEPARATOR (two bytes in UTF-8). It cannot be
|
||||||
// substituted in place for '.', so the strtold fallback (only for long
|
// substituted in place for '.', so the strtod fallback stops early. The
|
||||||
// double formats other than binary64) converts a copy of the token with
|
// conversion must still terminate rather than retry forever.
|
||||||
// the whole decimal point instead (#5660). The values must be those of the
|
|
||||||
// "C" locale.
|
|
||||||
using long_double_json = nlohmann::basic_json<std::map, std::vector, std::string, bool, std::int64_t, std::uint64_t, long double>;
|
|
||||||
const char* const long_double_numbers = "[3.14159265358979323846, 1.5e-400, -0.000123456789012345678]";
|
|
||||||
REQUIRE(std::setlocale(LC_NUMERIC, "C") != nullptr);
|
|
||||||
const long_double_json expected_long_double = long_double_json::parse(long_double_numbers);
|
|
||||||
|
|
||||||
const std::array<const char*, 6> names = {{"ar_EG.UTF-8", "ar_SA.UTF-8", "fa_IR.UTF-8", "ps_AF.UTF-8", "ar_EG", "fa_IR"}};
|
const std::array<const char*, 6> names = {{"ar_EG.UTF-8", "ar_SA.UTF-8", "fa_IR.UTF-8", "ps_AF.UTF-8", "ar_EG", "fa_IR"}};
|
||||||
bool tested = false;
|
bool tested = false;
|
||||||
for (const char* name : names)
|
for (const char* name : names)
|
||||||
@@ -381,20 +372,12 @@ TEST_CASE("locale with a multi-byte decimal point")
|
|||||||
tested = true;
|
tested = true;
|
||||||
|
|
||||||
// too many significant digits for Clinger's fast path, and an underflow
|
// too many significant digits for Clinger's fast path, and an underflow
|
||||||
// that std::from_chars rejects: double does not depend on the locale
|
// that std::from_chars rejects: both reach the strtod fallback
|
||||||
json j;
|
json j;
|
||||||
CHECK_NOTHROW(j = json::parse("[3.14159265358979323846, 1.5e-400, -0.000123456789012345678]"));
|
CHECK_NOTHROW(j = json::parse("[3.14159265358979323846, 1.5e-400, -0.000123456789012345678]"));
|
||||||
CHECK(j.is_array());
|
CHECK(j.is_array());
|
||||||
CHECK(j[0] == 3.14159265358979323846);
|
|
||||||
CHECK(j[1] == 0.0);
|
|
||||||
CHECK(j[2] == -0.000123456789012345678);
|
|
||||||
CHECK(json::accept("3.14159265358979323846"));
|
CHECK(json::accept("3.14159265358979323846"));
|
||||||
|
|
||||||
// a long double that reaches the strtold fallback is not truncated
|
|
||||||
long_double_json ld;
|
|
||||||
CHECK_NOTHROW(ld = long_double_json::parse(long_double_numbers));
|
|
||||||
CHECK(ld == expected_long_double);
|
|
||||||
|
|
||||||
// a value the locale-independent paths convert is not affected
|
// a value the locale-independent paths convert is not affected
|
||||||
CHECK(json::parse("12.5") == 12.5);
|
CHECK(json::parse("12.5") == 12.5);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,9 +0,0 @@
|
|||||||
{
|
|
||||||
"project": "JSON for Modern C++",
|
|
||||||
"target": "single_include/nlohmann/json_view.hpp",
|
|
||||||
"sources": [
|
|
||||||
"include/nlohmann/json_view.hpp"
|
|
||||||
],
|
|
||||||
"include_paths": ["include"],
|
|
||||||
"external": ["nlohmann/json.hpp"]
|
|
||||||
}
|
|
||||||
@@ -15,7 +15,8 @@ file or the library version is bumped — otherwise the committed
|
|||||||
make natvis
|
make natvis
|
||||||
```
|
```
|
||||||
|
|
||||||
or, equivalently:
|
`make natvis` sets up a virtual environment `tools/generate_natvis/venv` with the dependencies from
|
||||||
|
`requirements.txt` (Jinja2) and runs the script with it. Alternatively, install the requirements yourself and run:
|
||||||
|
|
||||||
```shell
|
```shell
|
||||||
./generate_natvis.py [--version X.Y.Z] [repository_root/]
|
./generate_natvis.py [--version X.Y.Z] [repository_root/]
|
||||||
|
|||||||
Reference in new issue
Block a user