Compare commits

..
Author SHA1 Message Date
Niels Lohmann 51abba08fd Merge branch 'develop' into claude/json-view-canada-perf-99bbe3
Signed-off-by: Niels Lohmann <mail@nlohmann.me>
2026-10-27 07:29:22 +01:00
Niels Lohmann e08c181dee Merge origin/develop into claude/json-view-canada-perf-99bbe3
The float-pair fast path of the serializer compares node_kind now.

Signed-off-by: Niels Lohmann <mail@nlohmann.me>
2026-10-26 21:41:12 +01:00
Niels Lohmann c227d4a920 Remove unused using-declaration in unit-json_view_large
Signed-off-by: Niels Lohmann <mail@nlohmann.me>
2026-10-26 15:53:28 +01:00
Niels Lohmann bdcfc178af Fix clang-tidy findings in the json_view dump tests
Signed-off-by: Niels Lohmann <mail@nlohmann.me>
2026-10-26 06:54:53 +01:00
Niels Lohmann 30e1adef93 Merge develop; fix clang-tidy, cpplint and clang 3.5 findings in json_view
Signed-off-by: Niels Lohmann <mail@nlohmann.me>
2026-10-25 19:03:03 +01:00
Niels Lohmann afea570755 json_view: fix GCC useless-cast, MSVC C4127, and MinGW object size
- drop the redundant int cast of the promoted uint16_t shift (-Wuseless-cast)
- route the constant part of the float-pair condition through enabled() (C4127)
- split unit-json_view_dump.cpp in three files for the MinGW assembler

Signed-off-by: Niels Lohmann <mail@nlohmann.me>
2026-10-25 10:45:57 +01:00
Niels Lohmann e7d245db7e json_view: dump canada.json faster than yyjson (batched float decisions)
Dump of float tokens of 16 or 17 digits without an exponent (SIMD targets,
little-endian), in batches of up to 256 floats ahead of the walk, one loop
per step:
- the digits (16 bytes at a time) and the token's last four digits;
- locate_token(): Eisel-Lemire's product gives the double x, and x's position
  relative to the token is exact in a 64-bit fixed-point number (56 bits after
  the point of the token's last digit), with the radius of its interval;
- token_digits_1/2(), one loop per kind (g): the multiple of 10^g nearest to x
  if it is in the interval, else the multiple of 10^(g - 1) nearest to x, the
  digits that dump() (Zmij) writes. Exact ties between two candidates (like
  754570942.33984373, whose double is ...33984375) are left to the full
  conversion;
- the output is the token with its last four digits replaced; a rounding that
  carries further goes to the writer of Zmij's results.
The batch storage is on the heap (allocated by the first conversion), and a
pair of floats like [x, y] in a read-only document is written without a
frame. Reading: get<double>() converts such tokens with a lean Eisel-Lemire
(coordinate_float()).

Output is byte-identical to the previous writer: 10^9 generated tokens in one
array and 3 * 10^8 in arrays of 1 to 9 elements on Apple M1, 2.5 * 10^8 and
10^8 on x86-64 (all exponents, subnormals, 15-18 digits, exact binary
fractions and ties, near-short decimals); get<double>() equals json::parse
on 5 * 10^7 values.

compare.py --download, Apple M1 Max, clang 21, 30 rounds, two runs (and two
with aligned code: -falign-loops=64 -mllvm -align-all-functions=6); json_view,
and the factor of yyjson 0.13.0 over it:
- canada dump      3636 -> 1623 us (0.47x -> 1.06x; aligned 1.05x)
- canada traverse  2287 -> 1817 us (0.85x -> 1.07x; aligned 0.99x)
- canada patch     4628 -> 2735 us (0.80x -> 1.36x)
- canada update    4763 -> 2911 us (0.78x -> 1.28x)
Linux x86-64 (Haswell VPS, GCC 13, one run): canada dump 0.53x -> 0.72x,
traverse 0.89x -> 0.95x, patch 1.01x -> 1.17x, update 0.96x -> 1.13x.

Open: canada traverse in the aligned build (0.99x) and canada dump on x86-64
(0.72x) are still behind yyjson. Canada parse and select are about 2 % slower
in bench_view in both builds, with identical parser code (likely layout; the
corpus parse row is not slower). In the plain build only, rpc, status, and
twitter dump are 2-4 % slower (0-6 % faster in the aligned build).

Signed-off-by: Niels Lohmann <mail@nlohmann.me>
2026-10-25 07:23:43 +01:00
Niels Lohmann d38a04bd3e json_view: faster float tokens of 16 to 19 digits (canada dump, traverse)
Reading:
- layout_decimal() reads tokens of 16 to 19 digits 16 bytes at a time
  (NEON / SSE2) and layout_float() sends them to Eisel-Lemire directly,
  without the fast-path check that mixed data mispredicts.

Dump (AArch64 only):
- Fixed-notation tokens of 16 or 17 digits are converted in batches ahead
  of the walk, one loop per step: digits, Eisel-Lemire, and an exact 8.56
  fixed-point choice of the shortest digits (shortest_token_digits(), in
  place of Zmij for these tokens). The output is the token with its last
  eight digits replaced. On x86-64 (Haswell, GCC 13 / Clang 18) the batch
  was not faster, so it is not used there.
- Output is byte-identical to the previous writer: 10^9 generated tokens
  on M1 (all exponents, subnormals, 15-18 digits, exact binary fractions,
  near-short decimals) and 2.5 * 10^8 on x86-64, plus canada, twitter and
  citm_catalog in compact, indented, and ensure_ascii form.

compare.py --download, M1 Max, clang 21, 30 rounds, two runs and aligned
builds; json_view, and the factor of yyjson 0.13.0 over it:
- canada dump      3636 -> 2597 us (0.47x -> 0.66x)
- canada traverse  2300 -> 2059 us (0.85x -> 0.96x)
- canada patch     4650 -> 3550 us (0.80x -> 1.05x)
- canada update    4882 -> 3813 us (0.78x -> 1.00x)
Linux x86-64 (umbrella, GCC 13): canada traverse 0.89x -> 0.95x, patch
0.98x -> 1.02x, update 0.96x -> 1.01x, dump 0.53x -> 0.57x.

Open: the dump and traverse targets (>= 1.0x) are missed. The dump is
bounded by the shortest-digits step (~8 ns per float, one multiply chain
per float). Three rows are more than 1 % slower than before in both the
plain and the aligned build, without a known cause (the parser's machine
code is identical, and these documents do not use the new float path):
- edit status patch          +2.7 % (aligned +1.9 %)
- edit citm_catalog update   +1.7 % (aligned +1.5 %)
- view jeopardy select       +1.4 % (aligned +1.0 %)

Signed-off-by: Niels Lohmann <mail@nlohmann.me>
2026-10-25 07:23:42 +01:00
481 changed files with 5915 additions and 18217 deletions

No files matched your search

-5
View File
@@ -154,11 +154,6 @@ and each page's title (H1) and declaration by
[`docs/docset/generate_docset.py`](https://github.com/nlohmann/json/blob/develop/docs/docset/generate_docset.py);
`make build` reports API pages that cannot be classified.
A pull request that changes only the documentation, Markdown files, GitHub metadata, or license files skips the
compiler workflows (Ubuntu, macOS, Windows); the documentation and license checks still run. See
[`tools/check_path_filters`](https://github.com/nlohmann/json/tree/develop/tools/check_path_filters) for the list of
skipped files and what to do when a compiler job starts reading one of them.
### Amalgamate the source code
The single-header files
+1 -1
View File
@@ -28,7 +28,7 @@ jobs:
steps:
- name: Harden Runner
uses: step-security/harden-runner@dc2769abcc0fcfbadfc1df54081c1608579ef6b2 # v2.22.2
uses: step-security/harden-runner@ccd8616d44fd3846e67624a50d5aad6d37bf2d25 # v2.22.1
with:
egress-policy: audit
+2 -2
View File
@@ -22,7 +22,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Harden Runner
uses: step-security/harden-runner@dc2769abcc0fcfbadfc1df54081c1608579ef6b2 # v2.22.2
uses: step-security/harden-runner@ccd8616d44fd3846e67624a50d5aad6d37bf2d25 # v2.22.1
with:
egress-policy: audit
@@ -46,7 +46,7 @@ jobs:
steps:
- name: Harden Runner
uses: step-security/harden-runner@dc2769abcc0fcfbadfc1df54081c1608579ef6b2 # v2.22.2
uses: step-security/harden-runner@ccd8616d44fd3846e67624a50d5aad6d37bf2d25 # v2.22.1
with:
egress-policy: audit
+1 -1
View File
@@ -20,7 +20,7 @@ jobs:
timeout-minutes: 30
steps:
- name: Harden Runner
uses: step-security/harden-runner@dc2769abcc0fcfbadfc1df54081c1608579ef6b2 # v2.22.2
uses: step-security/harden-runner@ccd8616d44fd3846e67624a50d5aad6d37bf2d25 # v2.22.1
with:
egress-policy: audit
+1 -1
View File
@@ -13,7 +13,7 @@ jobs:
runs-on: ubuntu-22.04
steps:
- name: Harden Runner
uses: step-security/harden-runner@dc2769abcc0fcfbadfc1df54081c1608579ef6b2 # v2.22.2
uses: step-security/harden-runner@ccd8616d44fd3846e67624a50d5aad6d37bf2d25 # v2.22.1
with:
egress-policy: audit
+4 -4
View File
@@ -27,7 +27,7 @@ jobs:
steps:
- name: Harden Runner
uses: step-security/harden-runner@dc2769abcc0fcfbadfc1df54081c1608579ef6b2 # v2.22.2
uses: step-security/harden-runner@ccd8616d44fd3846e67624a50d5aad6d37bf2d25 # v2.22.1
with:
egress-policy: audit
@@ -38,14 +38,14 @@ jobs:
# Initializes the CodeQL tools for scanning.
- name: Initialize CodeQL
uses: github/codeql-action/init@9b3254085494b55a0f7c4c2b3d2d52cc712ce370 # v4.39.1
uses: github/codeql-action/init@6f2ac81f5cd81fe351a197ba0b00d91d03cd2aee # v4.39.0
with:
languages: c-cpp
# Autobuild attempts to build any compiled languages (C/C++, C#, or Java).
# If this step fails, then you should remove it and run the build manually (see below)
- name: Autobuild
uses: github/codeql-action/autobuild@9b3254085494b55a0f7c4c2b3d2d52cc712ce370 # v4.39.1
uses: github/codeql-action/autobuild@6f2ac81f5cd81fe351a197ba0b00d91d03cd2aee # v4.39.0
- name: Perform CodeQL Analysis
uses: github/codeql-action/analyze@9b3254085494b55a0f7c4c2b3d2d52cc712ce370 # v4.39.1
uses: github/codeql-action/analyze@6f2ac81f5cd81fe351a197ba0b00d91d03cd2aee # v4.39.0
@@ -20,7 +20,7 @@ jobs:
pull-requests: write
steps:
- name: Harden Runner
uses: step-security/harden-runner@dc2769abcc0fcfbadfc1df54081c1608579ef6b2 # v2.22.2
uses: step-security/harden-runner@ccd8616d44fd3846e67624a50d5aad6d37bf2d25 # v2.22.1
with:
egress-policy: audit
+1 -1
View File
@@ -21,7 +21,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Harden Runner
uses: step-security/harden-runner@dc2769abcc0fcfbadfc1df54081c1608579ef6b2 # v2.22.2
uses: step-security/harden-runner@ccd8616d44fd3846e67624a50d5aad6d37bf2d25 # v2.22.1
with:
egress-policy: audit
+2 -2
View File
@@ -31,7 +31,7 @@ jobs:
security-events: write
steps:
- name: Harden Runner
uses: step-security/harden-runner@dc2769abcc0fcfbadfc1df54081c1608579ef6b2 # v2.22.2
uses: step-security/harden-runner@ccd8616d44fd3846e67624a50d5aad6d37bf2d25 # v2.22.1
with:
egress-policy: audit
@@ -48,6 +48,6 @@ jobs:
output: 'flawfinder_results.sarif'
- name: Upload analysis results to GitHub Security tab
uses: github/codeql-action/upload-sarif@9b3254085494b55a0f7c4c2b3d2d52cc712ce370 # v4.39.1
uses: github/codeql-action/upload-sarif@6f2ac81f5cd81fe351a197ba0b00d91d03cd2aee # v4.39.0
with:
sarif_file: ${{github.workspace}}/flawfinder_results.sarif
+1 -1
View File
@@ -54,7 +54,7 @@ jobs:
timeout-minutes: 60
steps:
- name: Harden Runner
uses: step-security/harden-runner@dc2769abcc0fcfbadfc1df54081c1608579ef6b2 # v2.22.2
uses: step-security/harden-runner@ccd8616d44fd3846e67624a50d5aad6d37bf2d25 # v2.22.1
with:
egress-policy: audit
+1 -1
View File
@@ -23,7 +23,7 @@ jobs:
steps:
- name: Harden Runner
uses: step-security/harden-runner@dc2769abcc0fcfbadfc1df54081c1608579ef6b2 # v2.22.2
uses: step-security/harden-runner@ccd8616d44fd3846e67624a50d5aad6d37bf2d25 # v2.22.1
with:
egress-policy: audit
-19
View File
@@ -7,25 +7,6 @@ on:
- master
- release/*
pull_request:
# Skip pull requests that change only files no job here reads. The list is checked by
# tools/check_path_filters/check_path_filters.py (repository_checks.yml); change both together.
paths:
- '**'
- '!docs/**'
- '!**.md'
- '!.github/*'
- '!.github/ISSUE_TEMPLATE/**'
- '!.github/external_ci/**'
- '!.github/workflows/**'
- '!.reuse/**'
- '!LICENSES/**'
- '!CITATION.cff'
- '!REUSE.toml'
# read by tools/check_build_options in the ci_meson_install job (ubuntu.yml)
- 'docs/mkdocs/docs/integration/package_managers.md'
# built by the swiftpm job (macos.yml)
- 'docs/mkdocs/docs/integration/swift/**'
- '.github/workflows/macos.yml'
workflow_dispatch:
concurrency:
+1 -1
View File
@@ -37,7 +37,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Harden Runner
uses: step-security/harden-runner@dc2769abcc0fcfbadfc1df54081c1608579ef6b2 # v2.22.2
uses: step-security/harden-runner@ccd8616d44fd3846e67624a50d5aad6d37bf2d25 # v2.22.1
with:
egress-policy: audit
-78
View File
@@ -1,78 +0,0 @@
name: Repository checks
# Checks that concern files the compiler workflows (ubuntu.yml, macos.yml,
# windows.yml) skip with their path filter: the documentation, the license
# information, and the path filter itself. This workflow has no path filter.
on:
push:
branches:
- develop
- master
- release/*
pull_request:
workflow_dispatch:
permissions:
contents: read
concurrency:
group: ${{ github.workflow }}-${{ github.ref || github.run_id }}
cancel-in-progress: true
jobs:
check_path_filters:
runs-on: ubuntu-26.04
steps:
- name: Harden Runner
uses: step-security/harden-runner@dc2769abcc0fcfbadfc1df54081c1608579ef6b2 # v2.22.2
with:
egress-policy: audit
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
persist-credentials: false
- name: Check the path filters of the compiler workflows
run: python3 tools/check_path_filters/check_path_filters.py
ci_reuse_compliance:
runs-on: ubuntu-26.04
steps:
- name: Harden Runner
uses: step-security/harden-runner@dc2769abcc0fcfbadfc1df54081c1608579ef6b2 # v2.22.2
with:
egress-policy: audit
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
persist-credentials: false
- name: Get latest CMake and ninja
uses: lukka/get-cmake@a89e43e22a96abafcd7a62db652a65ecd33052c9 # v4.4.4
- name: Run CMake
run: cmake -S . -B build -DJSON_CI=On
- name: Build
run: cmake --build build --target ci_reuse_compliance
ci_test_documentation:
runs-on: ubuntu-26.04
strategy:
matrix:
target: [ci_test_examples, ci_test_build_documentation, ci_test_documentation_mermaid]
steps:
- name: Harden Runner
uses: step-security/harden-runner@dc2769abcc0fcfbadfc1df54081c1608579ef6b2 # v2.22.2
with:
egress-policy: audit
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
persist-credentials: false
# the git-revision-date-localized plugin needs the history; a shallow clone makes the strict build fail
fetch-depth: ${{ matrix.target == 'ci_test_build_documentation' && '0' || '1' }}
- uses: actions/setup-node@949feb2413d6458794dcd2491c4babbbce0c15c1 # v7.1.0
if: matrix.target == 'ci_test_documentation_mermaid'
with:
node-version: 24
- name: Run CMake
run: cmake -S . -B build -DJSON_CI=On
- name: Build
run: cmake --build build --target ${{ matrix.target }}
+2 -2
View File
@@ -40,7 +40,7 @@ jobs:
steps:
- name: Harden Runner
uses: step-security/harden-runner@dc2769abcc0fcfbadfc1df54081c1608579ef6b2 # v2.22.2
uses: step-security/harden-runner@ccd8616d44fd3846e67624a50d5aad6d37bf2d25 # v2.22.1
with:
egress-policy: audit
@@ -80,6 +80,6 @@ jobs:
# Upload the results to GitHub's code scanning dashboard.
- name: "Upload to code-scanning"
uses: github/codeql-action/upload-sarif@9b3254085494b55a0f7c4c2b3d2d52cc712ce370 # v4.39.1
uses: github/codeql-action/upload-sarif@6f2ac81f5cd81fe351a197ba0b00d91d03cd2aee # v4.39.0
with:
sarif_file: results.sarif
+2 -2
View File
@@ -36,7 +36,7 @@ jobs:
runs-on: ubuntu-26.04
steps:
- name: Harden Runner
uses: step-security/harden-runner@dc2769abcc0fcfbadfc1df54081c1608579ef6b2 # v2.22.2
uses: step-security/harden-runner@ccd8616d44fd3846e67624a50d5aad6d37bf2d25 # v2.22.1
with:
egress-policy: audit
@@ -65,7 +65,7 @@ jobs:
# Upload SARIF file generated in previous step
- name: Upload SARIF file
uses: github/codeql-action/upload-sarif@9b3254085494b55a0f7c4c2b3d2d52cc712ce370 # v4.39.1
uses: github/codeql-action/upload-sarif@6f2ac81f5cd81fe351a197ba0b00d91d03cd2aee # v4.39.0
with:
sarif_file: semgrep.sarif
if: always()
+1 -1
View File
@@ -16,7 +16,7 @@ jobs:
steps:
- name: Harden Runner
uses: step-security/harden-runner@dc2769abcc0fcfbadfc1df54081c1608579ef6b2 # v2.22.2
uses: step-security/harden-runner@ccd8616d44fd3846e67624a50d5aad6d37bf2d25 # v2.22.1
with:
egress-policy: audit
+30 -24
View File
@@ -7,25 +7,6 @@ on:
- master
- release/*
pull_request:
# Skip pull requests that change only files no job here reads. The list is checked by
# tools/check_path_filters/check_path_filters.py (repository_checks.yml); change both together.
paths:
- '**'
- '!docs/**'
- '!**.md'
- '!.github/*'
- '!.github/ISSUE_TEMPLATE/**'
- '!.github/external_ci/**'
- '!.github/workflows/**'
- '!.reuse/**'
- '!LICENSES/**'
- '!CITATION.cff'
- '!REUSE.toml'
# read by tools/check_build_options in the ci_meson_install job (ubuntu.yml)
- 'docs/mkdocs/docs/integration/package_managers.md'
# built by the swiftpm job (macos.yml)
- 'docs/mkdocs/docs/integration/swift/**'
- '.github/workflows/ubuntu.yml'
workflow_dispatch:
permissions:
@@ -99,7 +80,7 @@ jobs:
runs-on: ubuntu-26.04
steps:
- name: Harden Runner
uses: step-security/harden-runner@dc2769abcc0fcfbadfc1df54081c1608579ef6b2 # v2.22.2
uses: step-security/harden-runner@ccd8616d44fd3846e67624a50d5aad6d37bf2d25 # v2.22.1
with:
egress-policy: audit
@@ -128,10 +109,10 @@ jobs:
runs-on: ubuntu-26.04
strategy:
matrix:
target: [ci_test_single_header, ci_cppcheck, ci_cpplint, ci_reproducible_tests, ci_non_git_tests, ci_offline_testdata, 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:
- name: Harden Runner
uses: step-security/harden-runner@dc2769abcc0fcfbadfc1df54081c1608579ef6b2 # v2.22.2
uses: step-security/harden-runner@ccd8616d44fd3846e67624a50d5aad6d37bf2d25 # v2.22.1
with:
egress-policy: audit
@@ -197,7 +178,7 @@ jobs:
runs-on: ubuntu-26.04
steps:
- name: Harden Runner
uses: step-security/harden-runner@dc2769abcc0fcfbadfc1df54081c1608579ef6b2 # v2.22.2
uses: step-security/harden-runner@ccd8616d44fd3846e67624a50d5aad6d37bf2d25 # v2.22.1
with:
egress-policy: audit
@@ -452,7 +433,7 @@ jobs:
runs-on: ubuntu-26.04
steps:
- name: Harden Runner
uses: step-security/harden-runner@dc2769abcc0fcfbadfc1df54081c1608579ef6b2 # v2.22.2
uses: step-security/harden-runner@ccd8616d44fd3846e67624a50d5aad6d37bf2d25 # v2.22.1
with:
egress-policy: audit
@@ -468,6 +449,31 @@ jobs:
- name: Build
run: cmake --build build
ci_test_documentation:
runs-on: ubuntu-26.04
strategy:
matrix:
target: [ci_test_examples, ci_test_build_documentation, ci_test_documentation_mermaid]
steps:
- name: Harden Runner
uses: step-security/harden-runner@ccd8616d44fd3846e67624a50d5aad6d37bf2d25 # v2.22.1
with:
egress-policy: audit
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
persist-credentials: false
# the git-revision-date-localized plugin needs the history; a shallow clone makes the strict build fail
fetch-depth: ${{ matrix.target == 'ci_test_build_documentation' && '0' || '1' }}
- uses: actions/setup-node@949feb2413d6458794dcd2491c4babbbce0c15c1 # v7.1.0
if: matrix.target == 'ci_test_documentation_mermaid'
with:
node-version: 24
- name: Run CMake
run: cmake -S . -B build -DJSON_CI=On
- name: Build
run: cmake --build build --target ${{ matrix.target }}
# Native Linux ARM64 runner with the latest GCC. The ubuntu-24.04-arm label is
# only available for public repositories.
ci_test_arm64:
+2 -21
View File
@@ -7,25 +7,6 @@ on:
- master
- release/*
pull_request:
# Skip pull requests that change only files no job here reads. The list is checked by
# tools/check_path_filters/check_path_filters.py (repository_checks.yml); change both together.
paths:
- '**'
- '!docs/**'
- '!**.md'
- '!.github/*'
- '!.github/ISSUE_TEMPLATE/**'
- '!.github/external_ci/**'
- '!.github/workflows/**'
- '!.reuse/**'
- '!LICENSES/**'
- '!CITATION.cff'
- '!REUSE.toml'
# read by tools/check_build_options in the ci_meson_install job (ubuntu.yml)
- 'docs/mkdocs/docs/integration/package_managers.md'
# built by the swiftpm job (macos.yml)
- 'docs/mkdocs/docs/integration/swift/**'
- '.github/workflows/windows.yml'
workflow_dispatch:
permissions:
@@ -47,7 +28,7 @@ jobs:
with:
persist-credentials: false
- name: Set up MinGW
uses: egor-tensin/setup-mingw@d54f5ef0ce585bd3fbb1f8a71b5b254f59dbf931 # v3.0
uses: egor-tensin/setup-mingw@41b837e47d7f85214629d255b9c4bc3fcbe9fd63 # v3.0
with:
platform: ${{ matrix.architecture }}
version: 12.2.0 # https://github.com/egor-tensin/setup-mingw/issues/14
@@ -172,7 +153,7 @@ jobs:
- name: Install Clang
run: curl -fsSL -o LLVM${{ matrix.version }}.exe https://github.com/llvm/llvm-project/releases/download/llvmorg-${{ matrix.version }}/LLVM-${{ matrix.version }}-win64.exe ; 7z x LLVM${{ matrix.version }}.exe -y -o"C:/Program Files/LLVM"
- name: Set up MinGW
uses: egor-tensin/setup-mingw@d54f5ef0ce585bd3fbb1f8a71b5b254f59dbf931 # v3.0
uses: egor-tensin/setup-mingw@41b837e47d7f85214629d255b9c4bc3fcbe9fd63 # v3.0
with:
platform: x64
version: 12.2.0 # https://github.com/egor-tensin/setup-mingw/issues/14
+2 -2
View File
@@ -1408,9 +1408,9 @@ THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR I
- The class contains a port of the shortest double-to-decimal conversion of [Żmij](https://github.com/vitaut/zmij) by Victor Zverovich, including the conversion of the digits to text by Xiang JunBo and the SIMD instruction sequence of Dougall Johnson, which is licensed under the [MIT License](https://opensource.org/licenses/MIT) (see above). Copyright &copy; 2025 [Victor Zverovich](https://github.com/vitaut)
- 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 an adapted version of the Eisel-Lemire algorithm, its table of powers of five, its digit comparison for long numbers, and its parsing of eight digits at a time 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 &copy; 2021 The fast_float authors
- 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 &copy; 2021 The fast_float authors
- The view's parser (`<nlohmann/json_view.hpp>`) contains techniques and code adapted from [yyjson](https://github.com/ibireme/yyjson) by YaoYuan, which is licensed under the [MIT License](https://opensource.org/licenses/MIT) (see above): table-driven decoding of `\u` escapes and fixed-offset unrolled checks.
- The class's lexer and the view's parser (`<nlohmann/json_view.hpp>`) validate non-ASCII strings with the vector UTF-8 check of [simdjson](https://github.com/simdjson/simdjson) by Daniel Lemire, Geoff Langdale, John Keiser, and contributors (its "lookup4" algorithm and tables, after J. Keiser and D. Lemire, "Validating UTF-8 In Less Than One Instruction Per Byte", 2021), which is available under the [MIT License](https://opensource.org/licenses/MIT) (used here) and the Apache 2.0 License. Copyright &copy; 2018-2025 The simdjson authors
- The view's parser (`<nlohmann/json_view.hpp>`) validates non-ASCII strings with the vector UTF-8 check of [simdjson](https://github.com/simdjson/simdjson) by Daniel Lemire, Geoff Langdale, John Keiser, and contributors (its "lookup4" algorithm and tables, after J. Keiser and D. Lemire, "Validating UTF-8 In Less Than One Instruction Per Byte", 2021), which is available under the [MIT License](https://opensource.org/licenses/MIT) (used here) and the Apache 2.0 License. Copyright &copy; 2018-2025 The simdjson authors
<img align="right" src="https://git.fsfe.org/reuse/reuse-ci/raw/branch/master/reuse-horizontal.png" alt="REUSE Software">
@@ -30,7 +30,7 @@ class (either explicitly or via the conversion operators).
## Return value
1. (none) — the converted value is written to the output parameter `val`.
1. (none) -- the converted value is written to the output parameter `val`.
2. the JSON value `j` converted to `TargetType`
## Examples
@@ -67,9 +67,7 @@ class (either explicitly or via the conversion operators).
## See also
- [`to_json`](to_json.md) - convert a C++ value to JSON
- [Arbitrary Type Conversions](../../features/arbitrary_types.md) - write your own `from_json` and `to_json` functions
- [Converting values](../../features/conversions.md) - overview of `get`, `get_to` and implicit conversions
- [to_json](to_json.md)
## Version history
+4 -4
View File
@@ -33,10 +33,10 @@ struct adl_serializer {
## See also
- [Arbitrary type conversions](../../features/arbitrary_types.md) - how to make your types convertible
- [`get`](../basic_json/get.md) - / [`get_to`](../basic_json/get_to.md) - convert a JSON value to a C++ type
- [`basic_json`](../basic_json/basic_json.md) - construct a JSON value from a C++ value
- [`NLOHMANN_DEFINE_TYPE_INTRUSIVE`](../macros/nlohmann_define_type_intrusive.md) - generate the conversion functions for a type
- [Specializing enum conversion](../../features/enum_conversion.md) - serializing enums as JSON strings
- [**get**](../basic_json/get.md) / [**get_to**](../basic_json/get_to.md) - convert a JSON value to a C++ type
- [**basic_json**](../basic_json/basic_json.md) - construct a JSON value from a C++ value
- [**NLOHMANN_DEFINE_TYPE_INTRUSIVE**](../macros/nlohmann_define_type_intrusive.md) - generate the conversion functions for a type
- [Specializing enum conversion](../../features/enum_conversion.md)
## Version history
@@ -36,9 +36,7 @@ This function is usually called by the constructors of the [basic_json](../basic
## See also
- [`from_json`](from_json.md) - convert JSON to a C++ value
- [Arbitrary Type Conversions](../../features/arbitrary_types.md) - write your own `from_json` and `to_json` functions
- [Converting values](../../features/conversions.md) - overview of `get`, `get_to` and implicit conversions
- [from_json](from_json.md)
## Version history
+3 -8
View File
@@ -148,20 +148,15 @@ outside of a string, invalid) byte; see the [FAQ entry](../../home/faq.md#nul-by
## See also
- [`parse`](parse.md) - deserialize from a compatible input
- [`sax_parse`](sax_parse.md) - parse input using the SAX interface
- [`operator>>`](../operator_gtgt.md) - deserialize from stream
- [parse](parse.md) - deserialize from a compatible input
- [sax_parse](sax_parse.md) - parse input using the SAX interface
- [operator>>](../operator_gtgt.md) - deserialize from stream
- [`JSON_STRICT_NUL_HANDLING`](../macros/json_strict_nul_handling.md) - opt in to rejecting a NUL byte in the input
instead of treating it as end of input
- [`JSON_DISABLE_STREAM_BULK_SCAN`](../macros/json_disable_stream_bulk_scan.md) - read a `std::istream` one character
at a time
- [`JSON_DISABLE_UNLOCKED_FILE_IO`](../macros/json_disable_unlocked_file_io.md) - read a `FILE*` with the locking stdio
functions
- [Parsing](../../features/parsing/index.md) - overview of the parsing functions
- [Comments](../../features/comments.md) - ignore `//` and `/* */` comments while parsing
- [Trailing Commas](../../features/trailing_commas.md) - accept trailing commas in arrays and objects
- [Parsing and Exceptions](../../features/parsing/parse_exceptions.md) - handling parse errors and locating them in the input
- [Parsing Untrusted Input](../../features/parsing/untrusted_input.md) - limits and checks for input you do not control
## Version history
+2 -2
View File
@@ -29,9 +29,9 @@ Linear in the size of `init`.
This function is only needed to express two edge cases that cannot be realized with the initializer list constructor
([`basic_json(initializer_list_t, bool, value_t)`](basic_json.md)). These cases are:
1. creating an array whose elements are all pairs whose first element is a string — in this case, the initializer list
1. creating an array whose elements are all pairs whose first element is a string -- in this case, the initializer list
constructor would create an object, taking the first elements as keys
2. creating an empty array — passing the empty initializer list to the initializer list constructor yields an empty
2. creating an empty array -- passing the empty initializer list to the initializer list constructor yields an empty
object
## Examples
+4 -6
View File
@@ -69,12 +69,10 @@ Arrays are stored as pointers in a `basic_json` type. That is, for any access to
## See also
- [`object_t`](object_t.md) - the type used to store JSON objects
- [`binary_t`](binary_t.md) - the type used to store binary values
- [`is_array`](is_array.md) - checks whether the JSON value is an array
- [`max_size`](max_size.md) - returns the maximum possible number of elements
- [Types](../../features/types/index.md) - how arrays are stored
- [Template Parameter Requirements](../../features/types/template_parameters.md) - requirements on the `ArrayType` template parameter
- [object_t](object_t.md) the type used to store JSON objects
- [binary_t](binary_t.md) the type used to store binary values
- [is_array](is_array.md) checks whether the JSON value is an array
- [max_size](max_size.md) returns the maximum possible number of elements
## Version history
@@ -46,8 +46,7 @@ The function is equivalent to `static_cast<json_base_class_t&>(j)` (or `static_c
## See also
- [`json_base_class_t`](json_base_class_t.md) - type of the custom base class
- [Template Parameter Requirements](../../features/types/template_parameters.md) - requirements on the `CustomBaseClass` template parameter
- [json_base_class_t](json_base_class_t.md) - type of the custom base class
## Version history
+5 -8
View File
@@ -90,8 +90,7 @@ Strong exception safety: if an exception occurs, the original value stays intact
1. Constant.
2. Logarithmic in the size of the container.
3. Logarithmic in the size of the container.
4. Linear in the number of reference tokens of `ptr`; for each of them, logarithmic in the size of the object, or
constant for an array.
4. Logarithmic in the size of the container.
## Notes
@@ -231,12 +230,10 @@ Strong exception safety: if an exception occurs, the original value stays intact
## See also
- [Checked access](../../features/element_access/checked_access.md) - element access with range checking
- [`operator[]`](operator%5B%5D.md) - unchecked access by reference
- [`value`](value.md) - access with default value
- [`basic_json_view::at`](../basic_json_view/at.md) - the same access on a zero-copy view
- [Element Access](../../features/element_access/index.md) - overview of all ways to access elements
- [JSON Pointer](../../features/json_pointer.md) - access nested values with a pointer
- documentation on [checked access](../../features/element_access/checked_access.md)
- [`operator[]`](operator%5B%5D.md) for unchecked access by reference
- [`value`](value.md) for access with default value
- [basic_json_view::at](../basic_json_view/at.md) - the same access on a zero-copy view
## Version history
+2 -3
View File
@@ -57,9 +57,8 @@ Constant.
## See also
- [`front`](front.md) - to access the first element
- [`basic_json_view::back`](../basic_json_view/back.md) - the same access on a zero-copy view
- [Element Access](../../features/element_access/index.md) - overview of all ways to access elements
- [front](front.md) to access the first element
- [basic_json_view::back](../basic_json_view/back.md) - the same access on a zero-copy view
## Version history
+10 -14
View File
@@ -52,7 +52,7 @@ basic_json(basic_json&& other) noexcept;
The postcondition of this constructor can be restored by calling [`clear()`](clear.md).
2. Create a `#!json null` JSON value. It either takes a null pointer as parameter (explicitly creating `#!json null`)
or no parameter (implicitly creating `#!json null`). The passed null pointer itself is not read — it is only used to
or no parameter (implicitly creating `#!json null`). The passed null pointer itself is not read -- it is only used to
choose the right constructor.
3. This is a "catch all" constructor for all compatible JSON types; that is, types for which a `to_json()` method
@@ -113,22 +113,19 @@ basic_json(basic_json&& other) noexcept;
```mermaid
flowchart TD
A(["initializer_list init"]) --> B{{"empty, or every element is a 2-element<br/>array whose first element is a string?"}}
B -->|"yes"| C{{"type_deduction"}}
B -->|"no"| D{{"type_deduction"}}
A(["initializer_list init"]) --> B{"empty, or every element is a 2-element<br/>array whose first element is a string?"}
B -->|"yes"| C{"type_deduction"}
B -->|"no"| D{"type_deduction"}
C -->|"true"| OBJ["create object"]
C -->|"false"| E{{"manual_type"}}
C -->|"false"| E{"manual_type"}
E -->|"object"| OBJ
E -->|"array"| ARR["create array"]
D -->|"true"| ARR
D -->|"false"| F{{"manual_type"}}
D -->|"false"| F{"manual_type"}
F -->|"array"| ARR
F -->|"object"| ERR["throw type_error.301"]
```
<p class="nj-caption" markdown>Decision flow for an initializer list: hexagons are checks, edge labels are their
outcomes, and rectangles are the resulting value or exception.</p>
The rules aim to create the best fit between a C++ initializer list and JSON values. The rationale is as follows:
1. The empty initializer list is written as `#!cpp {}` which is exactly an empty JSON object.
@@ -476,13 +473,12 @@ basic_json(basic_json&& other) noexcept;
## See also
- [`array`](array.md) - create a JSON array value, forcing array creation from an initializer list even when it looks like
- [array](array.md) create a JSON array value, forcing array creation from an initializer list even when it looks like
an object
- [`object`](object.md) - create a JSON object value, forcing object creation from an initializer list
- [`binary`](binary.md) - create a JSON binary array value
- [`operator=`](operator=.md) - copy assignment operator
- [object](object.md) create a JSON object value, forcing object creation from an initializer list
- [binary](binary.md) create a JSON binary array value
- [operator=](operator=.md) copy assignment operator
- [Creating JSON values](../../features/creating_values.md) - the article on creating JSON values
- [Converting values](../../features/conversions.md) - which C++ types can be converted
## Version history
+6 -11
View File
@@ -7,12 +7,7 @@ const_iterator begin() const noexcept;
Returns an iterator to the first element.
<div class="nj-fig-wrap" markdown>
--8<-- "images/range-begin-end.svg"
</div>
<p class="nj-caption" markdown>`begin()` points to the first element and `end()` to the position after the last element;
the dashed cell is the past-the-last position, which must not be dereferenced.</p>
![Illustration from cppreference.com](../../images/range-begin-end.svg)
## Return value
@@ -44,12 +39,12 @@ Constant.
## See also
- [`end`](end.md) - returns an iterator to one past the last element
- [`cbegin`](cbegin.md) - returns a const iterator to the first element
- [`rbegin`](rbegin.md) - returns a reverse iterator to the last element
- [`items`](items.md) - returns an iteration proxy to access keys and values during range-based for loops
- [end](end.md) returns an iterator to one past the last element
- [cbegin](cbegin.md) returns a const iterator to the first element
- [rbegin](rbegin.md) returns a reverse iterator to the last element
- [items](items.md) returns an iteration proxy to access keys and values during range-based for loops
- [Iterators](../../features/iterators.md) - the article on iterators
- [`basic_json_view::begin`](../basic_json_view/begin.md) - the same iteration on a zero-copy view (in document order,
- [basic_json_view::begin](../basic_json_view/begin.md) - the same iteration on a zero-copy view (in document order,
not sorted by key)
## Version history
+4 -5
View File
@@ -63,11 +63,10 @@ initialization of a binary array type, for backwards compatibility and so it doe
## See also
- [Binary formats](../../features/binary_formats/index.md) - formats that can store binary values
- [`binary_t`](binary_t.md) - type for binary values
- [`get_binary`](get_binary.md) - get a reference to the stored binary value
- [`is_binary`](is_binary.md) - return whether the value is binary
- [`byte_container_with_subtype`](../byte_container_with_subtype/index.md) - container for binary values with subtype
- [binary_t](binary_t.md) type for binary values
- [get_binary](get_binary.md) get a reference to the stored binary value
- [is_binary](is_binary.md) return whether the value is binary
- [byte_container_with_subtype](../byte_container_with_subtype/index.md) container for binary values with subtype
- [Binary Values](../../features/binary_values.md) - the article on binary values
## Version history
+2 -4
View File
@@ -41,7 +41,7 @@ represent a byte array in modern C++.
[`byte_container_with_subtype`](../byte_container_with_subtype/index.md) derives directly from it. Its
`value_type` must additionally be exactly one byte wide (e.g., `std::uint8_t`/`char`/`std::byte`): the binary
serializers (CBOR, MessagePack, BSON, UBJSON) read and write the container's raw bytes via
`reinterpret_cast`, which is only correct for byte-sized elements — a container like
`reinterpret_cast`, which is only correct for byte-sized elements -- a container like
`#!cpp std::vector<std::intptr_t>` will not work as `BinaryType`. The elements must be stored contiguously, and
the binary readers additionally require `resize()` and `operator[]`. See
[Template Parameter Requirements](../../features/types/template_parameters.md#binarytype) for the full list.
@@ -118,9 +118,7 @@ type `#!cpp binary_t*` must be dereferenced.
## See also
- [Binary values](../../features/binary_values.md) - how binary values and subtypes are handled
- [Binary formats](../../features/binary_formats/index.md) - formats that can store binary values
- [`byte_container_with_subtype`](../byte_container_with_subtype/index.md) - container type used by binary values
- [byte_container_with_subtype](../byte_container_with_subtype/index.md)
## Version history
+1 -3
View File
@@ -47,9 +47,7 @@ Boolean values are stored directly inside a `basic_json` type.
## See also
- [`is_boolean`](is_boolean.md) - checks whether the JSON value is a boolean
- [Types](../../features/types/index.md) - how booleans are stored
- [Template Parameter Requirements](../../features/types/template_parameters.md) - requirements on the `BooleanType` template parameter
- [is_boolean](is_boolean.md) checks whether the JSON value is a boolean
## Version history
+5 -10
View File
@@ -6,12 +6,7 @@ const_iterator cbegin() const noexcept;
Returns an iterator to the first element.
<div class="nj-fig-wrap" markdown>
--8<-- "images/range-begin-end.svg"
</div>
<p class="nj-caption" markdown>`cbegin()` points to the first element, like `begin()`, and `end()` to the position after
the last element; the dashed cell is the past-the-last position, which must not be dereferenced.</p>
![Illustration from cppreference.com](../../images/range-begin-end.svg)
## Return value
@@ -43,11 +38,11 @@ Constant.
## See also
- [`begin`](begin.md) - returns an iterator to the first element
- [`cend`](cend.md) - returns a const iterator to one past the last element
- [`crbegin`](crbegin.md) - returns a const reverse iterator to the last element
- [begin](begin.md) returns an iterator to the first element
- [cend](cend.md) returns a const iterator to one past the last element
- [crbegin](crbegin.md) returns a const reverse iterator to the last element
- [Iterators](../../features/iterators.md) - the article on iterators
- [`basic_json_view::cbegin`](../basic_json_view/cbegin.md) - the same iteration on a zero-copy view
- [basic_json_view::cbegin](../basic_json_view/cbegin.md) - the same iteration on a zero-copy view
## Version history
@@ -42,9 +42,8 @@ store
## See also
- [Binary values](../../features/binary_values.md) - how binary values and subtypes are handled
- [`from_cbor`](from_cbor.md) - deserializes a JSON value from CBOR
- [`input_format_t`](input_format_t.md) - the enumeration of supported input formats
- [from_cbor](from_cbor.md) deserializes a JSON value from CBOR
- [input_format_t](input_format_t.md) the enumeration of supported input formats
- [CBOR](../../features/binary_formats/cbor.md) - the article on the CBOR format
## Version history
+5 -10
View File
@@ -6,12 +6,7 @@ const_iterator cend() const noexcept;
Returns an iterator to one past the last element.
<div class="nj-fig-wrap" markdown>
--8<-- "images/range-begin-end.svg"
</div>
<p class="nj-caption" markdown>`cend()` points to the position after the last element, like `end()`, and `begin()` to
the first element; the dashed cell is the past-the-last position, which must not be dereferenced.</p>
![Illustration from cppreference.com](../../images/range-begin-end.svg)
## Return value
@@ -43,11 +38,11 @@ Constant.
## See also
- [`end`](end.md) - returns an iterator to one past the last element
- [`cbegin`](cbegin.md) - returns a const iterator to the first element
- [`crend`](crend.md) - returns a const reverse iterator to one before the first element
- [end](end.md) returns an iterator to one past the last element
- [cbegin](cbegin.md) returns a const iterator to the first element
- [crend](crend.md) returns a const reverse iterator to one before the first element
- [Iterators](../../features/iterators.md) - the article on iterators
- [`basic_json_view::cend`](../basic_json_view/cend.md) - the same iteration on a zero-copy view
- [basic_json_view::cend](../basic_json_view/cend.md) - the same iteration on a zero-copy view
## Version history
+2 -3
View File
@@ -54,9 +54,8 @@ All iterators, pointers, and references related to this container are invalidate
## See also
- [`erase`](erase.md) - removes elements from a JSON value
- [`empty`](empty.md) - checks whether the JSON value has no elements
- [Modifying values](../../features/modifying_values.md) - the article on modifying values
- [erase](erase.md) removes elements from a JSON value
- [empty](empty.md) checks whether the JSON value has no elements
## Version history
+3 -4
View File
@@ -141,10 +141,9 @@ Strong exception safety: if an exception occurs, the original value stays intact
## See also
- [`find`](find.md) - find a value in an object
- [`count`](count.md) - returns the number of occurrences of a key
- [`basic_json_view::contains`](../basic_json_view/contains.md) - the same check on a zero-copy view
- [Element Access](../../features/element_access/index.md#does-this-key-exist) - how to test whether a key exists
- [find](find.md) find a value in an object
- [count](count.md) returns the number of occurrences of a key
- [basic_json_view::contains](../basic_json_view/contains.md) - the same check on a zero-copy view
## Version history
+3 -4
View File
@@ -85,10 +85,9 @@ Logarithmic in the size of the JSON object.
## See also
- [`find`](find.md) - find a value in an object
- [`contains`](contains.md) - checks whether a key exists
- [`basic_json_view::count`](../basic_json_view/count.md) - the same check on a zero-copy view
- [Element Access](../../features/element_access/index.md#does-this-key-exist) - how to test whether a key exists
- [find](find.md) find a value in an object
- [contains](contains.md) checks whether a key exists
- [basic_json_view::count](../basic_json_view/count.md) - the same check on a zero-copy view
## Version history
+4 -10
View File
@@ -6,13 +6,7 @@ const_reverse_iterator crbegin() const noexcept;
Returns an iterator to the reverse-beginning; that is, the last element.
<div class="nj-fig-wrap" markdown>
--8<-- "images/range-rbegin-rend.svg"
</div>
<p class="nj-caption" markdown>`crbegin()` points to the last element, like `rbegin()`, and `rend()` to the position
before the first element. The upper row is the reversed sequence and the lower row the forward sequence; dashed arrows
link each reverse iterator to the forward iterator it stores, and dashed cells are past-the-last positions.</p>
![Illustration from cppreference.com](../../images/range-rbegin-rend.svg)
## Return value
@@ -44,9 +38,9 @@ Constant.
## See also
- [`crend`](crend.md) - returns a const reverse iterator to one before the first element
- [`rbegin`](rbegin.md) - returns a reverse iterator to the last element
- [`cbegin`](cbegin.md) - returns a const iterator to the first element
- [crend](crend.md) returns a const reverse iterator to one before the first element
- [rbegin](rbegin.md) returns a reverse iterator to the last element
- [cbegin](cbegin.md) returns a const iterator to the first element
- [Iterators](../../features/iterators.md) - the article on iterators
## Version history
+4 -10
View File
@@ -7,13 +7,7 @@ const_reverse_iterator crend() const noexcept;
Returns an iterator to the reverse-end; that is, one before the first element. This element acts as a placeholder,
attempting to access it results in undefined behavior.
<div class="nj-fig-wrap" markdown>
--8<-- "images/range-rbegin-rend.svg"
</div>
<p class="nj-caption" markdown>`crend()` points to the position before the first element, like `rend()`, and `rbegin()`
to the last element. The upper row is the reversed sequence and the lower row the forward sequence; dashed arrows link
each reverse iterator to the forward iterator it stores, and dashed cells are past-the-last positions.</p>
![Illustration from cppreference.com](../../images/range-rbegin-rend.svg)
## Return value
@@ -45,9 +39,9 @@ Constant.
## See also
- [`crbegin`](crbegin.md) - returns a const reverse iterator to the last element
- [`rend`](rend.md) - returns a reverse iterator to one before the first element
- [`cend`](cend.md) - returns a const iterator to one past the last element
- [crbegin](crbegin.md) returns a const reverse iterator to the last element
- [rend](rend.md) returns a reverse iterator to one before the first element
- [cend](cend.md) returns a const iterator to one past the last element
- [Iterators](../../features/iterators.md) - the article on iterators
## Version history
@@ -32,10 +32,8 @@ The actual comparator used depends on [`object_t`](object_t.md) and can be obtai
## See also
- [`object_comparator_t`](object_comparator_t.md) - the comparator actually used by `object_t`
- [`object_t`](object_t.md) - the type used to store JSON objects
- [Template Parameter Requirements](../../features/types/template_parameters.md) - requirements on the `ObjectType` template parameter
- [Object order](../../features/object_order.md) - preserve the insertion order of keys
- [object_comparator_t](object_comparator_t.md) the comparator actually used by `object_t`
- [object_t](object_t.md) the type used to store JSON objects
## Version history
+8 -10
View File
@@ -19,10 +19,9 @@ The equality holds up to [`operator==`](operator_eq.md), so it has the following
- A value that is not equal to itself cannot round-trip. This applies to `NaN` (also nested in an array or object) and
to [discarded](is_discarded.md) values: `diff` emits a `replace` operation for them. A `NaN` in the patch is
serialized as `#!json null`, so a patch that was dumped and parsed again would set `#!json null`.
- Numbers that compare equal produce no operation, even if their types differ or if one is zero and the other is
negative zero: `diff(1, 1.0)` (integer and floating-point), `diff(1u, 1)` (unsigned and signed integer) and
`diff(0.0, -0.0)` (positive and negative zero) all return `#!json []`. The patched value is then the `source` and
keeps its number type and sign.
- Numbers that compare equal produce no operation, even if their types or signs differ: `diff(1, 1.0)`,
`diff(1u, 1)` (unsigned and signed integer) and `diff(0.0, -0.0)` all return `#!json []`. The patched value is then
the `source` and keeps its number type.
## Parameters
@@ -93,12 +92,11 @@ operations times the length of their paths, so a small change deep inside a valu
## See also
- [RFC 6902 (JSON Patch)](https://tools.ietf.org/html/rfc6902) - specification of JSON Patch
- [`patch`](patch.md) - applies a JSON Patch
- [`patch_inplace`](patch_inplace.md) - applies a JSON Patch in place
- [`merge_patch`](merge_patch.md) - applies a JSON Merge Patch
- [`merge_diff`](merge_diff.md) - creates a diff as a JSON Merge Patch
- [JSON Patch and Diff](../../features/json_patch.md) - the article on JSON Patch
- [RFC 6902 (JSON Patch)](https://tools.ietf.org/html/rfc6902)
- [patch](patch.md) applies a JSON Patch
- [patch_inplace](patch_inplace.md) applies a JSON Patch in place
- [merge_patch](merge_patch.md) applies a JSON Merge Patch
- [merge_diff](merge_diff.md) creates a diff as a JSON Merge Patch
## Version history
+3 -3
View File
@@ -89,9 +89,9 @@ Binary values are serialized as an object containing two keys:
## See also
- [`to_string`](to_string.md) - returns a string representation of a JSON value
- [`operator<<`](../operator_ltlt.md) - serialize to stream
- [`basic_json_view::dump`](../basic_json_view/dump.md) - the corresponding function of `basic_json_view`, serializing
- [to_string](to_string.md) returns a string representation of a JSON value
- [operator<<](../operator_ltlt.md) serialize to stream
- [`basic_json_view::dump`](../basic_json_view/dump.md) the corresponding function of `basic_json_view`, serializing
directly from a flat index without building a `basic_json` value
- [Serialization](../../features/serialization.md) - the serialization article
+2 -2
View File
@@ -63,8 +63,8 @@ Logarithmic in the size of the container, O(log(`size()`)).
## See also
- [`emplace_back`](emplace_back.md) - add a value to an array
- [`insert`](insert.md) - add values to an array/object
- [emplace_back](emplace_back.md) add a value to an array
- [insert](insert.md) add values to an array/object
- [Modifying values](../../features/modifying_values.md) - the article on modifying values
## Version history
@@ -61,8 +61,8 @@ Amortized constant.
## See also
- [`operator+=`](operator+=.md) - add a value to an array/object
- [`push_back`](push_back.md) - add a value to an array/object
- [operator+=](operator+=.md) add a value to an array/object
- [push_back](push_back.md) add a value to an array/object
- [Modifying values](../../features/modifying_values.md) - the article on modifying values
## Version history
+4 -4
View File
@@ -41,7 +41,7 @@ bool empty() const noexcept
## Notes
This function does not return whether a string stored as JSON value is empty — it returns whether the JSON container
This function does not return whether a string stored as JSON value is empty -- it returns whether the JSON container
itself is empty which is `#!cpp false` in the case of a string.
## Examples
@@ -62,9 +62,9 @@ itself is empty which is `#!cpp false` in the case of a string.
## See also
- [`size`](size.md) - returns the number of elements
- [`clear`](clear.md) - clears the content and resets the value to the default value
- [`basic_json_view::empty`](../basic_json_view/empty.md) - the same check on a zero-copy view
- [size](size.md) returns the number of elements
- [clear](clear.md) clears the content and resets the value to the default value
- [basic_json_view::empty](../basic_json_view/empty.md) - the same check on a zero-copy view
## Version history
+5 -10
View File
@@ -7,12 +7,7 @@ const_iterator end() const noexcept;
Returns an iterator to one past the last element.
<div class="nj-fig-wrap" markdown>
--8<-- "images/range-begin-end.svg"
</div>
<p class="nj-caption" markdown>`end()` points to the position after the last element and `begin()` to the first element;
the dashed cell is the past-the-last position, which must not be dereferenced.</p>
![Illustration from cppreference.com](../../images/range-begin-end.svg)
## Return value
@@ -44,11 +39,11 @@ Constant.
## See also
- [`begin`](begin.md) - returns an iterator to the first element
- [`cend`](cend.md) - returns a const iterator to one past the last element
- [`rend`](rend.md) - returns a reverse iterator to one before the first element
- [begin](begin.md) returns an iterator to the first element
- [cend](cend.md) returns a const iterator to one past the last element
- [rend](rend.md) returns a reverse iterator to one before the first element
- [Iterators](../../features/iterators.md) - the article on iterators
- [`basic_json_view::end`](../basic_json_view/end.md) - the same iteration on a zero-copy view
- [basic_json_view::end](../basic_json_view/end.md) - the same iteration on a zero-copy view
## Version history
+2 -3
View File
@@ -60,9 +60,8 @@ Constant.
## See also
- [`start_pos`](start_pos.md) - to access the start position
- [`JSON_DIAGNOSTIC_POSITIONS`](../macros/json_diagnostic_positions.md) - overview of the supported conversions
- [Parsing and Exceptions](../../features/parsing/parse_exceptions.md) - handling parse errors and locating them in the input
- [start_pos](start_pos.md) to access the start position
- [JSON_DIAGNOSTIC_POSITIONS](../macros/json_diagnostic_positions.md) for an overview of the diagnostic positions
## Version history
+2 -2
View File
@@ -204,8 +204,8 @@ Strong exception safety: if an exception occurs, the original value stays intact
## See also
- [`clear`](clear.md) - clears the contents
- [`insert`](insert.md) - add values to an array/object
- [clear](clear.md) clears the contents
- [insert](insert.md) add values to an array/object
- [Modifying values](../../features/modifying_values.md) - the article on modifying values
## Version history
@@ -61,7 +61,7 @@ keep
## See also
- [`dump`](dump.md) - serializes a JSON value, with an `error_handler_t` parameter to configure invalid UTF-8 handling
- [dump](dump.md) serializes a JSON value, with an `error_handler_t` parameter to configure invalid UTF-8 handling
- [Handling invalid UTF-8](../../features/serialization.md#handling-invalid-utf-8) - the article on handling invalid UTF-8
## Version history
+1 -8
View File
@@ -40,9 +40,6 @@ classDiagram
style json_exception fill:#CCCCFF
```
<p class="nj-caption" markdown>Class hierarchy of the library's exceptions; arrows point from a derived class to its
base class, and the highlighted box is `basic_json::exception`.</p>
Subclasses:
- [`parse_error`](parse_error.md) for exceptions indicating a parse error
@@ -83,11 +80,7 @@ constructor.
## See also
- [List of exceptions](../../home/exceptions.md) - overview of all exceptions thrown by the library
- [Working Without Exceptions](../../features/no_exceptions.md) - using the library without exceptions
- [`JSON_DIAGNOSTICS`](../macros/json_diagnostics.md) - extended exception messages with the path of the failing value
- [Parsing and Exceptions](../../features/parsing/parse_exceptions.md) - parsing alternatives that do not throw
- [Debugging](../../home/debugging.md) - debugging aids
[List of exceptions](../../home/exceptions.md)
## Version history
+3 -4
View File
@@ -91,11 +91,10 @@ Logarithmic in the size of the JSON object.
## See also
- [`count`](count.md) - returns the number of occurrences of a key
- [`contains`](contains.md) - checks whether a key exists
- [`basic_json_view::find`](../basic_json_view/find.md) - the same lookup on a zero-copy view (a duplicate key resolves
- [count](count.md) returns the number of occurrences of a key
- [contains](contains.md) checks whether a key exists
- [basic_json_view::find](../basic_json_view/find.md) - the same lookup on a zero-copy view (a duplicate key resolves
to the first member, whereas `parse()` keeps the last)
- [Element Access](../../features/element_access/index.md#does-this-key-exist) - how to test whether a key exists
## Version history
+1 -2
View File
@@ -58,8 +58,7 @@ Empty objects and arrays are flattened to `#!json null` and will not be reconstr
## See also
- [`unflatten`](unflatten.md) - the reverse function
- [JSON Pointer](../../features/json_pointer.md#flatten-unflatten) - the article on JSON Pointer and flattening
- [unflatten](unflatten.md) the reverse function
## Version history
+2 -2
View File
@@ -86,8 +86,8 @@ std::string format_as(const BasicJsonType& j)
## See also
- [`dump`](dump.md) - serialize a JSON value to a string
- [`std::formatter<basic_json>`](std_formatter.md) - the `std::format` (C++20) equivalent
- [dump](dump.md)
- [std::formatter<basic_json>](std_formatter.md) - the `std::format` (C++20) equivalent
- [Serialization](../../features/serialization.md) - the serialization article
## Version history
+6 -10
View File
@@ -110,16 +110,12 @@ Linear in the size of the input.
## See also
- [BJData](../../features/binary_formats/bjdata.md) - the format, its byte layout and how values are mapped
- [Binary formats](../../features/binary_formats/index.md) - overview and comparison of the supported binary formats
- [Parsing untrusted input](../../features/parsing/untrusted_input.md) - limits and safe handling of hostile data
- [Binary values](../../features/binary_values.md) - how binary values and subtypes are handled
- [`to_bjdata`](to_bjdata.md) - create a BJData serialization of a JSON value
- [`from_cbor`](from_cbor.md) - create a JSON value from an input in CBOR format
- [`from_msgpack`](from_msgpack.md) - create a JSON value from an input in MessagePack format
- [`from_bson`](from_bson.md) - create a JSON value from an input in BSON format
- [`from_ubjson`](from_ubjson.md) - create a JSON value from an input in UBJSON format
- [`from_bon8`](from_bon8.md) - create a JSON value from an input in BON8 format
- [to_bjdata](to_bjdata.md) create a BJData serialization of a JSON value
- [from_cbor](from_cbor.md) create a JSON value from an input in CBOR format
- [from_msgpack](from_msgpack.md) create a JSON value from an input in MessagePack format
- [from_bson](from_bson.md) create a JSON value from an input in BSON format
- [from_ubjson](from_ubjson.md) create a JSON value from an input in UBJSON format
- [from_bon8](from_bon8.md) create a JSON value from an input in BON8 format
## Version history
+6 -9
View File
@@ -101,15 +101,12 @@ Linear in the size of the input.
## See also
- [BON8](../../features/binary_formats/bon8.md) - the format, its byte layout and how values are mapped
- [Binary formats](../../features/binary_formats/index.md) - overview and comparison of the supported binary formats
- [Parsing untrusted input](../../features/parsing/untrusted_input.md) - limits and safe handling of hostile data
- [`to_bon8`](to_bon8.md) - create a BON8 serialization of a JSON value
- [`from_cbor`](from_cbor.md) - create a JSON value from an input in CBOR format
- [`from_msgpack`](from_msgpack.md) - create a JSON value from an input in MessagePack format
- [`from_bson`](from_bson.md) - create a JSON value from an input in BSON format
- [`from_ubjson`](from_ubjson.md) - create a JSON value from an input in UBJSON format
- [`from_bjdata`](from_bjdata.md) - create a JSON value from an input in BJData format
- [to_bon8](to_bon8.md) create a BON8 serialization of a JSON value
- [from_cbor](from_cbor.md) create a JSON value from an input in CBOR format
- [from_msgpack](from_msgpack.md) create a JSON value from an input in MessagePack format
- [from_bson](from_bson.md) create a JSON value from an input in BSON format
- [from_ubjson](from_ubjson.md) create a JSON value from an input in UBJSON format
- [from_bjdata](from_bjdata.md) create a JSON value from an input in BJData format
## Version history
+7 -11
View File
@@ -109,17 +109,13 @@ Linear in the size of the input.
## See also
- [BSON](../../features/binary_formats/bson.md) - the format, its byte layout and how values are mapped
- [Binary formats](../../features/binary_formats/index.md) - overview and comparison of the supported binary formats
- [Parsing untrusted input](../../features/parsing/untrusted_input.md) - limits and safe handling of hostile data
- [Binary values](../../features/binary_values.md) - how binary values and subtypes are handled
- [BSON specification](http://bsonspec.org/spec.html) - specification of the BSON format
- [`to_bson`](to_bson.md) - the analogous serialization
- [`from_cbor`](from_cbor.md) - the related CBOR format
- [`from_msgpack`](from_msgpack.md) - the related MessagePack format
- [`from_ubjson`](from_ubjson.md) - the related UBJSON format
- [`from_bjdata`](from_bjdata.md) - the related BJData format
- [`from_bon8`](from_bon8.md) - the related BON8 format
- [BSON specification](http://bsonspec.org/spec.html)
- [to_bson](to_bson.md) for the analogous serialization
- [from_cbor](from_cbor.md) for the related CBOR format
- [from_msgpack](from_msgpack.md) for the related MessagePack format
- [from_ubjson](from_ubjson.md) for the related UBJSON format
- [from_bjdata](from_bjdata.md) for the related BJData format
- [from_bon8](from_bon8.md) for the related BON8 format
## Version history
+6 -10
View File
@@ -122,16 +122,12 @@ Linear in the size of the input.
## See also
- [CBOR](../../features/binary_formats/cbor.md) - the format, its byte layout and how values are mapped
- [Binary formats](../../features/binary_formats/index.md) - overview and comparison of the supported binary formats
- [Parsing untrusted input](../../features/parsing/untrusted_input.md) - limits and safe handling of hostile data
- [Binary values](../../features/binary_values.md) - how binary values and subtypes are handled
- [`to_cbor`](to_cbor.md) - create a CBOR serialization of a JSON value
- [`from_msgpack`](from_msgpack.md) - create a JSON value from an input in MessagePack format
- [`from_bson`](from_bson.md) - create a JSON value from an input in BSON format
- [`from_ubjson`](from_ubjson.md) - create a JSON value from an input in UBJSON format
- [`from_bjdata`](from_bjdata.md) - create a JSON value from an input in BJData format
- [`from_bon8`](from_bon8.md) - create a JSON value from an input in BON8 format
- [to_cbor](to_cbor.md) create a CBOR serialization of a JSON value
- [from_msgpack](from_msgpack.md) create a JSON value from an input in MessagePack format
- [from_bson](from_bson.md) create a JSON value from an input in BSON format
- [from_ubjson](from_ubjson.md) create a JSON value from an input in UBJSON format
- [from_bjdata](from_bjdata.md) create a JSON value from an input in BJData format
- [from_bon8](from_bon8.md) create a JSON value from an input in BON8 format
## Version history
@@ -107,16 +107,12 @@ Linear in the size of the input.
## See also
- [MessagePack](../../features/binary_formats/messagepack.md) - the format, its byte layout and how values are mapped
- [Binary formats](../../features/binary_formats/index.md) - overview and comparison of the supported binary formats
- [Parsing untrusted input](../../features/parsing/untrusted_input.md) - limits and safe handling of hostile data
- [Binary values](../../features/binary_values.md) - how binary values and subtypes are handled
- [`to_msgpack`](to_msgpack.md) - create a MessagePack serialization of a JSON value
- [`from_cbor`](from_cbor.md) - create a JSON value from an input in CBOR format
- [`from_bson`](from_bson.md) - create a JSON value from an input in BSON format
- [`from_ubjson`](from_ubjson.md) - create a JSON value from an input in UBJSON format
- [`from_bjdata`](from_bjdata.md) - create a JSON value from an input in BJData format
- [`from_bon8`](from_bon8.md) - create a JSON value from an input in BON8 format
- [to_msgpack](to_msgpack.md) create a MessagePack serialization of a JSON value
- [from_cbor](from_cbor.md) create a JSON value from an input in CBOR format
- [from_bson](from_bson.md) create a JSON value from an input in BSON format
- [from_ubjson](from_ubjson.md) create a JSON value from an input in UBJSON format
- [from_bjdata](from_bjdata.md) create a JSON value from an input in BJData format
- [from_bon8](from_bon8.md) create a JSON value from an input in BON8 format
## Version history
+6 -10
View File
@@ -114,16 +114,12 @@ Linear in the size of the input.
## See also
- [UBJSON](../../features/binary_formats/ubjson.md) - the format, its byte layout and how values are mapped
- [Binary formats](../../features/binary_formats/index.md) - overview and comparison of the supported binary formats
- [Parsing untrusted input](../../features/parsing/untrusted_input.md) - limits and safe handling of hostile data
- [Binary values](../../features/binary_values.md) - how binary values and subtypes are handled
- [`to_ubjson`](to_ubjson.md) - create a UBJSON serialization of a JSON value
- [`from_cbor`](from_cbor.md) - create a JSON value from an input in CBOR format
- [`from_msgpack`](from_msgpack.md) - create a JSON value from an input in MessagePack format
- [`from_bson`](from_bson.md) - create a JSON value from an input in BSON format
- [`from_bjdata`](from_bjdata.md) - create a JSON value from an input in BJData format
- [`from_bon8`](from_bon8.md) - create a JSON value from an input in BON8 format
- [to_ubjson](to_ubjson.md) create a UBJSON serialization of a JSON value
- [from_cbor](from_cbor.md) create a JSON value from an input in CBOR format
- [from_msgpack](from_msgpack.md) create a JSON value from an input in MessagePack format
- [from_bson](from_bson.md) create a JSON value from an input in BSON format
- [from_bjdata](from_bjdata.md) create a JSON value from an input in BJData format
- [from_bon8](from_bon8.md) create a JSON value from an input in BON8 format
## Version history
+2 -3
View File
@@ -50,10 +50,9 @@ Constant.
## See also
- [`back`](back.md) - to access the last element
- [`basic_json_view::front`](../basic_json_view/front.md) - the same access on a zero-copy view (document order, not
- [back](back.md) to access the last element
- [basic_json_view::front](../basic_json_view/front.md) - the same access on a zero-copy view (document order, not
sorted; duplicate keys are visited)
- [Element Access](../../features/element_access/index.md) - overview of all ways to access elements
## Version history
+5 -6
View File
@@ -178,14 +178,13 @@ overload (3).
## See also
- [`get_to`](get_to.md) - convert and write into a passed value
- [`get_ptr`](get_ptr.md) - get a pointer to the stored value
- [`get_ref`](get_ref.md) - get a reference to the stored value
- [`operator ValueType`](operator_ValueType.md) - get a value via implicit conversion
- [get_to](get_to.md) convert and write into a passed value
- [get_ptr](get_ptr.md) get a pointer to the stored value
- [get_ref](get_ref.md) get a reference to the stored value
- [operator ValueType](operator_ValueType.md) get a value via implicit conversion
- [Converting values](../../features/conversions.md) - the type conversions article
- [`basic_json_view::get`](../basic_json_view/get.md) - the same conversion on a zero-copy view (many types are
- [basic_json_view::get](../basic_json_view/get.md) - the same conversion on a zero-copy view (many types are
converted without ever building a `basic_json` value)
- [Arbitrary Type Conversions](../../features/arbitrary_types.md) - make your own types usable with `get`
## Version history
@@ -36,7 +36,7 @@ Constant.
## See also
- [`basic_json`](index.md#template-parameters) - the class template, with `AllocatorType` as one of its template parameters
- [basic_json](index.md#template-parameters) the class template, with `AllocatorType` as one of its template parameters
- [Template Parameter Requirements](../../features/types/template_parameters.md#allocatortype) - the requirements for `AllocatorType`
## Version history
@@ -42,11 +42,8 @@ Constant.
## See also
- [Binary values](../../features/binary_values.md) - how binary values and subtypes are handled
- [`binary`](binary.md) - create a binary value
- [`is_binary`](is_binary.md) - check whether a value is binary
- [`get`](get.md) - get a value (explicit conversion)
- [`get_ref`](get_ref.md) - get a reference to the stored value
- [get](get.md) get a value (explicit conversion)
- [get_ref](get_ref.md) get a reference to the stored value
## Version history
+1 -2
View File
@@ -86,8 +86,7 @@ Constant.
## See also
- [`get_ref()`](get_ref.md) - get a reference value
- [Converting values](../../features/conversions.md) - getting values out, with or without copying
- [get_ref()](get_ref.md) get a reference value
## Version history
+2 -3
View File
@@ -60,10 +60,9 @@ Constant.
## See also
- [`get_ptr()`](get_ptr.md) - get a pointer value
- [`basic_json_view::get_string`](../basic_json_view/get_string.md) - the closest counterpart on a zero-copy view: a
- [get_ptr()](get_ptr.md) get a pointer value
- [basic_json_view::get_string](../basic_json_view/get_string.md) - the closest counterpart on a zero-copy view: a
string without a copy, but as a view rather than a reference to a value that must already exist
- [Converting values](../../features/conversions.md) - getting values out, with or without copying
## Version history
+4 -5
View File
@@ -68,12 +68,11 @@ Depends on the `json_serializer<ValueType>::from_json()` implementation.
## See also
- [`get`](get.md) - get a value (explicit conversion)
- [`get_ref`](get_ref.md) - get a reference to the stored value
- [`get_ptr`](get_ptr.md) - get a pointer to the stored value
- [get](get.md) get a value (explicit conversion)
- [get_ref](get_ref.md) get a reference to the stored value
- [get_ptr](get_ptr.md) get a pointer to the stored value
- [Converting values](../../features/conversions.md) - the type conversions article
- [`basic_json_view::get_to`](../basic_json_view/get_to.md) - the same conversion on a zero-copy view
- [Arbitrary Type Conversions](../../features/arbitrary_types.md) - make your own types usable with `get_to`
- [basic_json_view::get_to](../basic_json_view/get_to.md) - the same conversion on a zero-copy view
## Version history
+4 -9
View File
@@ -189,7 +189,7 @@ The class satisfies the following concept requirements:
Functions to inspect the type of a JSON value.
- [**type**](type.md) - return the type of the JSON value
- [`operator value_t`](operator_value_t.md) - return the type of the JSON value
- [**operator value_t**](operator_value_t.md) - return the type of the JSON value
- [**type_name**](type_name.md) - return the type as string
- [**is_primitive**](is_primitive.md) - return whether the type is primitive
- [**is_structured**](is_structured.md) - return whether the type is structured
@@ -218,7 +218,7 @@ Direct access to the stored value of a JSON value.
- [**get_to**](get_to.md) - get a value and write it to a destination
- [**get_ptr**](get_ptr.md) - get a pointer value
- [**get_ref**](get_ref.md) - get a reference value
- [`operator ValueType`](operator_ValueType.md) - get a value
- [**operator ValueType**](operator_ValueType.md) - get a value
- [**get_binary**](get_binary.md) - get a binary value
- [**as_base_class**](as_base_class.md) - access the custom base class
@@ -359,15 +359,10 @@ Access to the JSON value
## See also
- [RFC 8259: The JavaScript Object Notation (JSON) Data Interchange Format](https://tools.ietf.org/html/rfc8259) -
specification of the JSON data interchange format
- [`basic_json_document`](../basic_json_document/index.md) - / [`basic_json_view`](../basic_json_view/index.md) - parse a JSON
- [RFC 8259: The JavaScript Object Notation (JSON) Data Interchange Format](https://tools.ietf.org/html/rfc8259)
- [basic_json_document](../basic_json_document/index.md) / [basic_json_view](../basic_json_view/index.md) - parse a JSON
text into a flat index and read it through a view
- [Zero-copy JSON views](../../features/json_view.md) - when to use a document and a view instead of a `basic_json`
- [Types](../../features/types/index.md) - how JSON values are stored and which types exist
- [Converting values](../../features/conversions.md) - get values out of a JSON value and put values in
- [Creating JSON values](../../features/creating_values.md) - all the ways to build a JSON value
- [Arbitrary Type Conversions](../../features/arbitrary_types.md) - convert your own types to and from JSON
## Version history
@@ -53,9 +53,8 @@ bon8
## See also
- [`sax_parse`](sax_parse.md) - generic SAX parse interface, taking an `input_format_t` to select the input format
- [`cbor_tag_handler_t`](cbor_tag_handler_t.md) - configures how CBOR tags are treated while parsing
- [Binary Formats](../../features/binary_formats/index.md) - CBOR, MessagePack, BSON, and other formats
- [sax_parse](sax_parse.md) generic SAX parse interface, taking an `input_format_t` to select the input format
- [cbor_tag_handler_t](cbor_tag_handler_t.md) configures how CBOR tags are treated while parsing
## Version history
+4 -5
View File
@@ -185,11 +185,10 @@ Strong exception safety: if an exception occurs, the original value stays intact
## See also
- [`emplace`](emplace.md) - add a value to an object
- [`emplace_back`](emplace_back.md) - add a value to an array
- [`push_back`](push_back.md) - add a value to an array/object
- [`update`](update.md) - merges objects
- [Modifying values](../../features/modifying_values.md) - the article on modifying values
- [emplace](emplace.md) add a value to an object
- [emplace_back](emplace_back.md) add a value to an array
- [push_back](push_back.md) add a value to an array/object
- [update](update.md) merges objects
## Version history
@@ -40,9 +40,6 @@ classDiagram
style json_invalid_iterator fill:#CCCCFF
```
<p class="nj-caption" markdown>Class hierarchy of the library's exceptions; arrows point from a derived class to its
base class, and the highlighted box is `basic_json::invalid_iterator`.</p>
## Member functions
- **what** - returns explanatory string
@@ -69,14 +66,12 @@ base class, and the highlighted box is `basic_json::invalid_iterator`.</p>
## See also
- [`exception`](exception.md) - the base class of all exceptions thrown by the library
- [List of iterator errors](../../home/exceptions.md#iterator-errors) - overview of iterator errors (`invalid_iterator`)
- [`parse_error`](parse_error.md) - exceptions indicating a parse error
- [`type_error`](type_error.md) - exceptions indicating executing a member function with a wrong type
- [`out_of_range`](out_of_range.md) - exceptions indicating access out of the defined range
- [`other_error`](other_error.md) - exceptions indicating other library errors
- [Exceptions](../../home/exceptions.md) - all exceptions and their error codes
- [`JSON_DIAGNOSTICS`](../macros/json_diagnostics.md) - extended exception messages with the path of the failing value
- [`exception`](exception.md) for the base class of all exceptions thrown by the library
- [List of iterator errors](../../home/exceptions.md#iterator-errors)
- [`parse_error`](parse_error.md) for exceptions indicating a parse error
- [`type_error`](type_error.md) for exceptions indicating executing a member function with a wrong type
- [`out_of_range`](out_of_range.md) for exceptions indicating access out of the defined range
- [`other_error`](other_error.md) for exceptions indicating other library errors
## Version history
+5 -6
View File
@@ -36,12 +36,11 @@ Constant.
## See also
- [`is_object`](is_object.md) - checks whether the JSON value is an object
- [`is_structured`](is_structured.md) - checks whether the JSON value is structured (array or object)
- [`type`](type.md) - returns the type of the JSON value
- [`array_t`](array_t.md) - the type used to store JSON arrays
- [`basic_json_view::is_array`](../basic_json_view/is_array.md) - the same check on a zero-copy view
- [Types](../../features/types/index.md) - the JSON value types and how they are stored
- [is_object](is_object.md) checks whether the JSON value is an object
- [is_structured](is_structured.md) checks whether the JSON value is structured (array or object)
- [type](type.md) returns the type of the JSON value
- [array_t](array_t.md) the type used to store JSON arrays
- [basic_json_view::is_array](../basic_json_view/is_array.md) - the same check on a zero-copy view
## Version history
+4 -5
View File
@@ -36,11 +36,10 @@ Constant.
## See also
- [Binary values](../../features/binary_values.md) - how binary values and subtypes are handled
- [`is_primitive`](is_primitive.md) - checks whether the JSON value is primitive
- [`binary_t`](binary_t.md) - the type used to store binary values
- [`get_binary`](get_binary.md) - returns a reference to the stored binary value
- [`basic_json_view::is_binary`](../basic_json_view/is_binary.md) - the same check on a zero-copy view
- [is_primitive](is_primitive.md) checks whether the JSON value is primitive
- [binary_t](binary_t.md) the type used to store binary values
- [get_binary](get_binary.md) returns a reference to the stored binary value
- [basic_json_view::is_binary](../basic_json_view/is_binary.md) - the same check on a zero-copy view
## Version history
@@ -36,10 +36,9 @@ Constant.
## See also
- [`boolean_t`](boolean_t.md) - the type used to store JSON booleans
- [`is_primitive`](is_primitive.md) - checks whether the JSON value is primitive
- [`basic_json_view::is_boolean`](../basic_json_view/is_boolean.md) - the same check on a zero-copy view
- [Types](../../features/types/index.md) - the JSON value types and how they are stored
- [boolean_t](boolean_t.md) the type used to store JSON booleans
- [is_primitive](is_primitive.md) checks whether the JSON value is primitive
- [basic_json_view::is_boolean](../basic_json_view/is_boolean.md) - the same check on a zero-copy view
## Version history
@@ -87,9 +87,8 @@ with `allow_exceptions` set to `#!cpp false`: a parse error then yields a discar
## See also
- [`basic_json_view::is_discarded`](../basic_json_view/is_discarded.md) - the corresponding check on a zero-copy view,
- [basic_json_view::is_discarded](../basic_json_view/is_discarded.md) - the corresponding check on a zero-copy view,
which is `#!cpp true` if the view refers to no value
- [Types](../../features/types/index.md) - the JSON value types and how they are stored
## Version history
+5 -6
View File
@@ -36,12 +36,11 @@ Constant.
## See also
- [`is_array`](is_array.md) - checks whether the JSON value is an array
- [`is_object`](is_object.md) - checks whether the JSON value is an object
- [`type`](type.md) - returns the type of the JSON value
- [`value_t`](value_t.md) - the enumeration of JSON types
- [`basic_json_view::is_null`](../basic_json_view/is_null.md) - the same check on a zero-copy view
- [Types](../../features/types/index.md) - the JSON value types and how they are stored
- [is_array](is_array.md) checks whether the JSON value is an array
- [is_object](is_object.md) checks whether the JSON value is an object
- [type](type.md) returns the type of the JSON value
- [value_t](value_t.md) the enumeration of JSON types
- [basic_json_view::is_null](../basic_json_view/is_null.md) - the same check on a zero-copy view
## Version history
+4 -6
View File
@@ -46,12 +46,10 @@ constexpr bool is_number() const noexcept
## See also
- [`is_number_integer()`](is_number_integer.md) - check if the value is an integer or unsigned integer number
- [`is_number_unsigned()`](is_number_unsigned.md) - check if the value is an unsigned integer number
- [`is_number_float()`](is_number_float.md) - check if the value is a floating-point number
- [`basic_json_view::is_number`](../basic_json_view/is_number.md) - the same check on a zero-copy view
- [Types](../../features/types/index.md) - the JSON value types and how they are stored
- [Number Handling](../../features/types/number_handling.md) - how numbers are stored and converted
- [is_number_integer()](is_number_integer.md) check if the value is an integer or unsigned integer number
- [is_number_unsigned()](is_number_unsigned.md) check if the value is an unsigned integer number
- [is_number_float()](is_number_float.md) check if the value is a floating-point number
- [basic_json_view::is_number](../basic_json_view/is_number.md) - the same check on a zero-copy view
## Version history
@@ -37,12 +37,10 @@ Constant.
## See also
- [`is_number()`](is_number.md) - check if the value is a number
- [`is_number_integer()`](is_number_integer.md) - check if the value is an integer or unsigned integer number
- [`is_number_unsigned()`](is_number_unsigned.md) - check if the value is an unsigned integer number
- [`basic_json_view::is_number_float`](../basic_json_view/is_number_float.md) - the same check on a zero-copy view
- [Types](../../features/types/index.md) - the JSON value types and how they are stored
- [Number Handling](../../features/types/number_handling.md) - how numbers are stored and converted
- [is_number()](is_number.md) check if the value is a number
- [is_number_integer()](is_number_integer.md) check if the value is an integer or unsigned integer number
- [is_number_unsigned()](is_number_unsigned.md) check if the value is an unsigned integer number
- [basic_json_view::is_number_float](../basic_json_view/is_number_float.md) - the same check on a zero-copy view
## Version history
@@ -37,12 +37,10 @@ Constant.
## See also
- [`is_number()`](is_number.md) - check if the value is a number
- [`is_number_unsigned()`](is_number_unsigned.md) - check if the value is an unsigned integer number
- [`is_number_float()`](is_number_float.md) - check if the value is a floating-point number
- [`basic_json_view::is_number_integer`](../basic_json_view/is_number_integer.md) - the same check on a zero-copy view
- [Types](../../features/types/index.md) - the JSON value types and how they are stored
- [Number Handling](../../features/types/number_handling.md) - how numbers are stored and converted
- [is_number()](is_number.md) check if the value is a number
- [is_number_unsigned()](is_number_unsigned.md) check if the value is an unsigned integer number
- [is_number_float()](is_number_float.md) check if the value is a floating-point number
- [basic_json_view::is_number_integer](../basic_json_view/is_number_integer.md) - the same check on a zero-copy view
## Version history
@@ -40,12 +40,10 @@ Constant.
## See also
- [`is_number()`](is_number.md) - check if the value is a number
- [`is_number_integer()`](is_number_integer.md) - check if the value is an integer or unsigned integer number
- [`is_number_float()`](is_number_float.md) - check if the value is a floating-point number
- [`basic_json_view::is_number_unsigned`](../basic_json_view/is_number_unsigned.md) - the same check on a zero-copy view
- [Types](../../features/types/index.md) - the JSON value types and how they are stored
- [Number Handling](../../features/types/number_handling.md) - how numbers are stored and converted
- [is_number()](is_number.md) check if the value is a number
- [is_number_integer()](is_number_integer.md) check if the value is an integer or unsigned integer number
- [is_number_float()](is_number_float.md) check if the value is a floating-point number
- [basic_json_view::is_number_unsigned](../basic_json_view/is_number_unsigned.md) - the same check on a zero-copy view
## Version history
+5 -6
View File
@@ -36,12 +36,11 @@ Constant.
## See also
- [`is_array`](is_array.md) - checks whether the JSON value is an array
- [`is_structured`](is_structured.md) - checks whether the JSON value is structured (array or object)
- [`type`](type.md) - returns the type of the JSON value
- [`object_t`](object_t.md) - the type used to store JSON objects
- [`basic_json_view::is_object`](../basic_json_view/is_object.md) - the same check on a zero-copy view
- [Types](../../features/types/index.md) - the JSON value types and how they are stored
- [is_array](is_array.md) checks whether the JSON value is an array
- [is_structured](is_structured.md) checks whether the JSON value is structured (array or object)
- [type](type.md) returns the type of the JSON value
- [object_t](object_t.md) the type used to store JSON objects
- [basic_json_view::is_object](../basic_json_view/is_object.md) - the same check on a zero-copy view
## Version history
@@ -56,14 +56,13 @@ This library extends primitive types to binary types, because binary types are r
## See also
- [`is_structured()`](is_structured.md) - returns whether the JSON value is structured
- [`is_null()`](is_null.md) - returns whether the JSON value is `null`
- [`is_string()`](is_string.md) - returns whether the JSON value is a string
- [`is_boolean()`](is_boolean.md) - returns whether the JSON value is a boolean
- [`is_number()`](is_number.md) - returns whether the JSON value is a number
- [`is_binary()`](is_binary.md) - returns whether the JSON value is a binary array
- [`basic_json_view::is_primitive`](../basic_json_view/is_primitive.md) - the same check on a zero-copy view
- [Types](../../features/types/index.md) - the JSON value types and how they are stored
- [is_structured()](is_structured.md) returns whether the JSON value is structured
- [is_null()](is_null.md) returns whether the JSON value is `null`
- [is_string()](is_string.md) returns whether the JSON value is a string
- [is_boolean()](is_boolean.md) returns whether the JSON value is a boolean
- [is_number()](is_number.md) returns whether the JSON value is a number
- [is_binary()](is_binary.md) returns whether the JSON value is a binary array
- [basic_json_view::is_primitive](../basic_json_view/is_primitive.md) - the same check on a zero-copy view
## Version history
+4 -5
View File
@@ -36,11 +36,10 @@ Constant.
## See also
- [`is_primitive`](is_primitive.md) - checks whether the JSON value is primitive
- [`type`](type.md) - returns the type of the JSON value
- [`string_t`](string_t.md) - the type used to store JSON strings
- [`basic_json_view::is_string`](../basic_json_view/is_string.md) - the same check on a zero-copy view
- [Types](../../features/types/index.md) - the JSON value types and how they are stored
- [is_primitive](is_primitive.md) checks whether the JSON value is primitive
- [type](type.md) returns the type of the JSON value
- [string_t](string_t.md) the type used to store JSON strings
- [basic_json_view::is_string](../basic_json_view/is_string.md) - the same check on a zero-copy view
## Version history
@@ -54,11 +54,10 @@ Note that though strings are containers in C++, they are treated as primitive va
## See also
- [`is_primitive()`](is_primitive.md) - returns whether JSON value is primitive
- [`is_array()`](is_array.md) - returns whether the value is an array
- [`is_object()`](is_object.md) - returns whether the value is an object
- [`basic_json_view::is_structured`](../basic_json_view/is_structured.md) - the same check on a zero-copy view
- [Types](../../features/types/index.md) - the JSON value types and how they are stored
- [is_primitive()](is_primitive.md) returns whether JSON value is primitive
- [is_array()](is_array.md) returns whether the value is an array
- [is_object()](is_object.md) returns whether the value is an object
- [basic_json_view::is_structured](../basic_json_view/is_structured.md) - the same check on a zero-copy view
## Version history
+4 -5
View File
@@ -54,7 +54,7 @@ using element_type = decltype(*j_object.items().begin());
```
The per-element type (`iteration_proxy_value`) lives in the library's internal `detail` namespace and is
intentionally unspecified as a stable, named type — `decltype` is the supported way to obtain it, but its exact
intentionally unspecified as a stable, named type -- `decltype` is the supported way to obtain it, but its exact
name/definition may change between versions.
## Return value
@@ -97,11 +97,10 @@ When iterating over an array, `key()` will return the index of the element as st
## See also
- [`begin`](begin.md) - returns an iterator to the first element
- [`end`](end.md) - returns an iterator to one past the last element
- [`basic_json_view::items`](../basic_json_view/items.md) - the same range on a zero-copy view (`#!cpp const auto`,
- [begin](begin.md) returns an iterator to the first element
- [end](end.md) returns an iterator to one past the last element
- [basic_json_view::items](../basic_json_view/items.md) - the same range on a zero-copy view (`#!cpp const auto`,
not `#!cpp const auto&`: items are produced on the fly; document order, not sorted; duplicate keys are visited)
- [Iterators](../../features/iterators.md#access-object-keys-during-iteration) - the article on iterating over keys and values
## Version history
@@ -57,7 +57,7 @@ same name. Hidden members remain accessible via [`as_base_class`](as_base_class.
## See also
- [`as_base_class`](as_base_class.md) - access the custom base class
- [as_base_class](as_base_class.md) - access the custom base class
- [Template Parameter Requirements](../../features/types/template_parameters.md#custombaseclass) - the requirements for `CustomBaseClass`
## Version history
@@ -44,11 +44,10 @@ deserializes. See [Template Parameter Requirements](../../features/types/templat
## See also
- [`adl_serializer`](../adl_serializer/index.md) - the default `json_serializer`
- [`get`](get.md) - explicit type conversion using the `json_serializer`'s `from_json()` method
- [`get_to`](get_to.md) - explicit type conversion into a variable using the `json_serializer`'s `from_json()` method
- [adl_serializer](../adl_serializer/index.md) the default `json_serializer`
- [get](get.md) explicit type conversion using the `json_serializer`'s `from_json()` method
- [get_to](get_to.md) explicit type conversion into a variable using the `json_serializer`'s `from_json()` method
- [Arbitrary Type Conversions](../../features/arbitrary_types.md) - the article on converting between JSON values and arbitrary types
- [Template Parameter Requirements](../../features/types/template_parameters.md) - requirements on the `JSONSerializer` template parameter
## Version history
+4 -4
View File
@@ -33,7 +33,7 @@ constant complexity.
## Notes
This function does not return the maximal length of a string stored as JSON value — it returns the maximal number of
This function does not return the maximal length of a string stored as JSON value -- it returns the maximal number of
string elements the JSON value can store which is `1`.
## Examples
@@ -56,9 +56,9 @@ string elements the JSON value can store which is `1`.
## See also
- [`size`](size.md) - returns the number of elements
- [`array_t`](array_t.md) - the type used to store JSON arrays
- [`object_t`](object_t.md) - the type used to store JSON objects
- [size](size.md) returns the number of elements
- [array_t](array_t.md) the type used to store JSON arrays
- [object_t](object_t.md) the type used to store JSON objects
## Version history
@@ -70,10 +70,9 @@ object operation (looking up a key, or adding one to the patch): logarithmic for
## See also
- [RFC 7396 (JSON Merge Patch)](https://tools.ietf.org/html/rfc7396) - specification of JSON Merge Patch
- [`merge_patch`](merge_patch.md) - applies a JSON Merge Patch
- [`diff`](diff.md) - creates a diff as a JSON Patch
- [JSON Merge Patch](../../features/merge_patch.md) - the article on JSON Merge Patch
- [RFC 7396 (JSON Merge Patch)](https://tools.ietf.org/html/rfc7396)
- [merge_patch](merge_patch.md) applies a JSON Merge Patch
- [diff](diff.md) creates a diff as a JSON Patch
## Version history
@@ -85,10 +85,9 @@ cost also includes one copy of `apply_patch` (see the notes below).
## See also
- [RFC 7396 (JSON Merge Patch)](https://tools.ietf.org/html/rfc7396) - specification of JSON Merge Patch
- [`patch`](patch.md) - apply a JSON patch
- [`merge_diff`](merge_diff.md) - creates a diff as a JSON Merge Patch
- [JSON Merge Patch](../../features/merge_patch.md) - the article on JSON Merge Patch
- [RFC 7396 (JSON Merge Patch)](https://tools.ietf.org/html/rfc7396)
- [patch](patch.md) apply a JSON patch
- [merge_diff](merge_diff.md) creates a diff as a JSON Merge Patch
## Version history
+2 -5
View File
@@ -48,11 +48,8 @@ Constant.
## See also
- [`NLOHMANN_JSON_VERSION_MAJOR`](../macros/nlohmann_json_version_major.md) /
[`NLOHMANN_JSON_VERSION_MINOR`](../macros/nlohmann_json_version_major.md) /
[`NLOHMANN_JSON_VERSION_PATCH`](../macros/nlohmann_json_version_major.md) - library version information
- [Integration](../../integration/index.md) - integrate the library
- [Supported Macros](../../features/macros.md) - guide to all supported macros
- [**NLOHMANN_JSON_VERSION_MAJOR**/**NLOHMANN_JSON_VERSION_MINOR**/**NLOHMANN_JSON_VERSION_PATCH**](../macros/nlohmann_json_version_major.md)
\- library version information
## Version history
@@ -84,11 +84,10 @@ Floating-point number values are stored directly inside a `basic_json` type.
## See also
- [`number_integer_t`](number_integer_t.md) - the type used to store JSON integer numbers
- [`number_unsigned_t`](number_unsigned_t.md) - the type used to store JSON unsigned integer numbers
- [`is_number_float`](is_number_float.md) - checks whether the JSON value is a floating-point number
- [number_integer_t](number_integer_t.md) the type used to store JSON integer numbers
- [number_unsigned_t](number_unsigned_t.md) the type used to store JSON unsigned integer numbers
- [is_number_float](is_number_float.md) checks whether the JSON value is a floating-point number
- [Number Handling](../../features/types/number_handling.md) - the article on number handling
- [Template Parameter Requirements](../../features/types/template_parameters.md) - requirements on the number template parameters
## Version history
@@ -80,11 +80,10 @@ Integer number values are stored directly inside a `basic_json` type.
## See also
- [`number_unsigned_t`](number_unsigned_t.md) - the type used to store JSON unsigned integer numbers
- [`number_float_t`](number_float_t.md) - the type used to store JSON floating-point numbers
- [`is_number_integer`](is_number_integer.md) - checks whether the JSON value is a signed integer number
- [number_unsigned_t](number_unsigned_t.md) the type used to store JSON unsigned integer numbers
- [number_float_t](number_float_t.md) the type used to store JSON floating-point numbers
- [is_number_integer](is_number_integer.md) checks whether the JSON value is a signed integer number
- [Number Handling](../../features/types/number_handling.md) - the article on number handling
- [Template Parameter Requirements](../../features/types/template_parameters.md) - requirements on the number template parameters
## Version history
@@ -82,11 +82,10 @@ Integer number values are stored directly inside a `basic_json` type.
## See also
- [`number_integer_t`](number_integer_t.md) - the type used to store JSON integer numbers
- [`number_float_t`](number_float_t.md) - the type used to store JSON floating-point numbers
- [`is_number_unsigned`](is_number_unsigned.md) - checks whether the JSON value is an unsigned integer number
- [number_integer_t](number_integer_t.md) the type used to store JSON integer numbers
- [number_float_t](number_float_t.md) the type used to store JSON floating-point numbers
- [is_number_unsigned](is_number_unsigned.md) checks whether the JSON value is an unsigned integer number
- [Number Handling](../../features/types/number_handling.md) - the article on number handling
- [Template Parameter Requirements](../../features/types/template_parameters.md) - requirements on the number template parameters
## Version history
@@ -27,10 +27,8 @@ and [`default_object_comparator_t`](default_object_comparator_t.md) otherwise.
## See also
- [`object_t`](object_t.md) - the type used to store JSON objects
- [`default_object_comparator_t`](default_object_comparator_t.md) - the fallback comparator used when `object_t` has no `key_compare` member type
- [Template Parameter Requirements](../../features/types/template_parameters.md) - requirements on the `ObjectType` template parameter
- [Object order](../../features/object_order.md) - preserve the insertion order of keys
- [object_t](object_t.md) the type used to store JSON objects
- [default_object_comparator_t](default_object_comparator_t.md) the fallback comparator used when `object_t` has no `key_compare` member type
## Version history
+4 -6
View File
@@ -20,7 +20,7 @@ To store objects in C++, a type is defined by the template parameters described
`ObjectType`
: the container to store objects. Its template parameters must have the same order and meaning as those of
`std::map`; in particular, the third parameter is a comparator. `#!cpp std::unordered_map`, whose third parameter
is a hash function, therefore needs an adapter — see
is a hash function, therefore needs an adapter -- see
[Template Parameter Requirements](../../features/types/template_parameters.md#objecttype) for the full list of
requirements, an adapter example, and the containers that are known to work.
@@ -125,12 +125,10 @@ the object is silently converted as an array of key-value pairs, which is incorr
## See also
- [`array_t`](array_t.md) - the type used to store JSON arrays
- [`string_t`](string_t.md) - the type used to store JSON strings
- [`object_comparator_t`](object_comparator_t.md) - the comparator used to order object keys
- [array_t](array_t.md) the type used to store JSON arrays
- [string_t](string_t.md) the type used to store JSON strings
- [object_comparator_t](object_comparator_t.md) the comparator used to order object keys
- [Object Order](../../features/object_order.md) - the article on object key ordering
- [Types](../../features/types/index.md) - how objects are stored
- [Template Parameter Requirements](../../features/types/template_parameters.md) - requirements on the `ObjectType` template parameter
## Version history
@@ -123,9 +123,8 @@ interpreted as `object_t::value_type` or `std::initializer_list<basic_json>`, se
## See also
- [`emplace_back`](emplace_back.md) - add a value to an array
- [`push_back`](push_back.md) - add a value to an array/object
- [Modifying values](../../features/modifying_values.md) - the article on modifying values
- [emplace_back](emplace_back.md) add a value to an array
- [push_back](push_back.md) add a value to an array/object
## Version history
+2 -3
View File
@@ -45,9 +45,8 @@ Linear.
## See also
- [`basic_json`](basic_json.md) - create a JSON value
- [`swap`](swap.md) - exchanges the contents of two JSON values
- [Creating JSON values](../../features/creating_values.md) - ways to create and assign JSON values
- [basic_json](basic_json.md) create a JSON value
- [swap](swap.md) exchanges the contents of two JSON values
## Version history
Loaded 100 of 481 files, more files were not shown because too many files have changed in this diff. Show more