diff --git a/doc/.gitignore b/doc/.gitignore new file mode 100644 index 00000000..34b23da8 --- /dev/null +++ b/doc/.gitignore @@ -0,0 +1,2 @@ +/build/ +/node_modules/ diff --git a/doc/Jamfile.v2 b/doc/Jamfile.v2 index 26bd33ac..0feecab2 100644 --- a/doc/Jamfile.v2 +++ b/doc/Jamfile.v2 @@ -1,21 +1,57 @@ -# Copyright 2005 Daniel James. -# Distributed under the Boost Software License, Version 1.0. (See accompanying -# file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) +import generate ; +import path ; +import property-set ; +import virtual-target ; -import asciidoctor ; +path-constant HERE : . ; -html unordered.html : unordered.adoc ; +make html/index.html : build_antora.sh : @run-script ; +generate files-to-install : html/index.html : @delayed-glob ; +install install + : files-to-install + : html + html/unordered + ; +explicit html/index.html files-to-install ; -install html_ : unordered.html : html ; +# this runs the antora script +actions run-script +{ + bash $(>) +} -pdf unordered.pdf : unordered.adoc ; -explicit unordered.pdf ; +# this globs after its sources are created +rule delayed-glob ( project name : property-set : sources * ) +{ + for local src in $(sources) + { + # the next line causes the source to be generated immediately + # and not later (which it normally would) + UPDATE_NOW [ $(src).actualize ] ; + } -install pdf_ : unordered.pdf : pdf ; -explicit pdf_ ; + # we need to construct the path to the globbed directory; + # this path would be /antora + local root = [ path.root html [ $(project).location ] ] ; + local files ; + + # actual globbing happens here + for local file in [ path.glob-tree $(root) : * ] + { + # we have to skip directories, because our match expression accepts anything + if [ CHECK_IF_FILE $(file) ] + { + # we construct a list of targets to copy + files += [ virtual-target.from-file $(file:D=) : $(file:D) : $(project) ] ; + } + } + + # we prepend empty usage requirements to the result + return [ property-set.empty ] $(files) ; +} ############################################################################### alias boostdoc ; explicit boostdoc ; -alias boostrelease : html_ ; +alias boostrelease : install ; explicit boostrelease ; diff --git a/doc/antora.yml b/doc/antora.yml new file mode 100644 index 00000000..290e0937 --- /dev/null +++ b/doc/antora.yml @@ -0,0 +1,6 @@ +name: unordered +version: ~ +title: Boost.Unordered +nav: + - modules/ROOT/nav.adoc +start_page: intro.adoc diff --git a/doc/antora_docs.sh b/doc/antora_docs.sh new file mode 100755 index 00000000..5fc4a429 --- /dev/null +++ b/doc/antora_docs.sh @@ -0,0 +1,9 @@ +#!/bin/bash + +set -ex + +SCRIPT_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd ) +cd "$SCRIPT_DIR" + +npm ci +npx antora unordered-playbook.yml diff --git a/doc/build_antora.sh b/doc/build_antora.sh new file mode 100755 index 00000000..5fc4a429 --- /dev/null +++ b/doc/build_antora.sh @@ -0,0 +1,9 @@ +#!/bin/bash + +set -ex + +SCRIPT_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd ) +cd "$SCRIPT_DIR" + +npm ci +npx antora unordered-playbook.yml diff --git a/doc/diagrams/benchmarks-concurrent_map/clang-arm64/Parallel workload.xlsx.500k, 0.01.png b/doc/modules/ROOT/images/benchmarks-concurrent_map/clang-arm64/Parallel workload.xlsx.500k, 0.01.png similarity index 100% rename from doc/diagrams/benchmarks-concurrent_map/clang-arm64/Parallel workload.xlsx.500k, 0.01.png rename to doc/modules/ROOT/images/benchmarks-concurrent_map/clang-arm64/Parallel workload.xlsx.500k, 0.01.png diff --git a/doc/diagrams/benchmarks-concurrent_map/clang-arm64/Parallel workload.xlsx.500k, 0.5.png b/doc/modules/ROOT/images/benchmarks-concurrent_map/clang-arm64/Parallel workload.xlsx.500k, 0.5.png similarity index 100% rename from doc/diagrams/benchmarks-concurrent_map/clang-arm64/Parallel workload.xlsx.500k, 0.5.png rename to doc/modules/ROOT/images/benchmarks-concurrent_map/clang-arm64/Parallel workload.xlsx.500k, 0.5.png diff --git a/doc/diagrams/benchmarks-concurrent_map/clang-arm64/Parallel workload.xlsx.500k, 0.99.png b/doc/modules/ROOT/images/benchmarks-concurrent_map/clang-arm64/Parallel workload.xlsx.500k, 0.99.png similarity index 100% rename from doc/diagrams/benchmarks-concurrent_map/clang-arm64/Parallel workload.xlsx.500k, 0.99.png rename to doc/modules/ROOT/images/benchmarks-concurrent_map/clang-arm64/Parallel workload.xlsx.500k, 0.99.png diff --git a/doc/diagrams/benchmarks-concurrent_map/clang-arm64/Parallel workload.xlsx.5M, 0.01.png b/doc/modules/ROOT/images/benchmarks-concurrent_map/clang-arm64/Parallel workload.xlsx.5M, 0.01.png similarity index 100% rename from doc/diagrams/benchmarks-concurrent_map/clang-arm64/Parallel workload.xlsx.5M, 0.01.png rename to doc/modules/ROOT/images/benchmarks-concurrent_map/clang-arm64/Parallel workload.xlsx.5M, 0.01.png diff --git a/doc/diagrams/benchmarks-concurrent_map/clang-arm64/Parallel workload.xlsx.5M, 0.5.png b/doc/modules/ROOT/images/benchmarks-concurrent_map/clang-arm64/Parallel workload.xlsx.5M, 0.5.png similarity index 100% rename from doc/diagrams/benchmarks-concurrent_map/clang-arm64/Parallel workload.xlsx.5M, 0.5.png rename to doc/modules/ROOT/images/benchmarks-concurrent_map/clang-arm64/Parallel workload.xlsx.5M, 0.5.png diff --git a/doc/diagrams/benchmarks-concurrent_map/clang-arm64/Parallel workload.xlsx.5M, 0.99.png b/doc/modules/ROOT/images/benchmarks-concurrent_map/clang-arm64/Parallel workload.xlsx.5M, 0.99.png similarity index 100% rename from doc/diagrams/benchmarks-concurrent_map/clang-arm64/Parallel workload.xlsx.5M, 0.99.png rename to doc/modules/ROOT/images/benchmarks-concurrent_map/clang-arm64/Parallel workload.xlsx.5M, 0.99.png diff --git a/doc/diagrams/benchmarks-concurrent_map/clang-x64/Parallel workload.xlsx.500k, 0.01.png b/doc/modules/ROOT/images/benchmarks-concurrent_map/clang-x64/Parallel workload.xlsx.500k, 0.01.png similarity index 100% rename from doc/diagrams/benchmarks-concurrent_map/clang-x64/Parallel workload.xlsx.500k, 0.01.png rename to doc/modules/ROOT/images/benchmarks-concurrent_map/clang-x64/Parallel workload.xlsx.500k, 0.01.png diff --git a/doc/diagrams/benchmarks-concurrent_map/clang-x64/Parallel workload.xlsx.500k, 0.5.png b/doc/modules/ROOT/images/benchmarks-concurrent_map/clang-x64/Parallel workload.xlsx.500k, 0.5.png similarity index 100% rename from doc/diagrams/benchmarks-concurrent_map/clang-x64/Parallel workload.xlsx.500k, 0.5.png rename to doc/modules/ROOT/images/benchmarks-concurrent_map/clang-x64/Parallel workload.xlsx.500k, 0.5.png diff --git a/doc/diagrams/benchmarks-concurrent_map/clang-x64/Parallel workload.xlsx.500k, 0.99.png b/doc/modules/ROOT/images/benchmarks-concurrent_map/clang-x64/Parallel workload.xlsx.500k, 0.99.png similarity index 100% rename from doc/diagrams/benchmarks-concurrent_map/clang-x64/Parallel workload.xlsx.500k, 0.99.png rename to doc/modules/ROOT/images/benchmarks-concurrent_map/clang-x64/Parallel workload.xlsx.500k, 0.99.png diff --git a/doc/diagrams/benchmarks-concurrent_map/clang-x64/Parallel workload.xlsx.5M, 0.01.png b/doc/modules/ROOT/images/benchmarks-concurrent_map/clang-x64/Parallel workload.xlsx.5M, 0.01.png similarity index 100% rename from doc/diagrams/benchmarks-concurrent_map/clang-x64/Parallel workload.xlsx.5M, 0.01.png rename to doc/modules/ROOT/images/benchmarks-concurrent_map/clang-x64/Parallel workload.xlsx.5M, 0.01.png diff --git a/doc/diagrams/benchmarks-concurrent_map/clang-x64/Parallel workload.xlsx.5M, 0.5.png b/doc/modules/ROOT/images/benchmarks-concurrent_map/clang-x64/Parallel workload.xlsx.5M, 0.5.png similarity index 100% rename from doc/diagrams/benchmarks-concurrent_map/clang-x64/Parallel workload.xlsx.5M, 0.5.png rename to doc/modules/ROOT/images/benchmarks-concurrent_map/clang-x64/Parallel workload.xlsx.5M, 0.5.png diff --git a/doc/diagrams/benchmarks-concurrent_map/clang-x64/Parallel workload.xlsx.5M, 0.99.png b/doc/modules/ROOT/images/benchmarks-concurrent_map/clang-x64/Parallel workload.xlsx.5M, 0.99.png similarity index 100% rename from doc/diagrams/benchmarks-concurrent_map/clang-x64/Parallel workload.xlsx.5M, 0.99.png rename to doc/modules/ROOT/images/benchmarks-concurrent_map/clang-x64/Parallel workload.xlsx.5M, 0.99.png diff --git a/doc/diagrams/benchmarks-concurrent_map/clang-x86/Parallel workload.xlsx.500k, 0.01.png b/doc/modules/ROOT/images/benchmarks-concurrent_map/clang-x86/Parallel workload.xlsx.500k, 0.01.png similarity index 100% rename from doc/diagrams/benchmarks-concurrent_map/clang-x86/Parallel workload.xlsx.500k, 0.01.png rename to doc/modules/ROOT/images/benchmarks-concurrent_map/clang-x86/Parallel workload.xlsx.500k, 0.01.png diff --git a/doc/diagrams/benchmarks-concurrent_map/clang-x86/Parallel workload.xlsx.500k, 0.5.png b/doc/modules/ROOT/images/benchmarks-concurrent_map/clang-x86/Parallel workload.xlsx.500k, 0.5.png similarity index 100% rename from doc/diagrams/benchmarks-concurrent_map/clang-x86/Parallel workload.xlsx.500k, 0.5.png rename to doc/modules/ROOT/images/benchmarks-concurrent_map/clang-x86/Parallel workload.xlsx.500k, 0.5.png diff --git a/doc/diagrams/benchmarks-concurrent_map/clang-x86/Parallel workload.xlsx.500k, 0.99.png b/doc/modules/ROOT/images/benchmarks-concurrent_map/clang-x86/Parallel workload.xlsx.500k, 0.99.png similarity index 100% rename from doc/diagrams/benchmarks-concurrent_map/clang-x86/Parallel workload.xlsx.500k, 0.99.png rename to doc/modules/ROOT/images/benchmarks-concurrent_map/clang-x86/Parallel workload.xlsx.500k, 0.99.png diff --git a/doc/diagrams/benchmarks-concurrent_map/clang-x86/Parallel workload.xlsx.5M, 0.01.png b/doc/modules/ROOT/images/benchmarks-concurrent_map/clang-x86/Parallel workload.xlsx.5M, 0.01.png similarity index 100% rename from doc/diagrams/benchmarks-concurrent_map/clang-x86/Parallel workload.xlsx.5M, 0.01.png rename to doc/modules/ROOT/images/benchmarks-concurrent_map/clang-x86/Parallel workload.xlsx.5M, 0.01.png diff --git a/doc/diagrams/benchmarks-concurrent_map/clang-x86/Parallel workload.xlsx.5M, 0.5.png b/doc/modules/ROOT/images/benchmarks-concurrent_map/clang-x86/Parallel workload.xlsx.5M, 0.5.png similarity index 100% rename from doc/diagrams/benchmarks-concurrent_map/clang-x86/Parallel workload.xlsx.5M, 0.5.png rename to doc/modules/ROOT/images/benchmarks-concurrent_map/clang-x86/Parallel workload.xlsx.5M, 0.5.png diff --git a/doc/diagrams/benchmarks-concurrent_map/clang-x86/Parallel workload.xlsx.5M, 0.99.png b/doc/modules/ROOT/images/benchmarks-concurrent_map/clang-x86/Parallel workload.xlsx.5M, 0.99.png similarity index 100% rename from doc/diagrams/benchmarks-concurrent_map/clang-x86/Parallel workload.xlsx.5M, 0.99.png rename to doc/modules/ROOT/images/benchmarks-concurrent_map/clang-x86/Parallel workload.xlsx.5M, 0.99.png diff --git a/doc/diagrams/benchmarks-concurrent_map/gcc-x64/Parallel workload.xlsx.500k, 0.01.png b/doc/modules/ROOT/images/benchmarks-concurrent_map/gcc-x64/Parallel workload.xlsx.500k, 0.01.png similarity index 100% rename from doc/diagrams/benchmarks-concurrent_map/gcc-x64/Parallel workload.xlsx.500k, 0.01.png rename to doc/modules/ROOT/images/benchmarks-concurrent_map/gcc-x64/Parallel workload.xlsx.500k, 0.01.png diff --git a/doc/diagrams/benchmarks-concurrent_map/gcc-x64/Parallel workload.xlsx.500k, 0.5.png b/doc/modules/ROOT/images/benchmarks-concurrent_map/gcc-x64/Parallel workload.xlsx.500k, 0.5.png similarity index 100% rename from doc/diagrams/benchmarks-concurrent_map/gcc-x64/Parallel workload.xlsx.500k, 0.5.png rename to doc/modules/ROOT/images/benchmarks-concurrent_map/gcc-x64/Parallel workload.xlsx.500k, 0.5.png diff --git a/doc/diagrams/benchmarks-concurrent_map/gcc-x64/Parallel workload.xlsx.500k, 0.99.png b/doc/modules/ROOT/images/benchmarks-concurrent_map/gcc-x64/Parallel workload.xlsx.500k, 0.99.png similarity index 100% rename from doc/diagrams/benchmarks-concurrent_map/gcc-x64/Parallel workload.xlsx.500k, 0.99.png rename to doc/modules/ROOT/images/benchmarks-concurrent_map/gcc-x64/Parallel workload.xlsx.500k, 0.99.png diff --git a/doc/diagrams/benchmarks-concurrent_map/gcc-x64/Parallel workload.xlsx.5M, 0.01.png b/doc/modules/ROOT/images/benchmarks-concurrent_map/gcc-x64/Parallel workload.xlsx.5M, 0.01.png similarity index 100% rename from doc/diagrams/benchmarks-concurrent_map/gcc-x64/Parallel workload.xlsx.5M, 0.01.png rename to doc/modules/ROOT/images/benchmarks-concurrent_map/gcc-x64/Parallel workload.xlsx.5M, 0.01.png diff --git a/doc/diagrams/benchmarks-concurrent_map/gcc-x64/Parallel workload.xlsx.5M, 0.5.png b/doc/modules/ROOT/images/benchmarks-concurrent_map/gcc-x64/Parallel workload.xlsx.5M, 0.5.png similarity index 100% rename from doc/diagrams/benchmarks-concurrent_map/gcc-x64/Parallel workload.xlsx.5M, 0.5.png rename to doc/modules/ROOT/images/benchmarks-concurrent_map/gcc-x64/Parallel workload.xlsx.5M, 0.5.png diff --git a/doc/diagrams/benchmarks-concurrent_map/gcc-x64/Parallel workload.xlsx.5M, 0.99.png b/doc/modules/ROOT/images/benchmarks-concurrent_map/gcc-x64/Parallel workload.xlsx.5M, 0.99.png similarity index 100% rename from doc/diagrams/benchmarks-concurrent_map/gcc-x64/Parallel workload.xlsx.5M, 0.99.png rename to doc/modules/ROOT/images/benchmarks-concurrent_map/gcc-x64/Parallel workload.xlsx.5M, 0.99.png diff --git a/doc/diagrams/benchmarks-concurrent_map/gcc-x86/Parallel workload.xlsx.500k, 0.01.png b/doc/modules/ROOT/images/benchmarks-concurrent_map/gcc-x86/Parallel workload.xlsx.500k, 0.01.png similarity index 100% rename from doc/diagrams/benchmarks-concurrent_map/gcc-x86/Parallel workload.xlsx.500k, 0.01.png rename to doc/modules/ROOT/images/benchmarks-concurrent_map/gcc-x86/Parallel workload.xlsx.500k, 0.01.png diff --git a/doc/diagrams/benchmarks-concurrent_map/gcc-x86/Parallel workload.xlsx.500k, 0.5.png b/doc/modules/ROOT/images/benchmarks-concurrent_map/gcc-x86/Parallel workload.xlsx.500k, 0.5.png similarity index 100% rename from doc/diagrams/benchmarks-concurrent_map/gcc-x86/Parallel workload.xlsx.500k, 0.5.png rename to doc/modules/ROOT/images/benchmarks-concurrent_map/gcc-x86/Parallel workload.xlsx.500k, 0.5.png diff --git a/doc/diagrams/benchmarks-concurrent_map/gcc-x86/Parallel workload.xlsx.500k, 0.99.png b/doc/modules/ROOT/images/benchmarks-concurrent_map/gcc-x86/Parallel workload.xlsx.500k, 0.99.png similarity index 100% rename from doc/diagrams/benchmarks-concurrent_map/gcc-x86/Parallel workload.xlsx.500k, 0.99.png rename to doc/modules/ROOT/images/benchmarks-concurrent_map/gcc-x86/Parallel workload.xlsx.500k, 0.99.png diff --git a/doc/diagrams/benchmarks-concurrent_map/gcc-x86/Parallel workload.xlsx.5M, 0.01.png b/doc/modules/ROOT/images/benchmarks-concurrent_map/gcc-x86/Parallel workload.xlsx.5M, 0.01.png similarity index 100% rename from doc/diagrams/benchmarks-concurrent_map/gcc-x86/Parallel workload.xlsx.5M, 0.01.png rename to doc/modules/ROOT/images/benchmarks-concurrent_map/gcc-x86/Parallel workload.xlsx.5M, 0.01.png diff --git a/doc/diagrams/benchmarks-concurrent_map/gcc-x86/Parallel workload.xlsx.5M, 0.5.png b/doc/modules/ROOT/images/benchmarks-concurrent_map/gcc-x86/Parallel workload.xlsx.5M, 0.5.png similarity index 100% rename from doc/diagrams/benchmarks-concurrent_map/gcc-x86/Parallel workload.xlsx.5M, 0.5.png rename to doc/modules/ROOT/images/benchmarks-concurrent_map/gcc-x86/Parallel workload.xlsx.5M, 0.5.png diff --git a/doc/diagrams/benchmarks-concurrent_map/gcc-x86/Parallel workload.xlsx.5M, 0.99.png b/doc/modules/ROOT/images/benchmarks-concurrent_map/gcc-x86/Parallel workload.xlsx.5M, 0.99.png similarity index 100% rename from doc/diagrams/benchmarks-concurrent_map/gcc-x86/Parallel workload.xlsx.5M, 0.99.png rename to doc/modules/ROOT/images/benchmarks-concurrent_map/gcc-x86/Parallel workload.xlsx.5M, 0.99.png diff --git a/doc/diagrams/benchmarks-concurrent_map/vs-x64/Parallel workload.xlsx.500k, 0.01.png b/doc/modules/ROOT/images/benchmarks-concurrent_map/vs-x64/Parallel workload.xlsx.500k, 0.01.png similarity index 100% rename from doc/diagrams/benchmarks-concurrent_map/vs-x64/Parallel workload.xlsx.500k, 0.01.png rename to doc/modules/ROOT/images/benchmarks-concurrent_map/vs-x64/Parallel workload.xlsx.500k, 0.01.png diff --git a/doc/diagrams/benchmarks-concurrent_map/vs-x64/Parallel workload.xlsx.500k, 0.5.png b/doc/modules/ROOT/images/benchmarks-concurrent_map/vs-x64/Parallel workload.xlsx.500k, 0.5.png similarity index 100% rename from doc/diagrams/benchmarks-concurrent_map/vs-x64/Parallel workload.xlsx.500k, 0.5.png rename to doc/modules/ROOT/images/benchmarks-concurrent_map/vs-x64/Parallel workload.xlsx.500k, 0.5.png diff --git a/doc/diagrams/benchmarks-concurrent_map/vs-x64/Parallel workload.xlsx.500k, 0.99.png b/doc/modules/ROOT/images/benchmarks-concurrent_map/vs-x64/Parallel workload.xlsx.500k, 0.99.png similarity index 100% rename from doc/diagrams/benchmarks-concurrent_map/vs-x64/Parallel workload.xlsx.500k, 0.99.png rename to doc/modules/ROOT/images/benchmarks-concurrent_map/vs-x64/Parallel workload.xlsx.500k, 0.99.png diff --git a/doc/diagrams/benchmarks-concurrent_map/vs-x64/Parallel workload.xlsx.5M, 0.01.png b/doc/modules/ROOT/images/benchmarks-concurrent_map/vs-x64/Parallel workload.xlsx.5M, 0.01.png similarity index 100% rename from doc/diagrams/benchmarks-concurrent_map/vs-x64/Parallel workload.xlsx.5M, 0.01.png rename to doc/modules/ROOT/images/benchmarks-concurrent_map/vs-x64/Parallel workload.xlsx.5M, 0.01.png diff --git a/doc/diagrams/benchmarks-concurrent_map/vs-x64/Parallel workload.xlsx.5M, 0.5.png b/doc/modules/ROOT/images/benchmarks-concurrent_map/vs-x64/Parallel workload.xlsx.5M, 0.5.png similarity index 100% rename from doc/diagrams/benchmarks-concurrent_map/vs-x64/Parallel workload.xlsx.5M, 0.5.png rename to doc/modules/ROOT/images/benchmarks-concurrent_map/vs-x64/Parallel workload.xlsx.5M, 0.5.png diff --git a/doc/diagrams/benchmarks-concurrent_map/vs-x64/Parallel workload.xlsx.5M, 0.99.png b/doc/modules/ROOT/images/benchmarks-concurrent_map/vs-x64/Parallel workload.xlsx.5M, 0.99.png similarity index 100% rename from doc/diagrams/benchmarks-concurrent_map/vs-x64/Parallel workload.xlsx.5M, 0.99.png rename to doc/modules/ROOT/images/benchmarks-concurrent_map/vs-x64/Parallel workload.xlsx.5M, 0.99.png diff --git a/doc/diagrams/benchmarks-concurrent_map/vs-x86/Parallel workload.xlsx.500k, 0.01.png b/doc/modules/ROOT/images/benchmarks-concurrent_map/vs-x86/Parallel workload.xlsx.500k, 0.01.png similarity index 100% rename from doc/diagrams/benchmarks-concurrent_map/vs-x86/Parallel workload.xlsx.500k, 0.01.png rename to doc/modules/ROOT/images/benchmarks-concurrent_map/vs-x86/Parallel workload.xlsx.500k, 0.01.png diff --git a/doc/diagrams/benchmarks-concurrent_map/vs-x86/Parallel workload.xlsx.500k, 0.5.png b/doc/modules/ROOT/images/benchmarks-concurrent_map/vs-x86/Parallel workload.xlsx.500k, 0.5.png similarity index 100% rename from doc/diagrams/benchmarks-concurrent_map/vs-x86/Parallel workload.xlsx.500k, 0.5.png rename to doc/modules/ROOT/images/benchmarks-concurrent_map/vs-x86/Parallel workload.xlsx.500k, 0.5.png diff --git a/doc/diagrams/benchmarks-concurrent_map/vs-x86/Parallel workload.xlsx.500k, 0.99.png b/doc/modules/ROOT/images/benchmarks-concurrent_map/vs-x86/Parallel workload.xlsx.500k, 0.99.png similarity index 100% rename from doc/diagrams/benchmarks-concurrent_map/vs-x86/Parallel workload.xlsx.500k, 0.99.png rename to doc/modules/ROOT/images/benchmarks-concurrent_map/vs-x86/Parallel workload.xlsx.500k, 0.99.png diff --git a/doc/diagrams/benchmarks-concurrent_map/vs-x86/Parallel workload.xlsx.5M, 0.01.png b/doc/modules/ROOT/images/benchmarks-concurrent_map/vs-x86/Parallel workload.xlsx.5M, 0.01.png similarity index 100% rename from doc/diagrams/benchmarks-concurrent_map/vs-x86/Parallel workload.xlsx.5M, 0.01.png rename to doc/modules/ROOT/images/benchmarks-concurrent_map/vs-x86/Parallel workload.xlsx.5M, 0.01.png diff --git a/doc/diagrams/benchmarks-concurrent_map/vs-x86/Parallel workload.xlsx.5M, 0.5.png b/doc/modules/ROOT/images/benchmarks-concurrent_map/vs-x86/Parallel workload.xlsx.5M, 0.5.png similarity index 100% rename from doc/diagrams/benchmarks-concurrent_map/vs-x86/Parallel workload.xlsx.5M, 0.5.png rename to doc/modules/ROOT/images/benchmarks-concurrent_map/vs-x86/Parallel workload.xlsx.5M, 0.5.png diff --git a/doc/diagrams/benchmarks-concurrent_map/vs-x86/Parallel workload.xlsx.5M, 0.99.png b/doc/modules/ROOT/images/benchmarks-concurrent_map/vs-x86/Parallel workload.xlsx.5M, 0.99.png similarity index 100% rename from doc/diagrams/benchmarks-concurrent_map/vs-x86/Parallel workload.xlsx.5M, 0.99.png rename to doc/modules/ROOT/images/benchmarks-concurrent_map/vs-x86/Parallel workload.xlsx.5M, 0.99.png diff --git a/doc/diagrams/benchmarks-flat_map/clang-arm64/Running erasure.xlsx.plot.png b/doc/modules/ROOT/images/benchmarks-flat_map/clang-arm64/Running erasure.xlsx.plot.png similarity index 100% rename from doc/diagrams/benchmarks-flat_map/clang-arm64/Running erasure.xlsx.plot.png rename to doc/modules/ROOT/images/benchmarks-flat_map/clang-arm64/Running erasure.xlsx.plot.png diff --git a/doc/diagrams/benchmarks-flat_map/clang-arm64/Running insertion.xlsx.plot.png b/doc/modules/ROOT/images/benchmarks-flat_map/clang-arm64/Running insertion.xlsx.plot.png similarity index 100% rename from doc/diagrams/benchmarks-flat_map/clang-arm64/Running insertion.xlsx.plot.png rename to doc/modules/ROOT/images/benchmarks-flat_map/clang-arm64/Running insertion.xlsx.plot.png diff --git a/doc/diagrams/benchmarks-flat_map/clang-arm64/Scattered successful looukp.xlsx.plot.png b/doc/modules/ROOT/images/benchmarks-flat_map/clang-arm64/Scattered successful looukp.xlsx.plot.png similarity index 100% rename from doc/diagrams/benchmarks-flat_map/clang-arm64/Scattered successful looukp.xlsx.plot.png rename to doc/modules/ROOT/images/benchmarks-flat_map/clang-arm64/Scattered successful looukp.xlsx.plot.png diff --git a/doc/diagrams/benchmarks-flat_map/clang-arm64/Scattered unsuccessful looukp.xlsx.plot.png b/doc/modules/ROOT/images/benchmarks-flat_map/clang-arm64/Scattered unsuccessful looukp.xlsx.plot.png similarity index 100% rename from doc/diagrams/benchmarks-flat_map/clang-arm64/Scattered unsuccessful looukp.xlsx.plot.png rename to doc/modules/ROOT/images/benchmarks-flat_map/clang-arm64/Scattered unsuccessful looukp.xlsx.plot.png diff --git a/doc/diagrams/benchmarks-flat_map/clang-x64/Running erasure.xlsx.plot.png b/doc/modules/ROOT/images/benchmarks-flat_map/clang-x64/Running erasure.xlsx.plot.png similarity index 100% rename from doc/diagrams/benchmarks-flat_map/clang-x64/Running erasure.xlsx.plot.png rename to doc/modules/ROOT/images/benchmarks-flat_map/clang-x64/Running erasure.xlsx.plot.png diff --git a/doc/diagrams/benchmarks-flat_map/clang-x64/Running insertion.xlsx.plot.png b/doc/modules/ROOT/images/benchmarks-flat_map/clang-x64/Running insertion.xlsx.plot.png similarity index 100% rename from doc/diagrams/benchmarks-flat_map/clang-x64/Running insertion.xlsx.plot.png rename to doc/modules/ROOT/images/benchmarks-flat_map/clang-x64/Running insertion.xlsx.plot.png diff --git a/doc/diagrams/benchmarks-flat_map/clang-x64/Scattered successful looukp.xlsx.plot.png b/doc/modules/ROOT/images/benchmarks-flat_map/clang-x64/Scattered successful looukp.xlsx.plot.png similarity index 100% rename from doc/diagrams/benchmarks-flat_map/clang-x64/Scattered successful looukp.xlsx.plot.png rename to doc/modules/ROOT/images/benchmarks-flat_map/clang-x64/Scattered successful looukp.xlsx.plot.png diff --git a/doc/diagrams/benchmarks-flat_map/clang-x64/Scattered unsuccessful looukp.xlsx.plot.png b/doc/modules/ROOT/images/benchmarks-flat_map/clang-x64/Scattered unsuccessful looukp.xlsx.plot.png similarity index 100% rename from doc/diagrams/benchmarks-flat_map/clang-x64/Scattered unsuccessful looukp.xlsx.plot.png rename to doc/modules/ROOT/images/benchmarks-flat_map/clang-x64/Scattered unsuccessful looukp.xlsx.plot.png diff --git a/doc/diagrams/benchmarks-flat_map/clang-x86/Running erasure.xlsx.plot.png b/doc/modules/ROOT/images/benchmarks-flat_map/clang-x86/Running erasure.xlsx.plot.png similarity index 100% rename from doc/diagrams/benchmarks-flat_map/clang-x86/Running erasure.xlsx.plot.png rename to doc/modules/ROOT/images/benchmarks-flat_map/clang-x86/Running erasure.xlsx.plot.png diff --git a/doc/diagrams/benchmarks-flat_map/clang-x86/Running insertion.xlsx.plot.png b/doc/modules/ROOT/images/benchmarks-flat_map/clang-x86/Running insertion.xlsx.plot.png similarity index 100% rename from doc/diagrams/benchmarks-flat_map/clang-x86/Running insertion.xlsx.plot.png rename to doc/modules/ROOT/images/benchmarks-flat_map/clang-x86/Running insertion.xlsx.plot.png diff --git a/doc/diagrams/benchmarks-flat_map/clang-x86/Scattered successful looukp.xlsx.plot.png b/doc/modules/ROOT/images/benchmarks-flat_map/clang-x86/Scattered successful looukp.xlsx.plot.png similarity index 100% rename from doc/diagrams/benchmarks-flat_map/clang-x86/Scattered successful looukp.xlsx.plot.png rename to doc/modules/ROOT/images/benchmarks-flat_map/clang-x86/Scattered successful looukp.xlsx.plot.png diff --git a/doc/diagrams/benchmarks-flat_map/clang-x86/Scattered unsuccessful looukp.xlsx.plot.png b/doc/modules/ROOT/images/benchmarks-flat_map/clang-x86/Scattered unsuccessful looukp.xlsx.plot.png similarity index 100% rename from doc/diagrams/benchmarks-flat_map/clang-x86/Scattered unsuccessful looukp.xlsx.plot.png rename to doc/modules/ROOT/images/benchmarks-flat_map/clang-x86/Scattered unsuccessful looukp.xlsx.plot.png diff --git a/doc/diagrams/benchmarks-flat_map/gcc-x64/Running erasure.xlsx.plot.png b/doc/modules/ROOT/images/benchmarks-flat_map/gcc-x64/Running erasure.xlsx.plot.png similarity index 100% rename from doc/diagrams/benchmarks-flat_map/gcc-x64/Running erasure.xlsx.plot.png rename to doc/modules/ROOT/images/benchmarks-flat_map/gcc-x64/Running erasure.xlsx.plot.png diff --git a/doc/diagrams/benchmarks-flat_map/gcc-x64/Running insertion.xlsx.plot.png b/doc/modules/ROOT/images/benchmarks-flat_map/gcc-x64/Running insertion.xlsx.plot.png similarity index 100% rename from doc/diagrams/benchmarks-flat_map/gcc-x64/Running insertion.xlsx.plot.png rename to doc/modules/ROOT/images/benchmarks-flat_map/gcc-x64/Running insertion.xlsx.plot.png diff --git a/doc/diagrams/benchmarks-flat_map/gcc-x64/Scattered successful looukp.xlsx.plot.png b/doc/modules/ROOT/images/benchmarks-flat_map/gcc-x64/Scattered successful looukp.xlsx.plot.png similarity index 100% rename from doc/diagrams/benchmarks-flat_map/gcc-x64/Scattered successful looukp.xlsx.plot.png rename to doc/modules/ROOT/images/benchmarks-flat_map/gcc-x64/Scattered successful looukp.xlsx.plot.png diff --git a/doc/diagrams/benchmarks-flat_map/gcc-x64/Scattered unsuccessful looukp.xlsx.plot.png b/doc/modules/ROOT/images/benchmarks-flat_map/gcc-x64/Scattered unsuccessful looukp.xlsx.plot.png similarity index 100% rename from doc/diagrams/benchmarks-flat_map/gcc-x64/Scattered unsuccessful looukp.xlsx.plot.png rename to doc/modules/ROOT/images/benchmarks-flat_map/gcc-x64/Scattered unsuccessful looukp.xlsx.plot.png diff --git a/doc/diagrams/benchmarks-flat_map/gcc-x86/Running erasure.xlsx.plot.png b/doc/modules/ROOT/images/benchmarks-flat_map/gcc-x86/Running erasure.xlsx.plot.png similarity index 100% rename from doc/diagrams/benchmarks-flat_map/gcc-x86/Running erasure.xlsx.plot.png rename to doc/modules/ROOT/images/benchmarks-flat_map/gcc-x86/Running erasure.xlsx.plot.png diff --git a/doc/diagrams/benchmarks-flat_map/gcc-x86/Running insertion.xlsx.plot.png b/doc/modules/ROOT/images/benchmarks-flat_map/gcc-x86/Running insertion.xlsx.plot.png similarity index 100% rename from doc/diagrams/benchmarks-flat_map/gcc-x86/Running insertion.xlsx.plot.png rename to doc/modules/ROOT/images/benchmarks-flat_map/gcc-x86/Running insertion.xlsx.plot.png diff --git a/doc/diagrams/benchmarks-flat_map/gcc-x86/Scattered successful looukp.xlsx.plot.png b/doc/modules/ROOT/images/benchmarks-flat_map/gcc-x86/Scattered successful looukp.xlsx.plot.png similarity index 100% rename from doc/diagrams/benchmarks-flat_map/gcc-x86/Scattered successful looukp.xlsx.plot.png rename to doc/modules/ROOT/images/benchmarks-flat_map/gcc-x86/Scattered successful looukp.xlsx.plot.png diff --git a/doc/diagrams/benchmarks-flat_map/gcc-x86/Scattered unsuccessful looukp.xlsx.plot.png b/doc/modules/ROOT/images/benchmarks-flat_map/gcc-x86/Scattered unsuccessful looukp.xlsx.plot.png similarity index 100% rename from doc/diagrams/benchmarks-flat_map/gcc-x86/Scattered unsuccessful looukp.xlsx.plot.png rename to doc/modules/ROOT/images/benchmarks-flat_map/gcc-x86/Scattered unsuccessful looukp.xlsx.plot.png diff --git a/doc/diagrams/benchmarks-flat_map/vs-x64/Running erasure.xlsx.plot.png b/doc/modules/ROOT/images/benchmarks-flat_map/vs-x64/Running erasure.xlsx.plot.png similarity index 100% rename from doc/diagrams/benchmarks-flat_map/vs-x64/Running erasure.xlsx.plot.png rename to doc/modules/ROOT/images/benchmarks-flat_map/vs-x64/Running erasure.xlsx.plot.png diff --git a/doc/diagrams/benchmarks-flat_map/vs-x64/Running insertion.xlsx.plot.png b/doc/modules/ROOT/images/benchmarks-flat_map/vs-x64/Running insertion.xlsx.plot.png similarity index 100% rename from doc/diagrams/benchmarks-flat_map/vs-x64/Running insertion.xlsx.plot.png rename to doc/modules/ROOT/images/benchmarks-flat_map/vs-x64/Running insertion.xlsx.plot.png diff --git a/doc/diagrams/benchmarks-flat_map/vs-x64/Scattered successful looukp.xlsx.plot.png b/doc/modules/ROOT/images/benchmarks-flat_map/vs-x64/Scattered successful looukp.xlsx.plot.png similarity index 100% rename from doc/diagrams/benchmarks-flat_map/vs-x64/Scattered successful looukp.xlsx.plot.png rename to doc/modules/ROOT/images/benchmarks-flat_map/vs-x64/Scattered successful looukp.xlsx.plot.png diff --git a/doc/diagrams/benchmarks-flat_map/vs-x64/Scattered unsuccessful looukp.xlsx.plot.png b/doc/modules/ROOT/images/benchmarks-flat_map/vs-x64/Scattered unsuccessful looukp.xlsx.plot.png similarity index 100% rename from doc/diagrams/benchmarks-flat_map/vs-x64/Scattered unsuccessful looukp.xlsx.plot.png rename to doc/modules/ROOT/images/benchmarks-flat_map/vs-x64/Scattered unsuccessful looukp.xlsx.plot.png diff --git a/doc/diagrams/benchmarks-flat_map/vs-x86/Running erasure.xlsx.plot.png b/doc/modules/ROOT/images/benchmarks-flat_map/vs-x86/Running erasure.xlsx.plot.png similarity index 100% rename from doc/diagrams/benchmarks-flat_map/vs-x86/Running erasure.xlsx.plot.png rename to doc/modules/ROOT/images/benchmarks-flat_map/vs-x86/Running erasure.xlsx.plot.png diff --git a/doc/diagrams/benchmarks-flat_map/vs-x86/Running insertion.xlsx.plot.png b/doc/modules/ROOT/images/benchmarks-flat_map/vs-x86/Running insertion.xlsx.plot.png similarity index 100% rename from doc/diagrams/benchmarks-flat_map/vs-x86/Running insertion.xlsx.plot.png rename to doc/modules/ROOT/images/benchmarks-flat_map/vs-x86/Running insertion.xlsx.plot.png diff --git a/doc/diagrams/benchmarks-flat_map/vs-x86/Scattered successful looukp.xlsx.plot.png b/doc/modules/ROOT/images/benchmarks-flat_map/vs-x86/Scattered successful looukp.xlsx.plot.png similarity index 100% rename from doc/diagrams/benchmarks-flat_map/vs-x86/Scattered successful looukp.xlsx.plot.png rename to doc/modules/ROOT/images/benchmarks-flat_map/vs-x86/Scattered successful looukp.xlsx.plot.png diff --git a/doc/diagrams/benchmarks-flat_map/vs-x86/Scattered unsuccessful looukp.xlsx.plot.png b/doc/modules/ROOT/images/benchmarks-flat_map/vs-x86/Scattered unsuccessful looukp.xlsx.plot.png similarity index 100% rename from doc/diagrams/benchmarks-flat_map/vs-x86/Scattered unsuccessful looukp.xlsx.plot.png rename to doc/modules/ROOT/images/benchmarks-flat_map/vs-x86/Scattered unsuccessful looukp.xlsx.plot.png diff --git a/doc/diagrams/benchmarks-set/clang_libcpp/running insertion.xlsx.practice non-unique 5.png b/doc/modules/ROOT/images/benchmarks-set/clang_libcpp/running insertion.xlsx.practice non-unique 5.png similarity index 100% rename from doc/diagrams/benchmarks-set/clang_libcpp/running insertion.xlsx.practice non-unique 5.png rename to doc/modules/ROOT/images/benchmarks-set/clang_libcpp/running insertion.xlsx.practice non-unique 5.png diff --git a/doc/diagrams/benchmarks-set/clang_libcpp/running insertion.xlsx.practice non-unique.png b/doc/modules/ROOT/images/benchmarks-set/clang_libcpp/running insertion.xlsx.practice non-unique.png similarity index 100% rename from doc/diagrams/benchmarks-set/clang_libcpp/running insertion.xlsx.practice non-unique.png rename to doc/modules/ROOT/images/benchmarks-set/clang_libcpp/running insertion.xlsx.practice non-unique.png diff --git a/doc/diagrams/benchmarks-set/clang_libcpp/running insertion.xlsx.practice norehash non-unique 5.png b/doc/modules/ROOT/images/benchmarks-set/clang_libcpp/running insertion.xlsx.practice norehash non-unique 5.png similarity index 100% rename from doc/diagrams/benchmarks-set/clang_libcpp/running insertion.xlsx.practice norehash non-unique 5.png rename to doc/modules/ROOT/images/benchmarks-set/clang_libcpp/running insertion.xlsx.practice norehash non-unique 5.png diff --git a/doc/diagrams/benchmarks-set/clang_libcpp/running insertion.xlsx.practice norehash non-unique.png b/doc/modules/ROOT/images/benchmarks-set/clang_libcpp/running insertion.xlsx.practice norehash non-unique.png similarity index 100% rename from doc/diagrams/benchmarks-set/clang_libcpp/running insertion.xlsx.practice norehash non-unique.png rename to doc/modules/ROOT/images/benchmarks-set/clang_libcpp/running insertion.xlsx.practice norehash non-unique.png diff --git a/doc/diagrams/benchmarks-set/clang_libcpp/running insertion.xlsx.practice norehash.png b/doc/modules/ROOT/images/benchmarks-set/clang_libcpp/running insertion.xlsx.practice norehash.png similarity index 100% rename from doc/diagrams/benchmarks-set/clang_libcpp/running insertion.xlsx.practice norehash.png rename to doc/modules/ROOT/images/benchmarks-set/clang_libcpp/running insertion.xlsx.practice norehash.png diff --git a/doc/diagrams/benchmarks-set/clang_libcpp/running insertion.xlsx.practice.png b/doc/modules/ROOT/images/benchmarks-set/clang_libcpp/running insertion.xlsx.practice.png similarity index 100% rename from doc/diagrams/benchmarks-set/clang_libcpp/running insertion.xlsx.practice.png rename to doc/modules/ROOT/images/benchmarks-set/clang_libcpp/running insertion.xlsx.practice.png diff --git a/doc/diagrams/benchmarks-set/clang_libcpp/scattered erasure by key.xlsx.practice non-unique 5.png b/doc/modules/ROOT/images/benchmarks-set/clang_libcpp/scattered erasure by key.xlsx.practice non-unique 5.png similarity index 100% rename from doc/diagrams/benchmarks-set/clang_libcpp/scattered erasure by key.xlsx.practice non-unique 5.png rename to doc/modules/ROOT/images/benchmarks-set/clang_libcpp/scattered erasure by key.xlsx.practice non-unique 5.png diff --git a/doc/diagrams/benchmarks-set/clang_libcpp/scattered erasure by key.xlsx.practice non-unique.png b/doc/modules/ROOT/images/benchmarks-set/clang_libcpp/scattered erasure by key.xlsx.practice non-unique.png similarity index 100% rename from doc/diagrams/benchmarks-set/clang_libcpp/scattered erasure by key.xlsx.practice non-unique.png rename to doc/modules/ROOT/images/benchmarks-set/clang_libcpp/scattered erasure by key.xlsx.practice non-unique.png diff --git a/doc/diagrams/benchmarks-set/clang_libcpp/scattered erasure.xlsx.practice non-unique 5.png b/doc/modules/ROOT/images/benchmarks-set/clang_libcpp/scattered erasure.xlsx.practice non-unique 5.png similarity index 100% rename from doc/diagrams/benchmarks-set/clang_libcpp/scattered erasure.xlsx.practice non-unique 5.png rename to doc/modules/ROOT/images/benchmarks-set/clang_libcpp/scattered erasure.xlsx.practice non-unique 5.png diff --git a/doc/diagrams/benchmarks-set/clang_libcpp/scattered erasure.xlsx.practice non-unique.png b/doc/modules/ROOT/images/benchmarks-set/clang_libcpp/scattered erasure.xlsx.practice non-unique.png similarity index 100% rename from doc/diagrams/benchmarks-set/clang_libcpp/scattered erasure.xlsx.practice non-unique.png rename to doc/modules/ROOT/images/benchmarks-set/clang_libcpp/scattered erasure.xlsx.practice non-unique.png diff --git a/doc/diagrams/benchmarks-set/clang_libcpp/scattered erasure.xlsx.practice.png b/doc/modules/ROOT/images/benchmarks-set/clang_libcpp/scattered erasure.xlsx.practice.png similarity index 100% rename from doc/diagrams/benchmarks-set/clang_libcpp/scattered erasure.xlsx.practice.png rename to doc/modules/ROOT/images/benchmarks-set/clang_libcpp/scattered erasure.xlsx.practice.png diff --git a/doc/diagrams/benchmarks-set/clang_libcpp/scattered successful looukp.xlsx.practice non-unique 5.png b/doc/modules/ROOT/images/benchmarks-set/clang_libcpp/scattered successful looukp.xlsx.practice non-unique 5.png similarity index 100% rename from doc/diagrams/benchmarks-set/clang_libcpp/scattered successful looukp.xlsx.practice non-unique 5.png rename to doc/modules/ROOT/images/benchmarks-set/clang_libcpp/scattered successful looukp.xlsx.practice non-unique 5.png diff --git a/doc/diagrams/benchmarks-set/clang_libcpp/scattered successful looukp.xlsx.practice non-unique.png b/doc/modules/ROOT/images/benchmarks-set/clang_libcpp/scattered successful looukp.xlsx.practice non-unique.png similarity index 100% rename from doc/diagrams/benchmarks-set/clang_libcpp/scattered successful looukp.xlsx.practice non-unique.png rename to doc/modules/ROOT/images/benchmarks-set/clang_libcpp/scattered successful looukp.xlsx.practice non-unique.png diff --git a/doc/diagrams/benchmarks-set/clang_libcpp/scattered successful looukp.xlsx.practice.png b/doc/modules/ROOT/images/benchmarks-set/clang_libcpp/scattered successful looukp.xlsx.practice.png similarity index 100% rename from doc/diagrams/benchmarks-set/clang_libcpp/scattered successful looukp.xlsx.practice.png rename to doc/modules/ROOT/images/benchmarks-set/clang_libcpp/scattered successful looukp.xlsx.practice.png diff --git a/doc/diagrams/benchmarks-set/clang_libcpp/scattered unsuccessful looukp.xlsx.practice non-unique 5.png b/doc/modules/ROOT/images/benchmarks-set/clang_libcpp/scattered unsuccessful looukp.xlsx.practice non-unique 5.png similarity index 100% rename from doc/diagrams/benchmarks-set/clang_libcpp/scattered unsuccessful looukp.xlsx.practice non-unique 5.png rename to doc/modules/ROOT/images/benchmarks-set/clang_libcpp/scattered unsuccessful looukp.xlsx.practice non-unique 5.png diff --git a/doc/diagrams/benchmarks-set/clang_libcpp/scattered unsuccessful looukp.xlsx.practice non-unique.png b/doc/modules/ROOT/images/benchmarks-set/clang_libcpp/scattered unsuccessful looukp.xlsx.practice non-unique.png similarity index 100% rename from doc/diagrams/benchmarks-set/clang_libcpp/scattered unsuccessful looukp.xlsx.practice non-unique.png rename to doc/modules/ROOT/images/benchmarks-set/clang_libcpp/scattered unsuccessful looukp.xlsx.practice non-unique.png diff --git a/doc/diagrams/benchmarks-set/clang_libcpp/scattered unsuccessful looukp.xlsx.practice.png b/doc/modules/ROOT/images/benchmarks-set/clang_libcpp/scattered unsuccessful looukp.xlsx.practice.png similarity index 100% rename from doc/diagrams/benchmarks-set/clang_libcpp/scattered unsuccessful looukp.xlsx.practice.png rename to doc/modules/ROOT/images/benchmarks-set/clang_libcpp/scattered unsuccessful looukp.xlsx.practice.png diff --git a/doc/diagrams/benchmarks-set/gcc/running insertion.xlsx.practice non-unique 5.png b/doc/modules/ROOT/images/benchmarks-set/gcc/running insertion.xlsx.practice non-unique 5.png similarity index 100% rename from doc/diagrams/benchmarks-set/gcc/running insertion.xlsx.practice non-unique 5.png rename to doc/modules/ROOT/images/benchmarks-set/gcc/running insertion.xlsx.practice non-unique 5.png diff --git a/doc/diagrams/benchmarks-set/gcc/running insertion.xlsx.practice non-unique.png b/doc/modules/ROOT/images/benchmarks-set/gcc/running insertion.xlsx.practice non-unique.png similarity index 100% rename from doc/diagrams/benchmarks-set/gcc/running insertion.xlsx.practice non-unique.png rename to doc/modules/ROOT/images/benchmarks-set/gcc/running insertion.xlsx.practice non-unique.png diff --git a/doc/diagrams/benchmarks-set/gcc/running insertion.xlsx.practice norehash non-unique 5.png b/doc/modules/ROOT/images/benchmarks-set/gcc/running insertion.xlsx.practice norehash non-unique 5.png similarity index 100% rename from doc/diagrams/benchmarks-set/gcc/running insertion.xlsx.practice norehash non-unique 5.png rename to doc/modules/ROOT/images/benchmarks-set/gcc/running insertion.xlsx.practice norehash non-unique 5.png diff --git a/doc/diagrams/benchmarks-set/gcc/running insertion.xlsx.practice norehash non-unique.png b/doc/modules/ROOT/images/benchmarks-set/gcc/running insertion.xlsx.practice norehash non-unique.png similarity index 100% rename from doc/diagrams/benchmarks-set/gcc/running insertion.xlsx.practice norehash non-unique.png rename to doc/modules/ROOT/images/benchmarks-set/gcc/running insertion.xlsx.practice norehash non-unique.png diff --git a/doc/diagrams/benchmarks-set/gcc/running insertion.xlsx.practice norehash.png b/doc/modules/ROOT/images/benchmarks-set/gcc/running insertion.xlsx.practice norehash.png similarity index 100% rename from doc/diagrams/benchmarks-set/gcc/running insertion.xlsx.practice norehash.png rename to doc/modules/ROOT/images/benchmarks-set/gcc/running insertion.xlsx.practice norehash.png diff --git a/doc/diagrams/benchmarks-set/gcc/running insertion.xlsx.practice.png b/doc/modules/ROOT/images/benchmarks-set/gcc/running insertion.xlsx.practice.png similarity index 100% rename from doc/diagrams/benchmarks-set/gcc/running insertion.xlsx.practice.png rename to doc/modules/ROOT/images/benchmarks-set/gcc/running insertion.xlsx.practice.png diff --git a/doc/diagrams/benchmarks-set/gcc/scattered erasure by key.xlsx.practice non-unique 5.png b/doc/modules/ROOT/images/benchmarks-set/gcc/scattered erasure by key.xlsx.practice non-unique 5.png similarity index 100% rename from doc/diagrams/benchmarks-set/gcc/scattered erasure by key.xlsx.practice non-unique 5.png rename to doc/modules/ROOT/images/benchmarks-set/gcc/scattered erasure by key.xlsx.practice non-unique 5.png diff --git a/doc/diagrams/benchmarks-set/gcc/scattered erasure by key.xlsx.practice non-unique.png b/doc/modules/ROOT/images/benchmarks-set/gcc/scattered erasure by key.xlsx.practice non-unique.png similarity index 100% rename from doc/diagrams/benchmarks-set/gcc/scattered erasure by key.xlsx.practice non-unique.png rename to doc/modules/ROOT/images/benchmarks-set/gcc/scattered erasure by key.xlsx.practice non-unique.png diff --git a/doc/diagrams/benchmarks-set/gcc/scattered erasure.xlsx.practice non-unique 5.png b/doc/modules/ROOT/images/benchmarks-set/gcc/scattered erasure.xlsx.practice non-unique 5.png similarity index 100% rename from doc/diagrams/benchmarks-set/gcc/scattered erasure.xlsx.practice non-unique 5.png rename to doc/modules/ROOT/images/benchmarks-set/gcc/scattered erasure.xlsx.practice non-unique 5.png diff --git a/doc/diagrams/benchmarks-set/gcc/scattered erasure.xlsx.practice non-unique.png b/doc/modules/ROOT/images/benchmarks-set/gcc/scattered erasure.xlsx.practice non-unique.png similarity index 100% rename from doc/diagrams/benchmarks-set/gcc/scattered erasure.xlsx.practice non-unique.png rename to doc/modules/ROOT/images/benchmarks-set/gcc/scattered erasure.xlsx.practice non-unique.png diff --git a/doc/diagrams/benchmarks-set/gcc/scattered erasure.xlsx.practice.png b/doc/modules/ROOT/images/benchmarks-set/gcc/scattered erasure.xlsx.practice.png similarity index 100% rename from doc/diagrams/benchmarks-set/gcc/scattered erasure.xlsx.practice.png rename to doc/modules/ROOT/images/benchmarks-set/gcc/scattered erasure.xlsx.practice.png diff --git a/doc/diagrams/benchmarks-set/gcc/scattered successful looukp.xlsx.practice non-unique 5.png b/doc/modules/ROOT/images/benchmarks-set/gcc/scattered successful looukp.xlsx.practice non-unique 5.png similarity index 100% rename from doc/diagrams/benchmarks-set/gcc/scattered successful looukp.xlsx.practice non-unique 5.png rename to doc/modules/ROOT/images/benchmarks-set/gcc/scattered successful looukp.xlsx.practice non-unique 5.png diff --git a/doc/diagrams/benchmarks-set/gcc/scattered successful looukp.xlsx.practice non-unique.png b/doc/modules/ROOT/images/benchmarks-set/gcc/scattered successful looukp.xlsx.practice non-unique.png similarity index 100% rename from doc/diagrams/benchmarks-set/gcc/scattered successful looukp.xlsx.practice non-unique.png rename to doc/modules/ROOT/images/benchmarks-set/gcc/scattered successful looukp.xlsx.practice non-unique.png diff --git a/doc/diagrams/benchmarks-set/gcc/scattered successful looukp.xlsx.practice.png b/doc/modules/ROOT/images/benchmarks-set/gcc/scattered successful looukp.xlsx.practice.png similarity index 100% rename from doc/diagrams/benchmarks-set/gcc/scattered successful looukp.xlsx.practice.png rename to doc/modules/ROOT/images/benchmarks-set/gcc/scattered successful looukp.xlsx.practice.png diff --git a/doc/diagrams/benchmarks-set/gcc/scattered unsuccessful looukp.xlsx.practice non-unique 5.png b/doc/modules/ROOT/images/benchmarks-set/gcc/scattered unsuccessful looukp.xlsx.practice non-unique 5.png similarity index 100% rename from doc/diagrams/benchmarks-set/gcc/scattered unsuccessful looukp.xlsx.practice non-unique 5.png rename to doc/modules/ROOT/images/benchmarks-set/gcc/scattered unsuccessful looukp.xlsx.practice non-unique 5.png diff --git a/doc/diagrams/benchmarks-set/gcc/scattered unsuccessful looukp.xlsx.practice non-unique.png b/doc/modules/ROOT/images/benchmarks-set/gcc/scattered unsuccessful looukp.xlsx.practice non-unique.png similarity index 100% rename from doc/diagrams/benchmarks-set/gcc/scattered unsuccessful looukp.xlsx.practice non-unique.png rename to doc/modules/ROOT/images/benchmarks-set/gcc/scattered unsuccessful looukp.xlsx.practice non-unique.png diff --git a/doc/diagrams/benchmarks-set/gcc/scattered unsuccessful looukp.xlsx.practice.png b/doc/modules/ROOT/images/benchmarks-set/gcc/scattered unsuccessful looukp.xlsx.practice.png similarity index 100% rename from doc/diagrams/benchmarks-set/gcc/scattered unsuccessful looukp.xlsx.practice.png rename to doc/modules/ROOT/images/benchmarks-set/gcc/scattered unsuccessful looukp.xlsx.practice.png diff --git a/doc/diagrams/benchmarks-set/vs/running insertion.xlsx.practice non-unique 5.png b/doc/modules/ROOT/images/benchmarks-set/vs/running insertion.xlsx.practice non-unique 5.png similarity index 100% rename from doc/diagrams/benchmarks-set/vs/running insertion.xlsx.practice non-unique 5.png rename to doc/modules/ROOT/images/benchmarks-set/vs/running insertion.xlsx.practice non-unique 5.png diff --git a/doc/diagrams/benchmarks-set/vs/running insertion.xlsx.practice non-unique.png b/doc/modules/ROOT/images/benchmarks-set/vs/running insertion.xlsx.practice non-unique.png similarity index 100% rename from doc/diagrams/benchmarks-set/vs/running insertion.xlsx.practice non-unique.png rename to doc/modules/ROOT/images/benchmarks-set/vs/running insertion.xlsx.practice non-unique.png diff --git a/doc/diagrams/benchmarks-set/vs/running insertion.xlsx.practice norehash non-unique 5.png b/doc/modules/ROOT/images/benchmarks-set/vs/running insertion.xlsx.practice norehash non-unique 5.png similarity index 100% rename from doc/diagrams/benchmarks-set/vs/running insertion.xlsx.practice norehash non-unique 5.png rename to doc/modules/ROOT/images/benchmarks-set/vs/running insertion.xlsx.practice norehash non-unique 5.png diff --git a/doc/diagrams/benchmarks-set/vs/running insertion.xlsx.practice norehash non-unique.png b/doc/modules/ROOT/images/benchmarks-set/vs/running insertion.xlsx.practice norehash non-unique.png similarity index 100% rename from doc/diagrams/benchmarks-set/vs/running insertion.xlsx.practice norehash non-unique.png rename to doc/modules/ROOT/images/benchmarks-set/vs/running insertion.xlsx.practice norehash non-unique.png diff --git a/doc/diagrams/benchmarks-set/vs/running insertion.xlsx.practice norehash.png b/doc/modules/ROOT/images/benchmarks-set/vs/running insertion.xlsx.practice norehash.png similarity index 100% rename from doc/diagrams/benchmarks-set/vs/running insertion.xlsx.practice norehash.png rename to doc/modules/ROOT/images/benchmarks-set/vs/running insertion.xlsx.practice norehash.png diff --git a/doc/diagrams/benchmarks-set/vs/running insertion.xlsx.practice.png b/doc/modules/ROOT/images/benchmarks-set/vs/running insertion.xlsx.practice.png similarity index 100% rename from doc/diagrams/benchmarks-set/vs/running insertion.xlsx.practice.png rename to doc/modules/ROOT/images/benchmarks-set/vs/running insertion.xlsx.practice.png diff --git a/doc/diagrams/benchmarks-set/vs/scattered erasure by key.xlsx.practice non-unique 5.png b/doc/modules/ROOT/images/benchmarks-set/vs/scattered erasure by key.xlsx.practice non-unique 5.png similarity index 100% rename from doc/diagrams/benchmarks-set/vs/scattered erasure by key.xlsx.practice non-unique 5.png rename to doc/modules/ROOT/images/benchmarks-set/vs/scattered erasure by key.xlsx.practice non-unique 5.png diff --git a/doc/diagrams/benchmarks-set/vs/scattered erasure by key.xlsx.practice non-unique.png b/doc/modules/ROOT/images/benchmarks-set/vs/scattered erasure by key.xlsx.practice non-unique.png similarity index 100% rename from doc/diagrams/benchmarks-set/vs/scattered erasure by key.xlsx.practice non-unique.png rename to doc/modules/ROOT/images/benchmarks-set/vs/scattered erasure by key.xlsx.practice non-unique.png diff --git a/doc/diagrams/benchmarks-set/vs/scattered erasure.xlsx.practice non-unique 5.png b/doc/modules/ROOT/images/benchmarks-set/vs/scattered erasure.xlsx.practice non-unique 5.png similarity index 100% rename from doc/diagrams/benchmarks-set/vs/scattered erasure.xlsx.practice non-unique 5.png rename to doc/modules/ROOT/images/benchmarks-set/vs/scattered erasure.xlsx.practice non-unique 5.png diff --git a/doc/diagrams/benchmarks-set/vs/scattered erasure.xlsx.practice non-unique.png b/doc/modules/ROOT/images/benchmarks-set/vs/scattered erasure.xlsx.practice non-unique.png similarity index 100% rename from doc/diagrams/benchmarks-set/vs/scattered erasure.xlsx.practice non-unique.png rename to doc/modules/ROOT/images/benchmarks-set/vs/scattered erasure.xlsx.practice non-unique.png diff --git a/doc/diagrams/benchmarks-set/vs/scattered erasure.xlsx.practice.png b/doc/modules/ROOT/images/benchmarks-set/vs/scattered erasure.xlsx.practice.png similarity index 100% rename from doc/diagrams/benchmarks-set/vs/scattered erasure.xlsx.practice.png rename to doc/modules/ROOT/images/benchmarks-set/vs/scattered erasure.xlsx.practice.png diff --git a/doc/diagrams/benchmarks-set/vs/scattered successful looukp.xlsx.practice non-unique 5.png b/doc/modules/ROOT/images/benchmarks-set/vs/scattered successful looukp.xlsx.practice non-unique 5.png similarity index 100% rename from doc/diagrams/benchmarks-set/vs/scattered successful looukp.xlsx.practice non-unique 5.png rename to doc/modules/ROOT/images/benchmarks-set/vs/scattered successful looukp.xlsx.practice non-unique 5.png diff --git a/doc/diagrams/benchmarks-set/vs/scattered successful looukp.xlsx.practice non-unique.png b/doc/modules/ROOT/images/benchmarks-set/vs/scattered successful looukp.xlsx.practice non-unique.png similarity index 100% rename from doc/diagrams/benchmarks-set/vs/scattered successful looukp.xlsx.practice non-unique.png rename to doc/modules/ROOT/images/benchmarks-set/vs/scattered successful looukp.xlsx.practice non-unique.png diff --git a/doc/diagrams/benchmarks-set/vs/scattered successful looukp.xlsx.practice.png b/doc/modules/ROOT/images/benchmarks-set/vs/scattered successful looukp.xlsx.practice.png similarity index 100% rename from doc/diagrams/benchmarks-set/vs/scattered successful looukp.xlsx.practice.png rename to doc/modules/ROOT/images/benchmarks-set/vs/scattered successful looukp.xlsx.practice.png diff --git a/doc/diagrams/benchmarks-set/vs/scattered unsuccessful looukp.xlsx.practice non-unique 5.png b/doc/modules/ROOT/images/benchmarks-set/vs/scattered unsuccessful looukp.xlsx.practice non-unique 5.png similarity index 100% rename from doc/diagrams/benchmarks-set/vs/scattered unsuccessful looukp.xlsx.practice non-unique 5.png rename to doc/modules/ROOT/images/benchmarks-set/vs/scattered unsuccessful looukp.xlsx.practice non-unique 5.png diff --git a/doc/diagrams/benchmarks-set/vs/scattered unsuccessful looukp.xlsx.practice non-unique.png b/doc/modules/ROOT/images/benchmarks-set/vs/scattered unsuccessful looukp.xlsx.practice non-unique.png similarity index 100% rename from doc/diagrams/benchmarks-set/vs/scattered unsuccessful looukp.xlsx.practice non-unique.png rename to doc/modules/ROOT/images/benchmarks-set/vs/scattered unsuccessful looukp.xlsx.practice non-unique.png diff --git a/doc/diagrams/benchmarks-set/vs/scattered unsuccessful looukp.xlsx.practice.png b/doc/modules/ROOT/images/benchmarks-set/vs/scattered unsuccessful looukp.xlsx.practice.png similarity index 100% rename from doc/diagrams/benchmarks-set/vs/scattered unsuccessful looukp.xlsx.practice.png rename to doc/modules/ROOT/images/benchmarks-set/vs/scattered unsuccessful looukp.xlsx.practice.png diff --git a/doc/diagrams/bucket-groups.png b/doc/modules/ROOT/images/bucket-groups.png similarity index 100% rename from doc/diagrams/bucket-groups.png rename to doc/modules/ROOT/images/bucket-groups.png diff --git a/doc/diagrams/buckets-oa.png b/doc/modules/ROOT/images/buckets-oa.png similarity index 100% rename from doc/diagrams/buckets-oa.png rename to doc/modules/ROOT/images/buckets-oa.png diff --git a/doc/diagrams/buckets.png b/doc/modules/ROOT/images/buckets.png similarity index 100% rename from doc/diagrams/buckets.png rename to doc/modules/ROOT/images/buckets.png diff --git a/doc/diagrams/cfoa.png b/doc/modules/ROOT/images/cfoa.png similarity index 100% rename from doc/diagrams/cfoa.png rename to doc/modules/ROOT/images/cfoa.png diff --git a/doc/diagrams/fca.png b/doc/modules/ROOT/images/fca.png similarity index 100% rename from doc/diagrams/fca.png rename to doc/modules/ROOT/images/fca.png diff --git a/doc/diagrams/foa-metadata-interleaving.png b/doc/modules/ROOT/images/foa-metadata-interleaving.png similarity index 100% rename from doc/diagrams/foa-metadata-interleaving.png rename to doc/modules/ROOT/images/foa-metadata-interleaving.png diff --git a/doc/diagrams/foa-metadata.png b/doc/modules/ROOT/images/foa-metadata.png similarity index 100% rename from doc/diagrams/foa-metadata.png rename to doc/modules/ROOT/images/foa-metadata.png diff --git a/doc/diagrams/foa.png b/doc/modules/ROOT/images/foa.png similarity index 100% rename from doc/diagrams/foa.png rename to doc/modules/ROOT/images/foa.png diff --git a/doc/diagrams/singly-linked.png b/doc/modules/ROOT/images/singly-linked.png similarity index 100% rename from doc/diagrams/singly-linked.png rename to doc/modules/ROOT/images/singly-linked.png diff --git a/doc/modules/ROOT/nav.adoc b/doc/modules/ROOT/nav.adoc new file mode 100644 index 00000000..6768e129 --- /dev/null +++ b/doc/modules/ROOT/nav.adoc @@ -0,0 +1,29 @@ +* xref:intro.adoc[] +* xref:buckets.adoc[] +* xref:hash_equality.adoc[] +* xref:regular.adoc[] +* xref:concurrent.adoc[] +* xref:hash_quality.adoc[] +* xref:compliance.adoc[] +* xref:structures.adoc[] +* xref:debuggability.adoc[] +* xref:benchmarks.adoc[] +* xref:rationale.adoc[] +* xref:ref.adoc[] +** xref:reference/unordered_map.adoc[unordered_map] +** xref:reference/unordered_multimap.adoc[unordered_multimap] +** xref:reference/unordered_set.adoc[unordered_set] +** xref:reference/unordered_multiset.adoc[unordered_multiset] +** xref:reference/hash_traits.adoc[hash_traits] +** xref:reference/stats.adoc[Statistics] +** xref:reference/unordered_flat_map.adoc[unordered_flat_map] +** xref:reference/unordered_flat_set.adoc[unordered_flat_set] +** xref:reference/unordered_node_map.adoc[unordered_node_map] +** xref:reference/unordered_node_set.adoc[unordered_node_set] +** xref:reference/concurrent_flat_map.adoc[concurrent_flat_map] +** xref:reference/concurrent_flat_set.adoc[concurrent_flat_set] +** xref:reference/concurrent_node_map.adoc[concurrent_node_map] +** xref:reference/concurrent_node_set.adoc[concurrent_node_set] +* xref:changes.adoc[] +* xref:bibliography.adoc[] +* xref:copyright.adoc[] diff --git a/doc/modules/ROOT/pages/benchmarks.adoc b/doc/modules/ROOT/pages/benchmarks.adoc new file mode 100644 index 00000000..ff7809c7 --- /dev/null +++ b/doc/modules/ROOT/pages/benchmarks.adoc @@ -0,0 +1,725 @@ +[#benchmarks] +:idprefix: benchmarks_ + += Benchmarks + +== boost::unordered_[multi]set + +All benchmarks were created using `unordered_set` (non-duplicate) and `unordered_multiset` (duplicate). The source code can be https://github.com/boostorg/boost_unordered_benchmarks/tree/boost_unordered_set[found here^]. + +The insertion benchmarks insert `n` random values, where `n` is between 10,000 and 3 million. For the duplicated benchmarks, the same random values are repeated an average of 5 times. + +The erasure benchmarks erase all `n` elements randomly until the container is empty. Erasure by key uses `erase(const key_type&)` to remove entire groups of equivalent elements in each operation. + +The successful lookup benchmarks are done by looking up all `n` values, in their original insertion order. + +The unsuccessful lookup benchmarks use `n` randomly generated integers but using a different seed value. + +=== GCC 12 + libstdc++-v3, x64 + +==== Insertion + +[caption=] +[cols="3*^.^a", frame=all, grid=all] +|=== + +|image::benchmarks-set/gcc/running insertion.xlsx.practice.png[width=250,link=_images/benchmarks-set/gcc/running insertion.xlsx.practice.png,window=_blank] +|image::benchmarks-set/gcc/running insertion.xlsx.practice non-unique.png[width=250,link=_images/benchmarks-set/gcc/running insertion.xlsx.practice non-unique.png,window=_blank] +|image::benchmarks-set/gcc/running insertion.xlsx.practice non-unique 5.png[width=250,link=_images/benchmarks-set/gcc/running insertion.xlsx.practice non-unique 5.png,window=_blank] + +h|non-duplicate elements +h|duplicate elements +h|duplicate elements, + +max load factor 5 +|=== + +[caption=] +[cols="3*^.^a", frame=all, grid=all] +|=== + +|image::benchmarks-set/gcc/running insertion.xlsx.practice norehash.png[width=250,link=_images/benchmarks-set/gcc/running insertion.xlsx.practice norehash.png,window=_blank] +|image::benchmarks-set/gcc/running insertion.xlsx.practice norehash non-unique.png[width=250,link=_images/benchmarks-set/gcc/running insertion.xlsx.practice norehash non-unique.png,window=_blank] +|image::benchmarks-set/gcc/running insertion.xlsx.practice norehash non-unique 5.png[width=250,link=_images/benchmarks-set/gcc/running insertion.xlsx.practice norehash non-unique 5.png,window=_blank] + +h|non-duplicate elements, + +prior `reserve` +h|duplicate elements, + +prior `reserve` +h|duplicate elements, + +max load factor 5, + +prior `reserve` + +|=== + +==== Erasure + +[caption=] +[cols="3*^.^a", frame=all, grid=all] +|=== + +|image::benchmarks-set/gcc/scattered erasure.xlsx.practice.png[width=250,link=_images/benchmarks-set/gcc/scattered erasure.xlsx.practice.png,window=_blank] +|image::benchmarks-set/gcc/scattered erasure.xlsx.practice non-unique.png[width=250,link=_images/benchmarks-set/gcc/scattered erasure.xlsx.practice non-unique.png,window=_blank] +|image::benchmarks-set/gcc/scattered erasure.xlsx.practice non-unique 5.png[width=250,link=_images/benchmarks-set/gcc/scattered erasure.xlsx.practice non-unique 5.png,window=_blank] + +h|non-duplicate elements +h|duplicate elements +h|duplicate elements, + +max load factor 5 + +| +|image::benchmarks-set/gcc/scattered erasure by key.xlsx.practice non-unique.png[width=250,link=_images/benchmarks-set/gcc/scattered erasure by key.xlsx.practice non-unique.png,window=_blank] +|image::benchmarks-set/gcc/scattered erasure by key.xlsx.practice non-unique 5.png[width=250,link=_images/benchmarks-set/gcc/scattered erasure by key.xlsx.practice non-unique 5.png,window=_blank] + +| +h|by key, duplicate elements +h|by key, duplicate elements, + +max load factor 5 + +|=== + +==== Successful Lookup + +[caption=] +[cols="3*^.^a", frame=all, grid=all] +|=== + +|image::benchmarks-set/gcc/scattered successful looukp.xlsx.practice.png[width=250,window=_blank,link=_images/benchmarks-set/gcc/scattered successful looukp.xlsx.practice.png] +|image::benchmarks-set/gcc/scattered successful looukp.xlsx.practice non-unique.png[width=250,window=_blank,link=_images/benchmarks-set/gcc/scattered successful looukp.xlsx.practice non-unique.png] +|image::benchmarks-set/gcc/scattered successful looukp.xlsx.practice non-unique 5.png[width=250,window=_blank,link=_images/benchmarks-set/gcc/scattered successful looukp.xlsx.practice non-unique 5.png] + +h|non-duplicate elements +h|duplicate elements +h|duplicate elements, + +max load factor 5 + +|=== + +==== Unsuccessful lookup + +[caption=] +[cols="3*^.^a", frame=all, grid=all] +|=== + +|image::benchmarks-set/gcc/scattered unsuccessful looukp.xlsx.practice.png[width=250,window=_blank,link=_images/benchmarks-set/gcc/scattered unsuccessful looukp.xlsx.practice.png] +|image::benchmarks-set/gcc/scattered unsuccessful looukp.xlsx.practice non-unique.png[width=250,window=_blank,link=_images/benchmarks-set/gcc/scattered unsuccessful looukp.xlsx.practice non-unique.png] +|image::benchmarks-set/gcc/scattered unsuccessful looukp.xlsx.practice non-unique 5.png[width=250,window=_blank,link=_images/benchmarks-set/gcc/scattered unsuccessful looukp.xlsx.practice non-unique 5.png] + +h|non-duplicate elements +h|duplicate elements +h|duplicate elements, + +max load factor 5 + +|=== + +=== Clang 15 + libc++, x64 + +==== Insertion + +[caption=] +[cols="3*^.^a", frame=all, grid=all] +|=== + +|image::benchmarks-set/clang_libcpp/running insertion.xlsx.practice.png[width=250, window=_blank,link=_images/benchmarks-set/clang_libcpp/running insertion.xlsx.practice.png] +|image::benchmarks-set/clang_libcpp/running insertion.xlsx.practice non-unique.png[width=250, window=_blank,link=_images/benchmarks-set/clang_libcpp/running insertion.xlsx.practice non-unique.png] +|image::benchmarks-set/clang_libcpp/running insertion.xlsx.practice non-unique 5.png[width=250, window=_blank,link=_images/benchmarks-set/clang_libcpp/running insertion.xlsx.practice non-unique 5.png] + +h|non-duplicate elements +h|duplicate elements +h|duplicate elements, + +max load factor 5 + +|=== + +[caption=] +[cols="3*^.^a", frame=all, grid=all] +|=== + +|image::benchmarks-set/clang_libcpp/running insertion.xlsx.practice norehash.png[width=250,window=_blank,link=_images/benchmarks-set/clang_libcpp/running insertion.xlsx.practice norehash.png] +|image::benchmarks-set/clang_libcpp/running insertion.xlsx.practice norehash non-unique.png[width=250,window=_blank,link=_images/benchmarks-set/clang_libcpp/running insertion.xlsx.practice norehash non-unique.png] +|image::benchmarks-set/clang_libcpp/running insertion.xlsx.practice norehash non-unique 5.png[width=250,window=_blank,link=_images/benchmarks-set/clang_libcpp/running insertion.xlsx.practice norehash non-unique 5.png] + +h|non-duplicate elements, + +prior `reserve` +h|duplicate elements, + +prior `reserve` +h|duplicate elements, + +max load factor 5, + +prior `reserve` + +|=== + +==== Erasure + +[caption=] +[cols="3*^.^a", frame=all, grid=all] +|=== + +|image::benchmarks-set/clang_libcpp/scattered erasure.xlsx.practice.png[width=250,window=_blank,link=_images/benchmarks-set/clang_libcpp/scattered erasure.xlsx.practice.png] +|image::benchmarks-set/clang_libcpp/scattered erasure.xlsx.practice non-unique.png[width=250,window=_blank,link=_images/benchmarks-set/clang_libcpp/scattered erasure.xlsx.practice non-unique.png] +|image::benchmarks-set/clang_libcpp/scattered erasure.xlsx.practice non-unique 5.png[width=250,window=_blank,link=_images/benchmarks-set/clang_libcpp/scattered erasure.xlsx.practice non-unique 5.png] + +h|non-duplicate elements +h|duplicate elements +h|duplicate elements, + +max load factor 5 + +| +|image::benchmarks-set/clang_libcpp/scattered erasure by key.xlsx.practice non-unique.png[width=250,link=_images/benchmarks-set/clang_libcpp/scattered erasure by key.xlsx.practice non-unique.png,window=_blank] +|image::benchmarks-set/clang_libcpp/scattered erasure by key.xlsx.practice non-unique 5.png[width=250,link=_images/benchmarks-set/clang_libcpp/scattered erasure by key.xlsx.practice non-unique 5.png,window=_blank] + +| +h|by key, duplicate elements +h|by key, duplicate elements, + +max load factor 5 + +|=== + +==== Successful lookup + +[caption=] +[cols="3*^.^a", frame=all, grid=all] +|=== + +|image::benchmarks-set/clang_libcpp/scattered successful looukp.xlsx.practice.png[width=250,window=_blank,link=_images/benchmarks-set/clang_libcpp/scattered successful looukp.xlsx.practice.png] +|image::benchmarks-set/clang_libcpp/scattered successful looukp.xlsx.practice non-unique.png[width=250,window=_blank,link=_images/benchmarks-set/clang_libcpp/scattered successful looukp.xlsx.practice non-unique.png] +|image::benchmarks-set/clang_libcpp/scattered successful looukp.xlsx.practice non-unique 5.png[width=250,window=_blank,link=_images/benchmarks-set/clang_libcpp/scattered successful looukp.xlsx.practice non-unique 5.png] + +h|non-duplicate elements +h|duplicate elements +h|duplicate elements, + +max load factor 5 + +|=== + +==== Unsuccessful lookup + +[caption=] +[cols="3*^.^a", frame=all, grid=all] +|=== + +|image::benchmarks-set/clang_libcpp/scattered unsuccessful looukp.xlsx.practice.png[width=250,window=_blank,link=_images/benchmarks-set/clang_libcpp/scattered unsuccessful looukp.xlsx.practice.png] +|image::benchmarks-set/clang_libcpp/scattered unsuccessful looukp.xlsx.practice non-unique.png[width=250,window=_blank,link=_images/benchmarks-set/clang_libcpp/scattered unsuccessful looukp.xlsx.practice non-unique.png] +|image::benchmarks-set/clang_libcpp/scattered unsuccessful looukp.xlsx.practice non-unique 5.png[width=250,window=_blank,link=_images/benchmarks-set/clang_libcpp/scattered unsuccessful looukp.xlsx.practice non-unique 5.png] + +h|non-duplicate elements +h|duplicate elements +h|duplicate elements, + +max load factor 5 + +|=== + +=== Visual Studio 2022 + Dinkumware, x64 + +==== Insertion + +[caption=] +[cols="3*^.^a", frame=all, grid=all] +|=== + +|image::benchmarks-set/vs/running insertion.xlsx.practice.png[width=250,window=_blank,link=_images/benchmarks-set/vs/running insertion.xlsx.practice.png] +|image::benchmarks-set/vs/running insertion.xlsx.practice non-unique.png[width=250,window=_blank,link=_images/benchmarks-set/vs/running insertion.xlsx.practice non-unique.png] +|image::benchmarks-set/vs/running insertion.xlsx.practice non-unique 5.png[width=250,window=_blank,link=_images/benchmarks-set/vs/running insertion.xlsx.practice non-unique 5.png] + +h|non-duplicate elements +h|duplicate elements +h|duplicate elements, + +max load factor 5 + +|=== + +[caption=] +[cols="3*^.^a", frame=all, grid=all] +|=== + +|image::benchmarks-set/vs/running insertion.xlsx.practice norehash.png[width=250,window=_blank,link=_images/benchmarks-set/vs/running insertion.xlsx.practice norehash.png] +|image::benchmarks-set/vs/running insertion.xlsx.practice norehash non-unique.png[width=250,window=_blank,link=_images/benchmarks-set/vs/running insertion.xlsx.practice norehash non-unique.png] +|image::benchmarks-set/vs/running insertion.xlsx.practice norehash non-unique 5.png[width=250,window=_blank,link=_images/benchmarks-set/vs/running insertion.xlsx.practice norehash non-unique 5.png] + +h|non-duplicate elements, + +prior `reserve` +h|duplicate elements, + +prior `reserve` +h|duplicate elements, + +max load factor 5, + +prior `reserve` + +|=== + +==== Erasure + +[caption=] +[cols="3*^.^a", frame=all, grid=all] +|=== + +|image::benchmarks-set/vs/scattered erasure.xlsx.practice.png[width=250,window=_blank,link=_images/benchmarks-set/vs/scattered erasure.xlsx.practice.png] +|image::benchmarks-set/vs/scattered erasure.xlsx.practice non-unique.png[width=250,window=_blank,link=_images/benchmarks-set/vs/scattered erasure.xlsx.practice non-unique.png] +|image::benchmarks-set/vs/scattered erasure.xlsx.practice non-unique 5.png[width=250,window=_blank,link=_images/benchmarks-set/vs/scattered erasure.xlsx.practice non-unique 5.png] + +h|non-duplicate elements +h|duplicate elements +h|duplicate elements, + +max load factor 5 + +| +|image::benchmarks-set/vs/scattered erasure by key.xlsx.practice non-unique.png[width=250,link=_images/benchmarks-set/vs/scattered erasure by key.xlsx.practice non-unique.png,window=_blank] +|image::benchmarks-set/vs/scattered erasure by key.xlsx.practice non-unique 5.png[width=250,link=_images/benchmarks-set/vs/scattered erasure by key.xlsx.practice non-unique 5.png,window=_blank] + +| +h|by key, duplicate elements +h|by key, duplicate elements, + +max load factor 5 + +|=== + +==== Successful lookup + +[caption=] +[cols="3*^.^a", frame=all, grid=all] +|=== + +|image::benchmarks-set/vs/scattered successful looukp.xlsx.practice.png[width=250,window=_blank,link=_images/benchmarks-set/vs/scattered successful looukp.xlsx.practice.png] +|image::benchmarks-set/vs/scattered successful looukp.xlsx.practice non-unique.png[width=250,window=_blank,link=_images/benchmarks-set/vs/scattered successful looukp.xlsx.practice non-unique.png] +|image::benchmarks-set/vs/scattered successful looukp.xlsx.practice non-unique 5.png[width=250,window=_blank,link=_images/benchmarks-set/vs/scattered successful looukp.xlsx.practice non-unique 5.png] + +h|non-duplicate elements +h|duplicate elements +h|duplicate elements, + +max load factor 5 + +|=== + +==== Unsuccessful lookup + +[caption=] +[cols="3*^.^a", frame=all, grid=all] +|=== + +|image::benchmarks-set/vs/scattered unsuccessful looukp.xlsx.practice.png[width=250,window=_blank,link=_images/benchmarks-set/vs/scattered unsuccessful looukp.xlsx.practice.png] +|image::benchmarks-set/vs/scattered unsuccessful looukp.xlsx.practice non-unique.png[width=250,window=_blank,link=_images/benchmarks-set/vs/scattered unsuccessful looukp.xlsx.practice non-unique.png] +|image::benchmarks-set/vs/scattered unsuccessful looukp.xlsx.practice non-unique 5.png[width=250,window=_blank,link=_images/benchmarks-set/vs/scattered unsuccessful looukp.xlsx.practice non-unique 5.png] + +h|non-duplicate elements +h|duplicate elements +h|duplicate elements, + +max load factor 5 + +|=== + +== boost::unordered_(flat|node)_map + +All benchmarks were created using: + +* `https://abseil.io/docs/cpp/guides/container[absl::flat_hash_map^]` +* `boost::unordered_map` +* `boost::unordered_flat_map` +* `boost::unordered_node_map` + +The source code can be https://github.com/boostorg/boost_unordered_benchmarks/tree/boost_unordered_flat_map[found here^]. + +The insertion benchmarks insert `n` random values, where `n` is between 10,000 and 10 million. + +The erasure benchmarks erase traverse the `n` elements and erase those with odd key (50% on average). + +The successful lookup benchmarks are done by looking up all `n` values, in their original insertion order. + +The unsuccessful lookup benchmarks use `n` randomly generated integers but using a different seed value. + + +=== GCC 12, x64 + + +[caption=] +[cols="4*^.^a", frame=all, grid=all] +|=== + +|image::benchmarks-flat_map/gcc-x64/Running insertion.xlsx.plot.png[width=250,window=_blank,link=_images/benchmarks-flat_map/gcc-x64/Running insertion.xlsx.plot.png] +|image::benchmarks-flat_map/gcc-x64/Running erasure.xlsx.plot.png[width=250,window=_blank,link=_images/benchmarks-flat_map/gcc-x64/Running erasure.xlsx.plot.png] +|image::benchmarks-flat_map/gcc-x64/Scattered successful looukp.xlsx.plot.png[width=250,window=_blank,link=_images/benchmarks-flat_map/gcc-x64/Scattered successful looukp.xlsx.plot.png] +|image::benchmarks-flat_map/gcc-x64/Scattered unsuccessful looukp.xlsx.plot.png[width=250,window=_blank,link=_images/benchmarks-flat_map/gcc-x64/Scattered unsuccessful looukp.xlsx.plot.png] + +h|running insertion +h|running erasure +h|successful lookup +h|unsuccessful lookup + +|=== + +=== Clang 15, x64 + + +[caption=] +[cols="4*^.^a", frame=all, grid=all] +|=== + +|image::benchmarks-flat_map/clang-x64/Running insertion.xlsx.plot.png[width=250,window=_blank,link=_images/benchmarks-flat_map/clang-x64/Running insertion.xlsx.plot.png] +|image::benchmarks-flat_map/clang-x64/Running erasure.xlsx.plot.png[width=250,window=_blank,link=_images/benchmarks-flat_map/clang-x64/Running erasure.xlsx.plot.png] +|image::benchmarks-flat_map/clang-x64/Scattered successful looukp.xlsx.plot.png[width=250,window=_blank,link=_images/benchmarks-flat_map/clang-x64/Scattered successful looukp.xlsx.plot.png] +|image::benchmarks-flat_map/clang-x64/Scattered unsuccessful looukp.xlsx.plot.png[width=250,window=_blank,link=_images/benchmarks-flat_map/clang-x64/Scattered unsuccessful looukp.xlsx.plot.png] + +h|running insertion +h|running erasure +h|successful lookup +h|unsuccessful lookup + +|=== + +=== Visual Studio 2022, x64 + + +[caption=] +[cols="4*^.^a", frame=all, grid=all] +|=== + +|image::benchmarks-flat_map/vs-x64/Running insertion.xlsx.plot.png[width=250,window=_blank,link=_images/benchmarks-flat_map/vs-x64/Running insertion.xlsx.plot.png] +|image::benchmarks-flat_map/vs-x64/Running erasure.xlsx.plot.png[width=250,window=_blank,link=_images/benchmarks-flat_map/vs-x64/Running erasure.xlsx.plot.png] +|image::benchmarks-flat_map/vs-x64/Scattered successful looukp.xlsx.plot.png[width=250,window=_blank,link=_images/benchmarks-flat_map/vs-x64/Scattered successful looukp.xlsx.plot.png] +|image::benchmarks-flat_map/vs-x64/Scattered unsuccessful looukp.xlsx.plot.png[width=250,window=_blank,link=_images/benchmarks-flat_map/vs-x64/Scattered unsuccessful looukp.xlsx.plot.png] + +h|running insertion +h|running erasure +h|successful lookup +h|unsuccessful lookup + +|=== + +=== Clang 12, ARM64 + + +[caption=] +[cols="4*^.^a", frame=all, grid=all] +|=== + +|image::benchmarks-flat_map/clang-arm64/Running insertion.xlsx.plot.png[width=250,window=_blank,link=_images/benchmarks-flat_map/clang-arm64/Running insertion.xlsx.plot.png] +|image::benchmarks-flat_map/clang-arm64/Running erasure.xlsx.plot.png[width=250,window=_blank,link=_images/benchmarks-flat_map/clang-arm64/Running erasure.xlsx.plot.png] +|image::benchmarks-flat_map/clang-arm64/Scattered successful looukp.xlsx.plot.png[width=250,window=_blank,link=_images/benchmarks-flat_map/clang-arm64/Scattered successful looukp.xlsx.plot.png] +|image::benchmarks-flat_map/clang-arm64/Scattered unsuccessful looukp.xlsx.plot.png[width=250,window=_blank,link=_images/benchmarks-flat_map/clang-arm64/Scattered unsuccessful looukp.xlsx.plot.png] + +h|running insertion +h|running erasure +h|successful lookup +h|unsuccessful lookup + +|=== + +=== GCC 12, x86 + + +[caption=] +[cols="4*^.^a", frame=all, grid=all] +|=== + +|image::benchmarks-flat_map/gcc-x86/Running insertion.xlsx.plot.png[width=250,window=_blank,link=_images/benchmarks-flat_map/gcc-x86/Running insertion.xlsx.plot.png] +|image::benchmarks-flat_map/gcc-x86/Running erasure.xlsx.plot.png[width=250,window=_blank,link=_images/benchmarks-flat_map/gcc-x86/Running erasure.xlsx.plot.png] +|image::benchmarks-flat_map/gcc-x86/Scattered successful looukp.xlsx.plot.png[width=250,window=_blank,link=_images/benchmarks-flat_map/gcc-x86/Scattered successful looukp.xlsx.plot.png] +|image::benchmarks-flat_map/gcc-x86/Scattered unsuccessful looukp.xlsx.plot.png[width=250,window=_blank,link=_images/benchmarks-flat_map/gcc-x86/Scattered unsuccessful looukp.xlsx.plot.png] + +h|running insertion +h|running erasure +h|successful lookup +h|unsuccessful lookup + +|=== + +=== Clang 15, x86 + + +[caption=] +[cols="4*^.^a", frame=all, grid=all] +|=== + +|image::benchmarks-flat_map/clang-x86/Running insertion.xlsx.plot.png[width=250,window=_blank,link=_images/benchmarks-flat_map/clang-x86/Running insertion.xlsx.plot.png] +|image::benchmarks-flat_map/clang-x86/Running erasure.xlsx.plot.png[width=250,window=_blank,link=_images/benchmarks-flat_map/clang-x86/Running erasure.xlsx.plot.png] +|image::benchmarks-flat_map/clang-x86/Scattered successful looukp.xlsx.plot.png[width=250,window=_blank,link=_images/benchmarks-flat_map/clang-x86/Scattered successful looukp.xlsx.plot.png] +|image::benchmarks-flat_map/clang-x86/Scattered unsuccessful looukp.xlsx.plot.png[width=250,window=_blank,link=_images/benchmarks-flat_map/clang-x86/Scattered unsuccessful looukp.xlsx.plot.png] + +h|running insertion +h|running erasure +h|successful lookup +h|unsuccessful lookup + +|=== + +=== Visual Studio 2022, x86 + + +[caption=] +[cols="4*^.^a", frame=all, grid=all] +|=== + +|image::benchmarks-flat_map/vs-x86/Running insertion.xlsx.plot.png[width=250,window=_blank,link=_images/benchmarks-flat_map/vs-x86/Running insertion.xlsx.plot.png] +|image::benchmarks-flat_map/vs-x86/Running erasure.xlsx.plot.png[width=250,window=_blank,link=_images/benchmarks-flat_map/vs-x86/Running erasure.xlsx.plot.png] +|image::benchmarks-flat_map/vs-x86/Scattered successful looukp.xlsx.plot.png[width=250,window=_blank,link=_images/benchmarks-flat_map/vs-x86/Scattered successful looukp.xlsx.plot.png] +|image::benchmarks-flat_map/vs-x86/Scattered unsuccessful looukp.xlsx.plot.png[width=250,window=_blank,link=_images/benchmarks-flat_map/vs-x86/Scattered unsuccessful looukp.xlsx.plot.png] + +h|running insertion +h|running erasure +h|successful lookup +h|unsuccessful lookup + +|=== + +== boost::concurrent_(flat|node)_map + +All benchmarks were created using: + +* `https://spec.oneapi.io/versions/latest/elements/oneTBB/source/containers/concurrent_hash_map_cls.html[oneapi::tbb::concurrent_hash_map^]` +* `https://github.com/greg7mdp/gtl/blob/main/docs/phmap.md[gtl::parallel_flat_hash_map^]` with 64 submaps +* `boost::concurrent_flat_map` +* `boost::concurrent_node_map` + +The source code can be https://github.com/boostorg/boost_unordered_benchmarks/tree/boost_concurrent_flat_map[found here^]. + +The benchmarks exercise a number of threads _T_ (between 1 and 16) concurrently performing operations +randomly chosen among **update**, **successful lookup** and **unsuccessful lookup**. The keys used in the +operations follow a https://en.wikipedia.org/wiki/Zipf%27s_law#Formal_definition[Zipf distribution^] +with different _skew_ parameters: the higher the skew, the more concentrated are the keys in the lower values +of the covered range. + +`boost::concurrent_flat_map` and `boost::concurrent_node_map` are exercised using both regular and xref:concurrent.adoc#concurrent_bulk_visitation[bulk visitation]: +in the latter case, lookup keys are buffered in a local array and then processed at +once each time the buffer reaches `xref:reference/concurrent_flat_map.adoc#concurrent_flat_map_constants[bulk_visit_size]`. + +=== GCC 12, x64 + + +[caption=] +[cols="3*^.^a", frame=all, grid=all] +|=== + +|image::benchmarks-concurrent_map/gcc-x64/Parallel workload.xlsx.500k, 0.01.png[width=250,window=_blank,link="_images/benchmarks-concurrent_map/gcc-x64/Parallel workload.xlsx.500k, 0.01.png"] +|image::benchmarks-concurrent_map/gcc-x64/Parallel workload.xlsx.500k, 0.5.png[width=250,window=_blank,link="_images/benchmarks-concurrent_map/gcc-x64/Parallel workload.xlsx.500k, 0.5.png"] +|image::benchmarks-concurrent_map/gcc-x64/Parallel workload.xlsx.500k, 0.99.png[width=250,window=_blank,link="_images/benchmarks-concurrent_map/gcc-x64/Parallel workload.xlsx.500k, 0.99.png"] + +h|500k updates, 4.5M lookups + +skew=0.01 +h|500k updates, 4.5M lookups + +skew=0.5 +h|500k updates, 4.5M lookups + +skew=0.99 +|=== + +[caption=] +[cols="3*^.^a", frame=all, grid=all] +|=== + +|image::benchmarks-concurrent_map/gcc-x64/Parallel workload.xlsx.5M, 0.01.png[width=250,window=_blank,link="_images/benchmarks-concurrent_map/gcc-x64/Parallel workload.xlsx.5M, 0.01.png"] +|image::benchmarks-concurrent_map/gcc-x64/Parallel workload.xlsx.5M, 0.5.png[width=250,window=_blank,link="_images/benchmarks-concurrent_map/gcc-x64/Parallel workload.xlsx.5M, 0.5.png"] +|image::benchmarks-concurrent_map/gcc-x64/Parallel workload.xlsx.5M, 0.99.png[width=250,window=_blank,link="_images/benchmarks-concurrent_map/gcc-x64/Parallel workload.xlsx.5M, 0.99.png"] + +h|5M updates, 45M lookups + +skew=0.01 +h|5M updates, 45M lookups + +skew=0.5 +h|5M updates, 45M lookups + +skew=0.99 +|=== + +=== Clang 15, x64 + + +[caption=] +[cols="3*^.^a", frame=all, grid=all] +|=== + +|image::benchmarks-concurrent_map/clang-x64/Parallel workload.xlsx.500k, 0.01.png[width=250,window=_blank,link="_images/benchmarks-concurrent_map/clang-x64/Parallel workload.xlsx.500k, 0.01.png"] +|image::benchmarks-concurrent_map/clang-x64/Parallel workload.xlsx.500k, 0.5.png[width=250,window=_blank,link="_images/benchmarks-concurrent_map/clang-x64/Parallel workload.xlsx.500k, 0.5.png"] +|image::benchmarks-concurrent_map/clang-x64/Parallel workload.xlsx.500k, 0.99.png[width=250,window=_blank,link="_images/benchmarks-concurrent_map/clang-x64/Parallel workload.xlsx.500k, 0.99.png"] + +h|500k updates, 4.5M lookups + +skew=0.01 +h|500k updates, 4.5M lookups + +skew=0.5 +h|500k updates, 4.5M lookups + +skew=0.99 +|=== + +[caption=] +[cols="3*^.^a", frame=all, grid=all] +|=== + +|image::benchmarks-concurrent_map/clang-x64/Parallel workload.xlsx.5M, 0.01.png[width=250,window=_blank,link="_images/benchmarks-concurrent_map/clang-x64/Parallel workload.xlsx.5M, 0.01.png"] +|image::benchmarks-concurrent_map/clang-x64/Parallel workload.xlsx.5M, 0.5.png[width=250,window=_blank,link="_images/benchmarks-concurrent_map/clang-x64/Parallel workload.xlsx.5M, 0.5.png"] +|image::benchmarks-concurrent_map/clang-x64/Parallel workload.xlsx.5M, 0.99.png[width=250,window=_blank,link="_images/benchmarks-concurrent_map/clang-x64/Parallel workload.xlsx.5M, 0.99.png"] + +h|5M updates, 45M lookups + +skew=0.01 +h|5M updates, 45M lookups + +skew=0.5 +h|5M updates, 45M lookups + +skew=0.99 +|=== + +=== Visual Studio 2022, x64 + + +[caption=] +[cols="3*^.^a", frame=all, grid=all] +|=== + +|image::benchmarks-concurrent_map/vs-x64/Parallel workload.xlsx.500k, 0.01.png[width=250,window=_blank,link="_images/benchmarks-concurrent_map/vs-x64/Parallel workload.xlsx.500k, 0.01.png"] +|image::benchmarks-concurrent_map/vs-x64/Parallel workload.xlsx.500k, 0.5.png[width=250,window=_blank,link="_images/benchmarks-concurrent_map/vs-x64/Parallel workload.xlsx.500k, 0.5.png"] +|image::benchmarks-concurrent_map/vs-x64/Parallel workload.xlsx.500k, 0.99.png[width=250,window=_blank,link="_images/benchmarks-concurrent_map/vs-x64/Parallel workload.xlsx.500k, 0.99.png"] + +h|500k updates, 4.5M lookups + +skew=0.01 +h|500k updates, 4.5M lookups + +skew=0.5 +h|500k updates, 4.5M lookups + +skew=0.99 +|=== + +[caption=] +[cols="3*^.^a", frame=all, grid=all] +|=== + +|image::benchmarks-concurrent_map/vs-x64/Parallel workload.xlsx.5M, 0.01.png[width=250,window=_blank,link="_images/benchmarks-concurrent_map/vs-x64/Parallel workload.xlsx.5M, 0.01.png"] +|image::benchmarks-concurrent_map/vs-x64/Parallel workload.xlsx.5M, 0.5.png[width=250,window=_blank,link="_images/benchmarks-concurrent_map/vs-x64/Parallel workload.xlsx.5M, 0.5.png"] +|image::benchmarks-concurrent_map/vs-x64/Parallel workload.xlsx.5M, 0.99.png[width=250,window=_blank,link="_images/benchmarks-concurrent_map/vs-x64/Parallel workload.xlsx.5M, 0.99.png"] + +h|5M updates, 45M lookups + +skew=0.01 +h|5M updates, 45M lookups + +skew=0.5 +h|5M updates, 45M lookups + +skew=0.99 +|=== + +=== Clang 12, ARM64 + + +[caption=] +[cols="3*^.^a", frame=all, grid=all] +|=== + +|image::benchmarks-concurrent_map/clang-arm64/Parallel workload.xlsx.500k, 0.01.png[width=250,window=_blank,link="_images/benchmarks-concurrent_map/clang-arm64/Parallel workload.xlsx.500k, 0.01.png"] +|image::benchmarks-concurrent_map/clang-arm64/Parallel workload.xlsx.500k, 0.5.png[width=250,window=_blank,link="_images/benchmarks-concurrent_map/clang-arm64/Parallel workload.xlsx.500k, 0.5.png"] +|image::benchmarks-concurrent_map/clang-arm64/Parallel workload.xlsx.500k, 0.99.png[width=250,window=_blank,link="_images/benchmarks-concurrent_map/clang-arm64/Parallel workload.xlsx.500k, 0.99.png"] + +h|500k updates, 4.5M lookups + +skew=0.01 +h|500k updates, 4.5M lookups + +skew=0.5 +h|500k updates, 4.5M lookups + +skew=0.99 +|=== + +[caption=] +[cols="3*^.^a", frame=all, grid=all] +|=== + +|image::benchmarks-concurrent_map/clang-arm64/Parallel workload.xlsx.5M, 0.01.png[width=250,window=_blank,link="_images/benchmarks-concurrent_map/clang-arm64/Parallel workload.xlsx.5M, 0.01.png"] +|image::benchmarks-concurrent_map/clang-arm64/Parallel workload.xlsx.5M, 0.5.png[width=250,window=_blank,link="_images/benchmarks-concurrent_map/clang-arm64/Parallel workload.xlsx.5M, 0.5.png"] +|image::benchmarks-concurrent_map/clang-arm64/Parallel workload.xlsx.5M, 0.99.png[width=250,window=_blank,link="_images/benchmarks-concurrent_map/clang-arm64/Parallel workload.xlsx.5M, 0.99.png"] + +h|5M updates, 45M lookups + +skew=0.01 +h|5M updates, 45M lookups + +skew=0.5 +h|5M updates, 45M lookups + +skew=0.99 +|=== + +=== GCC 12, x86 + + +[caption=] +[cols="3*^.^a", frame=all, grid=all] +|=== + +|image::benchmarks-concurrent_map/gcc-x86/Parallel workload.xlsx.500k, 0.01.png[width=250,window=_blank,link="_images/benchmarks-concurrent_map/gcc-x86/Parallel workload.xlsx.500k, 0.01.png"] +|image::benchmarks-concurrent_map/gcc-x86/Parallel workload.xlsx.500k, 0.5.png[width=250,window=_blank,link="_images/benchmarks-concurrent_map/gcc-x86/Parallel workload.xlsx.500k, 0.5.png"] +|image::benchmarks-concurrent_map/gcc-x86/Parallel workload.xlsx.500k, 0.99.png[width=250,window=_blank,link="_images/benchmarks-concurrent_map/gcc-x86/Parallel workload.xlsx.500k, 0.99.png"] + +h|500k updates, 4.5M lookups + +skew=0.01 +h|500k updates, 4.5M lookups + +skew=0.5 +h|500k updates, 4.5M lookups + +skew=0.99 +|=== + +[caption=] +[cols="3*^.^a", frame=all, grid=all] +|=== + +|image::benchmarks-concurrent_map/gcc-x86/Parallel workload.xlsx.5M, 0.01.png[width=250,window=_blank,link="_images/benchmarks-concurrent_map/gcc-x86/Parallel workload.xlsx.5M, 0.01.png"] +|image::benchmarks-concurrent_map/gcc-x86/Parallel workload.xlsx.5M, 0.5.png[width=250,window=_blank,link="_images/benchmarks-concurrent_map/gcc-x86/Parallel workload.xlsx.5M, 0.5.png"] +|image::benchmarks-concurrent_map/gcc-x86/Parallel workload.xlsx.5M, 0.99.png[width=250,window=_blank,link="_images/benchmarks-concurrent_map/gcc-x86/Parallel workload.xlsx.5M, 0.99.png"] + +h|5M updates, 45M lookups + +skew=0.01 +h|5M updates, 45M lookups + +skew=0.5 +h|5M updates, 45M lookups + +skew=0.99 +|=== + +=== Clang 15, x86 + + +[caption=] +[cols="3*^.^a", frame=all, grid=all] +|=== + +|image::benchmarks-concurrent_map/clang-x86/Parallel workload.xlsx.500k, 0.01.png[width=250,window=_blank,link="_images/benchmarks-concurrent_map/clang-x86/Parallel workload.xlsx.500k, 0.01.png"] +|image::benchmarks-concurrent_map/clang-x86/Parallel workload.xlsx.500k, 0.5.png[width=250,window=_blank,link="_images/benchmarks-concurrent_map/clang-x86/Parallel workload.xlsx.500k, 0.5.png"] +|image::benchmarks-concurrent_map/clang-x86/Parallel workload.xlsx.500k, 0.99.png[width=250,window=_blank,link="_images/benchmarks-concurrent_map/clang-x86/Parallel workload.xlsx.500k, 0.99.png"] + +h|500k updates, 4.5M lookups + +skew=0.01 +h|500k updates, 4.5M lookups + +skew=0.5 +h|500k updates, 4.5M lookups + +skew=0.99 +|=== + +[caption=] +[cols="3*^.^a", frame=all, grid=all] +|=== + +|image::benchmarks-concurrent_map/clang-x86/Parallel workload.xlsx.5M, 0.01.png[width=250,window=_blank,link="_images/benchmarks-concurrent_map/clang-x86/Parallel workload.xlsx.5M, 0.01.png"] +|image::benchmarks-concurrent_map/clang-x86/Parallel workload.xlsx.5M, 0.5.png[width=250,window=_blank,link="_images/benchmarks-concurrent_map/clang-x86/Parallel workload.xlsx.5M, 0.5.png"] +|image::benchmarks-concurrent_map/clang-x86/Parallel workload.xlsx.5M, 0.99.png[width=250,window=_blank,link="_images/benchmarks-concurrent_map/clang-x86/Parallel workload.xlsx.5M, 0.99.png"] + +h|5M updates, 45M lookups + +skew=0.01 +h|5M updates, 45M lookups + +skew=0.5 +h|5M updates, 45M lookups + +skew=0.99 +|=== + +=== Visual Studio 2022, x86 + + +[caption=] +[cols="3*^.^a", frame=all, grid=all] +|=== + +|image::benchmarks-concurrent_map/vs-x86/Parallel workload.xlsx.500k, 0.01.png[width=250,window=_blank,link="_images/benchmarks-concurrent_map/vs-x86/Parallel workload.xlsx.500k, 0.01.png"] +|image::benchmarks-concurrent_map/vs-x86/Parallel workload.xlsx.500k, 0.5.png[width=250,window=_blank,link="_images/benchmarks-concurrent_map/vs-x86/Parallel workload.xlsx.500k, 0.5.png"] +|image::benchmarks-concurrent_map/vs-x86/Parallel workload.xlsx.500k, 0.99.png[width=250,window=_blank,link="_images/benchmarks-concurrent_map/vs-x86/Parallel workload.xlsx.500k, 0.99.png"] + +h|500k updates, 4.5M lookups + +skew=0.01 +h|500k updates, 4.5M lookups + +skew=0.5 +h|500k updates, 4.5M lookups + +skew=0.99 +|=== + +[caption=] +[cols="3*^.^a", frame=all, grid=all] +|=== + +|image::benchmarks-concurrent_map/vs-x86/Parallel workload.xlsx.5M, 0.01.png[width=250,window=_blank,link="_images/benchmarks-concurrent_map/vs-x86/Parallel workload.xlsx.5M, 0.01.png"] +|image::benchmarks-concurrent_map/vs-x86/Parallel workload.xlsx.5M, 0.5.png[width=250,window=_blank,link="_images/benchmarks-concurrent_map/vs-x86/Parallel workload.xlsx.5M, 0.5.png"] +|image::benchmarks-concurrent_map/vs-x86/Parallel workload.xlsx.5M, 0.99.png[width=250,window=_blank,link="_images/benchmarks-concurrent_map/vs-x86/Parallel workload.xlsx.5M, 0.99.png"] + +h|5M updates, 45M lookups + +skew=0.01 +h|5M updates, 45M lookups + +skew=0.5 +h|5M updates, 45M lookups + +skew=0.99 +|=== diff --git a/doc/unordered/bibliography.adoc b/doc/modules/ROOT/pages/bibliography.adoc similarity index 100% rename from doc/unordered/bibliography.adoc rename to doc/modules/ROOT/pages/bibliography.adoc diff --git a/doc/unordered/buckets.adoc b/doc/modules/ROOT/pages/buckets.adoc similarity index 88% rename from doc/unordered/buckets.adoc rename to doc/modules/ROOT/pages/buckets.adoc index bef4de66..e403e5cb 100644 --- a/doc/unordered/buckets.adoc +++ b/doc/modules/ROOT/pages/buckets.adoc @@ -1,11 +1,10 @@ [#buckets] :idprefix: buckets_ -:imagesdir: ../diagrams = Basics of Hash Tables The containers are made up of a number of _buckets_, each of which can contain -any number of elements. For example, the following diagram shows a <> with 7 buckets containing 5 elements, `A`, +any number of elements. For example, the following diagram shows a `xref:reference/unordered_set.adoc#unordered_set[boost::unordered_set]` with 7 buckets containing 5 elements, `A`, `B`, `C`, `D` and `E` (this is just for illustration, containers will typically have more buckets). @@ -25,15 +24,15 @@ predicate `Pred`). If the hash function has worked well the elements will be evenly distributed amongst the buckets so only a small number of elements will need to be examined. -There is <>. +There is xref:hash_equality.adoc#hash_equality[more information on hash functions and +equality predicates in the next section]. You can see in the diagram that `A` & `D` have been placed in the same bucket. When looking for elements in this bucket up to 2 comparisons are made, making the search slower. This is known as a *collision*. To keep things fast we try to keep collisions to a minimum. -If instead of `boost::unordered_set` we had used <>, the +If instead of `boost::unordered_set` we had used `xref:reference/unordered_flat_set.adoc[boost::unordered_flat_set]`, the diagram would look as follows: image::buckets-oa.png[] @@ -49,15 +48,15 @@ open-addressing containers offer a very limited API for accessing buckets. 2+^h| *All containers* h|*Method* h|*Description* -|`size_type bucket_count() const` +|`size_type bucket_count() const` |The number of buckets. 2+^h| *Closed-addressing containers only* h|*Method* h|*Description* -|`size_type max_bucket_count() const` +|`size_type max_bucket_count() const` |An upper bound on the number of buckets. -|`size_type bucket_size(size_type n) const` +|`size_type bucket_size(size_type n) const` |The number of elements in bucket `n`. |`size_type bucket(key_type const& k) const` @@ -112,13 +111,13 @@ or close to the hint - unless your hint is unreasonably small or large. 2+^h| *All containers* h|*Method* h|*Description* -|`X(size_type n)` +|`X(size_type n)` |Construct an empty container with at least `n` buckets (`X` is the container type). -|`X(InputIterator i, InputIterator j, size_type n)` +|`X(InputIterator i, InputIterator j, size_type n)` |Construct an empty container with at least `n` buckets and insert elements from the range `[i, j)` (`X` is the container type). -|`float load_factor() const` +|`float load_factor() const` |The average number of elements per bucket. |`float max_load_factor() const` @@ -139,12 +138,10 @@ h|*Method* h|*Description* |=== -A note on `max_load` for open-addressing and concurrent containers: the maximum load will be +A note on `max_load` for open-addressing and concurrent containers: the maximum load will be (`max_load_factor() * bucket_count()`) right after `rehash` or on container creation, but may slightly decrease when erasing elements in high-load situations. For instance, if we -have a <> with `size()` almost +have a `xref:reference/unordered_flat_map.adoc#unordered_flat_map[boost::unordered_flat_map]` with `size()` almost at `max_load()` level and then erase 1,000 elements, `max_load()` may decrease by around a few dozen elements. This is done internally by Boost.Unordered in order to keep its performance stable, and must be taken into account when planning for rehash-free insertions. - - diff --git a/doc/unordered/changes.adoc b/doc/modules/ROOT/pages/changes.adoc similarity index 99% rename from doc/unordered/changes.adoc rename to doc/modules/ROOT/pages/changes.adoc index a7034389..32a1bf64 100644 --- a/doc/unordered/changes.adoc +++ b/doc/modules/ROOT/pages/changes.adoc @@ -296,7 +296,7 @@ when the returned proxy is not used. This is major change which has been converted to use Boost.Move's move emulation, and be more compliant with the {cpp}11 standard. See the -xref:unordered.adoc#compliance[compliance section] for details. +xref:compliance.adoc[compliance section] for details. The container now meets {cpp}11's complexity requirements, but to do so uses a little more memory. This means that `quick_erase` and @@ -456,5 +456,3 @@ many of the suggestions from the review. Initial review version, for the review conducted from 7th December 2007 to 16th December 2007. - - diff --git a/doc/unordered/compliance.adoc b/doc/modules/ROOT/pages/compliance.adoc similarity index 96% rename from doc/unordered/compliance.adoc rename to doc/modules/ROOT/pages/compliance.adoc index d532b246..c2f2904f 100644 --- a/doc/unordered/compliance.adoc +++ b/doc/modules/ROOT/pages/compliance.adoc @@ -22,7 +22,7 @@ are only available on {cpp}17 (or later) compilers. === Piecewise Pair Emplacement In accordance with the standard specification, -`boost::unordered_[multi]map::emplace` supports piecewise pair construction: +`boost::unordered_[multi]map::emplace` supports piecewise pair construction: [source,c++] ---- @@ -66,7 +66,7 @@ radically different from that imposed by the standard (closed addressing). Open-addressing containers provided by Boost.Unordered only work with reasonably compliant C++11 (or later) compilers. Language-level features such as move semantics -and variadic template parameters are then not emulated. +and variadic template parameters are then not emulated. The containers are fully https://en.cppreference.com/w/cpp/named_req/AllocatorAwareContainer[AllocatorAware^] and support https://en.cppreference.com/w/cpp/named_req/Allocator#Fancy_pointers[fancy pointers^]. @@ -103,7 +103,7 @@ except those implying iterators. In a non-concurrent unordered container, iterators serve two main purposes: -* Access to an element previously located via lookup. +* Access to an element previously located via lookup. * Container traversal. In place of iterators, Boost.Unordered concurrent containers use _internal visitation_ @@ -136,7 +136,7 @@ template size_t visit_all(F f); of which there are parallelized versions in C++17 compilers with parallel algorithm support. In general, the interface of concurrent containers is derived from that of their non-concurrent counterparts by a fairly straightforward -process of replacing iterators with visitation where applicable. If for +process of replacing iterators with visitation where applicable. If for regular maps `iterator` and `const_iterator` provide mutable and const access to elements, respectively, here visitation is granted mutable or const access depending on the constness of the member function used (there are also `*cvisit` overloads for @@ -145,6 +145,6 @@ explicit const visitation); In the case of `boost::concurrent_flat_set`, visitat One notable operation not provided by `boost::concurrent_flat_map`/`boost::concurrent_node_map` is `operator[]`/`at`, which can be replaced, if in a more convoluted manner, by -xref:#concurrent_flat_map_try_emplace_or_cvisit[`try_emplace_or_visit`]. +`xref:reference/concurrent_flat_map.adoc#concurrent_flat_map_try_emplace_or_cvisit[try_emplace_or_visit]`. //- diff --git a/doc/unordered/concurrent.adoc b/doc/modules/ROOT/pages/concurrent.adoc similarity index 94% rename from doc/unordered/concurrent.adoc rename to doc/modules/ROOT/pages/concurrent.adoc index 75fd7922..a567b135 100644 --- a/doc/unordered/concurrent.adoc +++ b/doc/modules/ROOT/pages/concurrent.adoc @@ -82,7 +82,7 @@ On the other hand, a visitation function can _not_ access the container itself: [source,c++] ---- -m.visit(k, [&](const auto& x) { +m.visit(k, [&](const auto& x) { some_function(x, m.size()); // forbidden: m can't be accessed inside visitation }); ---- @@ -105,7 +105,7 @@ outside of visitation may be beneficial: [source,c++] ---- std::optional o; -bool found = m.visit(k, [&](const auto& x) { +bool found = m.visit(k, [&](const auto& x) { o = x; }); if (found) { @@ -118,7 +118,7 @@ many classical operations have visitation-enabled variations: [source,c++] ---- -m.insert_or_visit(x, [](auto& y) { +m.insert_or_visit(x, [](auto& y) { // if insertion failed because of an equivalent element y, // do something with it, for instance: ++y.second; // increment the mapped part of the element @@ -141,19 +141,19 @@ element already exists): [source,c++] ---- m.insert_and_cvisit(x, - [](const auto& y) { - std::cout<< "(" << y.first << ", " << y.second <<") inserted\n"; + [](const auto& y) { + std::cout<< "(" << y.first << ", " << y.second <<") inserted\n"; }, - [](const auto& y) { - std::cout<< "(" << y.first << ", " << y.second << ") already exists\n"; + [](const auto& y) { + std::cout<< "(" << y.first << ", " << y.second << ") already exists\n"; }); ---- Consult the references of -xref:#concurrent_node_set[`boost::concurrent_node_set`], -xref:#concurrent_flat_map[`boost::concurrent_node_map`], -xref:#concurrent_flat_set[`boost::concurrent_flat_set`] and -xref:#concurrent_flat_map[`boost::concurrent_flat_map`] +`xref:reference/concurrent_node_set.adoc#concurrent_node_set[boost::concurrent_node_set]`, +`xref:reference/concurrent_node_map.adoc#concurrent_node_map[boost::concurrent_node_map]`, +`xref:reference/concurrent_flat_set.adoc#concurrent_flat_set[boost::concurrent_flat_set]` and +`xref:reference/concurrent_flat_map.adoc#concurrent_flat_map[boost::concurrent_flat_map]` for the complete list of visitation-enabled operations. == Whole-Table Visitation @@ -237,7 +237,7 @@ m.visit(keys.begin(), keys.end(), [](auto& x) { ++x.second; }); This functionality is not provided for mere syntactic convenience, though: by processing all the keys at once, some internal optimizations can be applied that increase performance over the regular, one-at-a-time case (consult the -xref:#benchmarks_boostconcurrent_flat_map[benchmarks]). In fact, it may be beneficial +xref:benchmarks.adoc#benchmarks_boostconcurrent_flatnode_map[benchmarks]). In fact, it may be beneficial to buffer incoming keys so that they can be bulk visited in chunks: [source,c++] diff --git a/doc/unordered/copyright.adoc b/doc/modules/ROOT/pages/copyright.adoc similarity index 100% rename from doc/unordered/copyright.adoc rename to doc/modules/ROOT/pages/copyright.adoc diff --git a/doc/unordered/debuggability.adoc b/doc/modules/ROOT/pages/debuggability.adoc similarity index 92% rename from doc/unordered/debuggability.adoc rename to doc/modules/ROOT/pages/debuggability.adoc index 6e7e674f..3ded2170 100644 --- a/doc/unordered/debuggability.adoc +++ b/doc/modules/ROOT/pages/debuggability.adoc @@ -53,7 +53,7 @@ You can load the pretty-printers externally from the non-embedded Python script. === Visualization structure -The visualizations mirror the standard unordered containers. The map containers display an association from key to mapped value. The set containers display an association from index to value. An iterator is either displayed with its item, or as an end iterator. Here is what may be shown for an example `boost::unordered_map`, an example `boost::unordered_set`, and their respective begin and end iterators. +The visualizations mirror the standard unordered containers. The map containers display an association from key to mapped value. The set containers display an association from index to value. An iterator is either displayed with its item, or as an end iterator. Here is what may be shown for an example `boost::unordered_map`, an example `boost::unordered_set`, and their respective begin and end iterators. ```plaintext (gdb) print example_unordered_map @@ -74,11 +74,11 @@ The other containers are identical other than replacing "`boost::unordered_{map| Both the SIMD and the non-SIMD implementations are viewable through the GDB pretty-printers. -For open-addressing containers where xref:#hash_quality_container_statistics[container statistics] are enabled, you can obtain these statistics by calling `get_stats()` on the container, from within GDB. This is overridden in GDB as an link:https://sourceware.org/gdb/current/onlinedocs/gdb.html/Xmethod-API.html[xmethod], so it will not invoke any C++ synchronization code. See the following printout as an example for the expected format. +For open-addressing containers where xref:hash_quality.adoc#hash_quality_container_statistics[container statistics] are enabled, you can obtain these statistics by calling `get_stats()` on the container, from within GDB. This is overridden in GDB as an link:https://sourceware.org/gdb/current/onlinedocs/gdb.html/Xmethod-API.html[xmethod], so it will not invoke any C++ synchronization code. See the following printout as an example for the expected format. ```plaintext (gdb) print example_flat_map.get_stats() -$1 = [stats] = {[insertion] = {[count] = 5, [probe_length] = {avg = 1.0, var = 0.0, dev = 0.0}}, +$1 = [stats] = {[insertion] = {[count] = 5, [probe_length] = {avg = 1.0, var = 0.0, dev = 0.0}}, [successful_lookup] = {[count] = 0, [probe_length] = {avg = 0.0, var = 0.0, dev = 0.0}, [num_comparisons] = {avg = 0.0, var = 0.0, dev = 0.0}}, [unsuccessful_lookup] = {[count] = 5, [probe_length] = {avg = 1.0, var = 0.0, dev = 0.0}, diff --git a/doc/unordered/hash_equality.adoc b/doc/modules/ROOT/pages/hash_equality.adoc similarity index 95% rename from doc/unordered/hash_equality.adoc rename to doc/modules/ROOT/pages/hash_equality.adoc index 583e1173..8621be46 100644 --- a/doc/unordered/hash_equality.adoc +++ b/doc/modules/ROOT/pages/hash_equality.adoc @@ -6,10 +6,10 @@ While the associative containers use an ordering relation to specify how the elements are stored, the unordered associative containers use an equality -predicate and a hash function. For example, <> +predicate and a hash function. For example, `xref:reference/unordered_map.adoc[boost::unordered_map]` is declared as: -``` +```cpp template < class Key, class Mapped, class Hash = boost::hash, @@ -22,7 +22,7 @@ The hash function comes first as you might want to change the hash function but not the equality predicate. For example, if you wanted to use the https://en.wikipedia.org/wiki/Fowler%E2%80%93Noll%E2%80%93Vo_hash_function#FNV-1a_hash[FNV-1a hash^] you could write: -``` +```cpp boost::unordered_map dictionary; ``` @@ -31,7 +31,7 @@ There is an link:../../examples/fnv1.hpp[implementation of FNV-1a^] in the examp If you wish to use a different equality function, you will also need to use a matching hash function. For example, to implement a case insensitive dictionary you need to define a case insensitive equality predicate and hash function: -``` +```cpp struct iequal_to { bool operator()(std::string const& x, @@ -60,7 +60,7 @@ struct ihash ``` Which you can then use in a case insensitive dictionary: -``` +```cpp boost::unordered_map idictionary; ``` @@ -80,7 +80,7 @@ equality predicate (e.g. `boost::function`) then you can get into trouble. Similarly, a custom hash function can be used for custom types: -``` +```cpp struct point { int x; int y; @@ -108,7 +108,7 @@ boost::unordered_multiset points; Since the default hash function is link:../../../container_hash/index.html[Boost.Hash^], we can extend it to support the type so that the hash function doesn't need to be explicitly given: -``` +```cpp struct point { int x; int y; @@ -140,10 +140,10 @@ you'll need to explicitly use Boost.Hash. |=== |Method |Description -|`hasher hash_function() const` +|`hasher hash_function() const` |Returns the container's hash function. -|`key_equal key_eq() const` +|`key_equal key_eq() const` |Returns the container's key equality function.. |=== diff --git a/doc/unordered/hash_quality.adoc b/doc/modules/ROOT/pages/hash_quality.adoc similarity index 95% rename from doc/unordered/hash_quality.adoc rename to doc/modules/ROOT/pages/hash_quality.adoc index 828e9421..803fb42f 100644 --- a/doc/unordered/hash_quality.adoc +++ b/doc/modules/ROOT/pages/hash_quality.adoc @@ -43,7 +43,7 @@ struct my_string_hash_function ---- By setting the -xref:#hash_traits_hash_is_avalanching[hash_is_avalanching] trait, we inform Boost.Unordered +`xref:reference/hash_traits.adoc#hash_traits_hash_is_avalanching[hash_is_avalanching]` trait, we inform Boost.Unordered that `my_string_hash_function` is of sufficient quality to be used directly without any post-mixing safety net. This comes at the risk of degraded performance in the cases where the hash function is not as well-behaved as we've declared. @@ -75,7 +75,7 @@ The `stats` object provides the following information: [source,subs=+quotes] ---- -stats +stats .insertion // *Insertion operations* .count // Number of operations .probe_length // Probe length per operation @@ -101,20 +101,20 @@ stats .num_comparisons // Elements compared per operation .average .variance - .deviation + .deviation ---- Statistics for three internal operations are maintained: insertions (without considering the previous lookup to determine that the key is not present yet), successful lookups, and unsuccessful lookups (including those issued internally when inserting elements). _Probe length_ is the number of -xref:#structures_open_addressing_containers[bucket groups] accessed per operation. +xref:structures.adoc#structures_open_addressing_containers[bucket groups] accessed per operation. If the hash function behaves properly: * Average probe lengths should be close to 1.0. * The average number of comparisons per successful lookup should be close to 1.0 (that is, just the element found is checked). -* The average number of comparisons per unsuccessful lookup should be close to 0.0. +* The average number of comparisons per unsuccessful lookup should be close to 0.0. An link:../../benchmark/string_stats.cpp[example^] is provided that displays container statistics for `boost::hash`, an implementation of the diff --git a/doc/unordered/intro.adoc b/doc/modules/ROOT/pages/intro.adoc similarity index 95% rename from doc/unordered/intro.adoc rename to doc/modules/ROOT/pages/intro.adoc index 907f59d9..55a0e5dd 100644 --- a/doc/unordered/intro.adoc +++ b/doc/modules/ROOT/pages/intro.adoc @@ -37,7 +37,7 @@ boost::unordered_multimap ^| ^.^h|*Open addressing* -^m| boost::unordered_node_set + +^m| boost::unordered_node_set + boost::unordered_node_map ^m| boost::unordered_flat_set + boost::unordered_flat_map @@ -56,7 +56,7 @@ in the market within the technical constraints imposed by the required standard * **Open-addressing containers** rely on much faster data structures and algorithms (more than 2 times faster in typical scenarios) while slightly diverging from the standard interface to accommodate the implementation. -There are two variants: **flat** (the fastest) and **node-based**, which +There are two variants: **flat** (the fastest) and **node-based**, which provide pointer stability under rehashing at the expense of being slower. * Finally, **concurrent containers** are designed and implemented to be used in high-performance multithreaded scenarios. Their interface is radically different from that of regular C++ containers. @@ -66,14 +66,14 @@ All sets and maps in Boost.Unordered are instantiatied similarly as `std::unordered_set` and `std::unordered_map`, respectively: [source,c++] ----- +---- namespace boost { template < class Key, class Hash = boost::hash, class Pred = std::equal_to, class Alloc = std::allocator > - class unordered_set; + class unordered_set; // same for unordered_multiset, unordered_flat_set, unordered_node_set, // concurrent_flat_set and concurrent_node_set @@ -96,5 +96,4 @@ Boost.Unordered uses link:../../../container_hash/index.html[boost::hash^] it al including standard containers. To use any types not supported by these methods you have to extend Boost.Hash to support the type or use your own custom equality predicates and hash functions. See the -<> section -for more details. +xref:hash_equality.adoc#hash_equality[Equality Predicates and Hash Functions], section for more details. diff --git a/doc/unordered/rationale.adoc b/doc/modules/ROOT/pages/rationale.adoc similarity index 95% rename from doc/unordered/rationale.adoc rename to doc/modules/ROOT/pages/rationale.adoc index 29df32f0..5ef4d874 100644 --- a/doc/unordered/rationale.adoc +++ b/doc/modules/ROOT/pages/rationale.adoc @@ -74,7 +74,7 @@ Since release 1.80.0, prime numbers are chosen for the number of buckets in tandem with sophisticated modulo arithmetic. This removes the need for "mixing" the result of the user's hash function as was used for release 1.79.0. -== Open-addresing Containers +== Open-addresing Containers The C++ standard specification of unordered associative containers impose severe limitations on permissible implementations, the most important being @@ -102,7 +102,7 @@ and *high* and *low* are the upper and lower halves of an extended word, respect In 64-bit architectures, _C_ is the integer part of 2^64^∕https://en.wikipedia.org/wiki/Golden_ratio[_φ_], whereas in 32 bits _C_ = 0xE817FB2Du has been obtained from https://arxiv.org/abs/2001.05304[Steele and Vigna (2021)^]. -When using a hash function directly suitable for open addressing, post-mixing can be opted out of via a dedicated <>trait. +When using a hash function directly suitable for open addressing, post-mixing can be opted out of via a dedicated `xref:reference/hash_traits.adoc#hash_traits_hash_is_avalanching[hash_is_avalanching]` trait. `boost::hash` specializations for string types are marked as avalanching. === Platform Interoperability @@ -129,15 +129,14 @@ concurrent scenarios. * Open-addressing layouts are eminently suitable for concurrent access and modification with minimal locking. In particular, the metadata array can be used for implementations of lookup that are lock-free up to the last step of actual element comparison. -* Layout compatibility with Boost.Unordered flat containers allows for -xref:#concurrent_interoperability_with_non_concurrent_containers[fast transfer] +* Layout compatibility with Boost.Unordered flat containers allows for +xref:concurrent.adoc#concurrent_interoperability_with_non_concurrent_containers[fast transfer] of all elements between a concurrent container and its non-concurrent counterpart, and vice versa. === Hash Function and Platform Interoperability Concurrent containers make the same decisions and provide the same guarantees -as Boost.Unordered open-addressing containers with regards to +as Boost.Unordered open-addressing containers with regards to xref:#rationale_hash_function[hash function defaults] and xref:#rationale_platform_interoperability[platform interoperability]. - diff --git a/doc/modules/ROOT/pages/ref.adoc b/doc/modules/ROOT/pages/ref.adoc new file mode 100644 index 00000000..0675a2da --- /dev/null +++ b/doc/modules/ROOT/pages/ref.adoc @@ -0,0 +1,17 @@ +[#reference] += Reference + +* xref:reference/unordered_map.adoc[unordered_map] +* xref:reference/unordered_multimap.adoc[unordered_multimap] +* xref:reference/unordered_set.adoc[unordered_set] +* xref:reference/unordered_multiset.adoc[unordered_multiset] +* xref:reference/hash_traits.adoc[hash_traits] +* xref:reference/stats.adoc[Statistics] +* xref:reference/unordered_flat_map.adoc[unordered_flat_map] +* xref:reference/unordered_flat_set.adoc[unordered_flat_set] +* xref:reference/unordered_node_map.adoc[unordered_node_map] +* xref:reference/unordered_node_set.adoc[unordered_node_set] +* xref:reference/concurrent_flat_map.adoc[concurrent_flat_map] +* xref:reference/concurrent_flat_set.adoc[concurrent_flat_set] +* xref:reference/concurrent_node_map.adoc[concurrent_node_map] +* xref:reference/concurrent_node_set.adoc[concurrent_node_set] diff --git a/doc/unordered/concurrent_flat_map.adoc b/doc/modules/ROOT/pages/reference/concurrent_flat_map.adoc similarity index 97% rename from doc/unordered/concurrent_flat_map.adoc rename to doc/modules/ROOT/pages/reference/concurrent_flat_map.adoc index 8abc740c..58aa7e27 100644 --- a/doc/unordered/concurrent_flat_map.adoc +++ b/doc/modules/ROOT/pages/reference/concurrent_flat_map.adoc @@ -50,7 +50,7 @@ namespace boost { using size_type = std::size_t; using difference_type = std::ptrdiff_t; - using stats = xref:stats_stats_type[__stats-type__]; // if statistics are xref:concurrent_flat_map_boost_unordered_enable_stats[enabled] + using stats = xref:reference/stats.adoc#stats_stats_type[__stats-type__]; // if statistics are xref:concurrent_flat_map_boost_unordered_enable_stats[enabled] // constants static constexpr size_type xref:#concurrent_flat_map_constants[bulk_visit_size] = _implementation-defined_; @@ -391,7 +391,7 @@ The size of the bucket array can be automatically increased by a call to `insert greater than `max_load_factor()`, except possibly for small sizes where the implementation may decide to allow for higher loads. -If `xref:hash_traits_hash_is_avalanching[hash_is_avalanching]::value` is `true`, the hash function +If `xref:reference/hash_traits.adoc#hash_traits_hash_is_avalanching[hash_is_avalanching]::value` is `true`, the hash function is used as-is; otherwise, a bit-mixing post-processing stage is added to increase the quality of hashing at the expense of extra computational cost. @@ -456,7 +456,7 @@ this macro. ==== `BOOST_UNORDERED_ENABLE_STATS` -Globally define this macro to enable xref:#stats[statistics calculation] for the table. Note +Globally define this macro to enable xref:reference/stats.adoc#stats[statistics calculation] for the table. Note that this option decreases the overall performance of many operations. --- @@ -614,7 +614,7 @@ If statistics are xref:concurrent_flat_map_boost_unordered_enable_stats[enabled] transfers the internal statistical information from `other` and calls `other.reset_stats()`. [horizontal] -Complexity:;; O(`bucket_count()`) +Complexity:;; O(`bucket_count()`) --- @@ -749,7 +749,7 @@ Note:;; The destructor is applied to every element, and all memory is deallocate concurrent_flat_map& operator=(concurrent_flat_map const& other); ``` -The assignment operator. Destroys previously existing elements, copy-assigns the hash function and predicate from `other`, +The assignment operator. Destroys previously existing elements, copy-assigns the hash function and predicate from `other`, copy-assigns the allocator from `other` if `Alloc::propagate_on_container_copy_assignment` exists and `Alloc::propagate_on_container_copy_assignment::value` is `true`, and finally inserts copies of the elements of `other`. @@ -840,7 +840,7 @@ to increase further. [horizontal] Requires:;; `FwdIterator` is a https://en.cppreference.com/w/cpp/named_req/ForwardIterator[LegacyForwardIterator^] -({cpp}11 to {cpp}17), +({cpp}11 to {cpp}17), or satisfies https://en.cppreference.com/w/cpp/iterator/forward_iterator[std::forward_iterator^] ({cpp}20 and later). For `K` = `std::iterator_traits::value_type`, either `K` is `key_type` or else `Hash::is_transparent` and `Pred::is_transparent` are valid member typedefs. @@ -1017,7 +1017,7 @@ Inserts `obj` in the table if and only if there is no element in the table with [horizontal] Requires:;; `value_type` is https://en.cppreference.com/w/cpp/named_req/MoveInsertable[MoveInsertable^]. -Returns:;; `true` if an insert took place. +Returns:;; `true` if an insert took place. Concurrency:;; Blocking on rehashing of `*this`. Notes:;; Invalidates pointers and references to elements if a rehashing is issued. + + @@ -1037,7 +1037,7 @@ Equivalent to ----- [horizontal] -Returns:;; The number of elements inserted. +Returns:;; The number of elements inserted. --- @@ -1053,7 +1053,7 @@ Equivalent to ----- [horizontal] -Returns:;; The number of elements inserted. +Returns:;; The number of elements inserted. --- @@ -1135,7 +1135,7 @@ Equivalent to ----- [horizontal] -Returns:;; The number of elements inserted. +Returns:;; The number of elements inserted. --- @@ -1152,7 +1152,7 @@ Equivalent to ----- [horizontal] -Returns:;; The number of elements inserted. +Returns:;; The number of elements inserted. --- @@ -1239,7 +1239,7 @@ Equivalent to ----- [horizontal] -Returns:;; The number of elements inserted. +Returns:;; The number of elements inserted. --- @@ -1258,7 +1258,7 @@ Equivalent to ----- [horizontal] -Returns:;; The number of elements inserted. +Returns:;; The number of elements inserted. --- @@ -1708,7 +1708,7 @@ stats get_stats() const; [horizontal] Returns:;; A statistical description of the insertion and lookup operations performed by the table so far. -Notes:;; Only available if xref:stats[statistics calculation] is xref:concurrent_flat_map_boost_unordered_enable_stats[enabled]. +Notes:;; Only available if xref:reference/stats.adoc#stats[statistics calculation] is xref:concurrent_flat_map_boost_unordered_enable_stats[enabled]. --- @@ -1719,7 +1719,7 @@ void reset_stats() noexcept; [horizontal] Effects:;; Sets to zero the internal statistics kept by the table. -Notes:;; Only available if xref:stats[statistics calculation] is xref:concurrent_flat_map_boost_unordered_enable_stats[enabled]. +Notes:;; Only available if xref:reference/stats.adoc#stats[statistics calculation] is xref:concurrent_flat_map_boost_unordered_enable_stats[enabled]. --- @@ -1748,7 +1748,7 @@ template ----- template using __iter-key-type__ = std::remove_const_t< - std::tuple_element_t<0, xref:#concurrent_map_iter_value_type[__iter-value-type__]>>; // exposition only + std::tuple_element_t<0, xref:#concurrent_flat_map_iter_value_type[__iter-value-type__]>>; // exposition only ----- ==== __iter-mapped-type__ @@ -1756,7 +1756,7 @@ template ----- template using __iter-mapped-type__ = - std::tuple_element_t<1, xref:#concurrent_map_iter_value_type[__iter-value-type__]>; // exposition only + std::tuple_element_t<1, xref:#concurrent_flat_map_iter_value_type[__iter-value-type__]>; // exposition only ----- ==== __iter-to-alloc-type__ @@ -1764,8 +1764,8 @@ template ----- template using __iter-to-alloc-type__ = std::pair< - std::add_const_t>>, - std::tuple_element_t<1, xref:#concurrent_map_iter_value_type[__iter-value-type__]>>; // exposition only + std::add_const_t>>, + std::tuple_element_t<1, xref:#concurrent_flat_map_iter_value_type[__iter-value-type__]>>; // exposition only ----- === Equality Comparisons @@ -1833,7 +1833,7 @@ c.xref:#concurrent_flat_map_erase_if[erase_if](pred); ``concurrent_flat_map``s can be archived/retrieved by means of link:../../../serialization/index.html[Boost.Serialization^] using the API provided -by this library. Both regular and XML archives are supported. +by this library. Both regular and XML archives are supported. ==== Saving an concurrent_flat_map to an archive @@ -1844,7 +1844,7 @@ Requires:;; `std::remove_const::type` and `std::remove_const::value` is `true`, the hash function +If `xref:reference/hash_traits.adoc#hash_traits_hash_is_avalanching[hash_is_avalanching]::value` is `true`, the hash function is used as-is; otherwise, a bit-mixing post-processing stage is added to increase the quality of hashing at the expense of extra computational cost. @@ -402,7 +402,7 @@ this macro. ==== `BOOST_UNORDERED_ENABLE_STATS` -Globally define this macro to enable xref:#stats[statistics calculation] for the table. Note +Globally define this macro to enable xref:reference/stats.adoc#stats[statistics calculation] for the table. Note that this option decreases the overall performance of many operations. --- @@ -560,7 +560,7 @@ If statistics are xref:concurrent_flat_set_boost_unordered_enable_stats[enabled] transfers the internal statistical information from `other` and calls `other.reset_stats()`. [horizontal] -Complexity:;; O(`bucket_count()`) +Complexity:;; O(`bucket_count()`) --- @@ -695,7 +695,7 @@ Note:;; The destructor is applied to every element, and all memory is deallocate concurrent_flat_set& operator=(concurrent_flat_set const& other); ``` -The assignment operator. Destroys previously existing elements, copy-assigns the hash function and predicate from `other`, +The assignment operator. Destroys previously existing elements, copy-assigns the hash function and predicate from `other`, copy-assigns the allocator from `other` if `Alloc::propagate_on_container_copy_assignment` exists and `Alloc::propagate_on_container_copy_assignment::value` is `true`, and finally inserts copies of the elements of `other`. @@ -783,7 +783,7 @@ to increase further. [horizontal] Requires:;; `FwdIterator` is a https://en.cppreference.com/w/cpp/named_req/ForwardIterator[LegacyForwardIterator^] -({cpp}11 to {cpp}17), +({cpp}11 to {cpp}17), or satisfies https://en.cppreference.com/w/cpp/iterator/forward_iterator[std::forward_iterator^] ({cpp}20 and later). For `K` = `std::iterator_traits::value_type`, either `K` is `key_type` or else `Hash::is_transparent` and `Pred::is_transparent` are valid member typedefs. @@ -951,7 +951,7 @@ Inserts `obj` in the table if and only if there is no element in the table with [horizontal] Requires:;; `value_type` is https://en.cppreference.com/w/cpp/named_req/MoveInsertable[MoveInsertable^]. -Returns:;; `true` if an insert took place. +Returns:;; `true` if an insert took place. Concurrency:;; Blocking on rehashing of `*this`. Notes:;; Invalidates pointers and references to elements if a rehashing is issued. @@ -966,7 +966,7 @@ Inserts an element constructed from `std::forward(k)` in the container if and [horizontal] Requires:;; `value_type` is https://en.cppreference.com/w/cpp/named_req/EmplaceConstructible[EmplaceConstructible^] from `k`. -Returns:;; `true` if an insert took place. +Returns:;; `true` if an insert took place. Concurrency:;; Blocking on rehashing of `*this`. Notes:;; Invalidates pointers and references to elements if a rehashing is issued. + + @@ -986,7 +986,7 @@ Equivalent to ----- [horizontal] -Returns:;; The number of elements inserted. +Returns:;; The number of elements inserted. --- @@ -1002,7 +1002,7 @@ Equivalent to ----- [horizontal] -Returns:;; The number of elements inserted. +Returns:;; The number of elements inserted. --- @@ -1070,7 +1070,7 @@ Otherwise, invokes `f` with a const reference to the equivalent element. [horizontal] Requires:;; `value_type` is https://en.cppreference.com/w/cpp/named_req/EmplaceConstructible[EmplaceConstructible^] from `k`. -Returns:;; `true` if an insert took place. +Returns:;; `true` if an insert took place. Concurrency:;; Blocking on rehashing of `*this`. Notes:;; Invalidates pointers and references to elements if a rehashing is issued. + + @@ -1093,7 +1093,7 @@ Equivalent to ----- [horizontal] -Returns:;; The number of elements inserted. +Returns:;; The number of elements inserted. --- @@ -1110,7 +1110,7 @@ Equivalent to ----- [horizontal] -Returns:;; The number of elements inserted. +Returns:;; The number of elements inserted. --- @@ -1184,7 +1184,7 @@ Otherwise, invokes `f2` with a const reference to the equivalent element. [horizontal] Requires:;; `value_type` is https://en.cppreference.com/w/cpp/named_req/EmplaceConstructible[EmplaceConstructible^] from `k`. -Returns:;; `true` if an insert took place. +Returns:;; `true` if an insert took place. Concurrency:;; Blocking on rehashing of `*this`. Notes:;; Invalidates pointers and references to elements if a rehashing is issued. + + @@ -1207,7 +1207,7 @@ Equivalent to ----- [horizontal] -Returns:;; The number of elements inserted. +Returns:;; The number of elements inserted. --- @@ -1226,7 +1226,7 @@ Equivalent to ----- [horizontal] -Returns:;; The number of elements inserted. +Returns:;; The number of elements inserted. --- @@ -1508,7 +1508,7 @@ stats get_stats() const; [horizontal] Returns:;; A statistical description of the insertion and lookup operations performed by the table so far. -Notes:;; Only available if xref:stats[statistics calculation] is xref:concurrent_flat_set_boost_unordered_enable_stats[enabled]. +Notes:;; Only available if xref:reference/stats.adoc#stats[statistics calculation] is xref:concurrent_flat_set_boost_unordered_enable_stats[enabled]. --- @@ -1519,7 +1519,7 @@ void reset_stats() noexcept; [horizontal] Effects:;; Sets to zero the internal statistics kept by the table. -Notes:;; Only available if xref:stats[statistics calculation] is xref:concurrent_flat_set_boost_unordered_enable_stats[enabled]. +Notes:;; Only available if xref:reference/stats.adoc#stats[statistics calculation] is xref:concurrent_flat_set_boost_unordered_enable_stats[enabled]. --- @@ -1608,7 +1608,7 @@ c.xref:#concurrent_flat_set_erase_if[erase_if](pred); ``concurrent_flat_set``s can be archived/retrieved by means of link:../../../serialization/index.html[Boost.Serialization^] using the API provided -by this library. Both regular and XML archives are supported. +by this library. Both regular and XML archives are supported. ==== Saving an concurrent_flat_set to an archive @@ -1618,7 +1618,7 @@ Saves all the elements of a `concurrent_flat_set` `x` to an archive (XML archive Requires:;; `value_type` is serializable (XML serializable), and it supports Boost.Serialization `save_construct_data`/`load_construct_data` protocol (automatically suported by https://en.cppreference.com/w/cpp/named_req/DefaultConstructible[DefaultConstructible^] -types). +types). Concurrency:;; Blocking on `x`. --- diff --git a/doc/unordered/concurrent_node_map.adoc b/doc/modules/ROOT/pages/reference/concurrent_node_map.adoc similarity index 97% rename from doc/unordered/concurrent_node_map.adoc rename to doc/modules/ROOT/pages/reference/concurrent_node_map.adoc index f6e20dd8..ad70eb15 100644 --- a/doc/unordered/concurrent_node_map.adoc +++ b/doc/modules/ROOT/pages/reference/concurrent_node_map.adoc @@ -53,7 +53,7 @@ namespace boost { using node_type = _implementation-defined_; using insert_return_type = _implementation-defined_; - using stats = xref:stats_stats_type[__stats-type__]; // if statistics are xref:concurrent_node_map_boost_unordered_enable_stats[enabled] + using stats = xref:reference/stats.adoc#stats_stats_type[__stats-type__]; // if statistics are xref:concurrent_node_map_boost_unordered_enable_stats[enabled] // constants static constexpr size_type xref:#concurrent_node_map_constants[bulk_visit_size] = _implementation-defined_; @@ -408,7 +408,7 @@ The size of the bucket array can be automatically increased by a call to `insert greater than `max_load_factor()`, except possibly for small sizes where the implementation may decide to allow for higher loads. -If `xref:hash_traits_hash_is_avalanching[hash_is_avalanching]::value` is `true`, the hash function +If `xref:reference/hash_traits.adoc#hash_traits_hash_is_avalanching[hash_is_avalanching]::value` is `true`, the hash function is used as-is; otherwise, a bit-mixing post-processing stage is added to increase the quality of hashing at the expense of extra computational cost. @@ -473,7 +473,7 @@ this macro. ==== `BOOST_UNORDERED_ENABLE_STATS` -Globally define this macro to enable xref:#stats[statistics calculation] for the table. Note +Globally define this macro to enable xref:reference/stats.adoc#stats[statistics calculation] for the table. Note that this option decreases the overall performance of many operations. --- @@ -485,7 +485,7 @@ that this option decreases the overall performance of many operations. typedef _implementation-defined_ node_type; ---- -A class for holding extracted table elements, modelling +A class for holding extracted table elements, modelling https://en.cppreference.com/w/cpp/container/node_handle[NodeHandle]. --- @@ -666,7 +666,7 @@ If statistics are xref:concurrent_node_map_boost_unordered_enable_stats[enabled] transfers the internal statistical information from `other` and calls `other.reset_stats()`. [horizontal] -Complexity:;; O(`bucket_count()`) +Complexity:;; O(`bucket_count()`) --- @@ -801,7 +801,7 @@ Note:;; The destructor is applied to every element, and all memory is deallocate concurrent_node_map& operator=(concurrent_node_map const& other); ``` -The assignment operator. Destroys previously existing elements, copy-assigns the hash function and predicate from `other`, +The assignment operator. Destroys previously existing elements, copy-assigns the hash function and predicate from `other`, copy-assigns the allocator from `other` if `Alloc::propagate_on_container_copy_assignment` exists and `Alloc::propagate_on_container_copy_assignment::value` is `true`, and finally inserts copies of the elements of `other`. @@ -892,7 +892,7 @@ to increase further. [horizontal] Requires:;; `FwdIterator` is a https://en.cppreference.com/w/cpp/named_req/ForwardIterator[LegacyForwardIterator^] -({cpp}11 to {cpp}17), +({cpp}11 to {cpp}17), or satisfies https://en.cppreference.com/w/cpp/iterator/forward_iterator[std::forward_iterator^] ({cpp}20 and later). For `K` = `std::iterator_traits::value_type`, either `K` is `key_type` or else `Hash::is_transparent` and `Pred::is_transparent` are valid member typedefs. @@ -1065,7 +1065,7 @@ Inserts `obj` in the table if and only if there is no element in the table with [horizontal] Requires:;; `value_type` is https://en.cppreference.com/w/cpp/named_req/MoveInsertable[MoveInsertable^]. -Returns:;; `true` if an insert took place. +Returns:;; `true` if an insert took place. Concurrency:;; Blocking on rehashing of `*this`. Notes:;; A call of the form `insert(x)`, where `x` is equally convertible to both `value_type&&` and `init_type&&`, is not ambiguous and selects the `init_type` overload. @@ -1083,7 +1083,7 @@ Equivalent to ----- [horizontal] -Returns:;; The number of elements inserted. +Returns:;; The number of elements inserted. --- @@ -1099,7 +1099,7 @@ Equivalent to ----- [horizontal] -Returns:;; The number of elements inserted. +Returns:;; The number of elements inserted. --- @@ -1194,7 +1194,7 @@ Equivalent to ----- [horizontal] -Returns:;; The number of elements inserted. +Returns:;; The number of elements inserted. --- @@ -1211,7 +1211,7 @@ Equivalent to ----- [horizontal] -Returns:;; The number of elements inserted. +Returns:;; The number of elements inserted. --- @@ -1313,7 +1313,7 @@ Equivalent to ----- [horizontal] -Returns:;; The number of elements inserted. +Returns:;; The number of elements inserted. --- @@ -1332,7 +1332,7 @@ Equivalent to ----- [horizontal] -Returns:;; The number of elements inserted. +Returns:;; The number of elements inserted. --- @@ -1824,7 +1824,7 @@ stats get_stats() const; [horizontal] Returns:;; A statistical description of the insertion and lookup operations performed by the table so far. -Notes:;; Only available if xref:stats[statistics calculation] is xref:concurrent_node_map_boost_unordered_enable_stats[enabled]. +Notes:;; Only available if xref:reference/stats.adoc#stats[statistics calculation] is xref:concurrent_node_map_boost_unordered_enable_stats[enabled]. --- @@ -1835,7 +1835,7 @@ void reset_stats() noexcept; [horizontal] Effects:;; Sets to zero the internal statistics kept by the table. -Notes:;; Only available if xref:stats[statistics calculation] is xref:concurrent_node_map_boost_unordered_enable_stats[enabled]. +Notes:;; Only available if xref:reference/stats.adoc#stats[statistics calculation] is xref:concurrent_node_map_boost_unordered_enable_stats[enabled]. --- @@ -1864,7 +1864,7 @@ template ----- template using __iter-key-type__ = std::remove_const_t< - std::tuple_element_t<0, xref:#concurrent_map_iter_value_type[__iter-value-type__]>>; // exposition only + std::tuple_element_t<0, xref:#concurrent_node_map_iter_value_type[__iter-value-type__]>>; // exposition only ----- ==== __iter-mapped-type__ @@ -1872,7 +1872,7 @@ template ----- template using __iter-mapped-type__ = - std::tuple_element_t<1, xref:#concurrent_map_iter_value_type[__iter-value-type__]>; // exposition only + std::tuple_element_t<1, xref:#concurrent_node_map_iter_value_type[__iter-value-type__]>; // exposition only ----- ==== __iter-to-alloc-type__ @@ -1880,8 +1880,8 @@ template ----- template using __iter-to-alloc-type__ = std::pair< - std::add_const_t>>, - std::tuple_element_t<1, xref:#concurrent_map_iter_value_type[__iter-value-type__]>>; // exposition only + std::add_const_t>>, + std::tuple_element_t<1, xref:#concurrent_node_map_iter_value_type[__iter-value-type__]>>; // exposition only ----- === Equality Comparisons @@ -1949,7 +1949,7 @@ c.xref:#concurrent_node_map_erase_if[erase_if](pred); ``concurrent_node_map``s can be archived/retrieved by means of link:../../../serialization/index.html[Boost.Serialization^] using the API provided -by this library. Both regular and XML archives are supported. +by this library. Both regular and XML archives are supported. ==== Saving an concurrent_node_map to an archive @@ -1960,7 +1960,7 @@ Requires:;; `std::remove_const::type` and `std::remove_const::value` is `true`, the hash function +If `xref:reference/hash_traits.adoc#hash_traits_hash_is_avalanching[hash_is_avalanching]::value` is `true`, the hash function is used as-is; otherwise, a bit-mixing post-processing stage is added to increase the quality of hashing at the expense of extra computational cost. @@ -419,7 +419,7 @@ this macro. ==== `BOOST_UNORDERED_ENABLE_STATS` -Globally define this macro to enable xref:#stats[statistics calculation] for the table. Note +Globally define this macro to enable xref:reference/stats.adoc#stats[statistics calculation] for the table. Note that this option decreases the overall performance of many operations. --- @@ -431,7 +431,7 @@ that this option decreases the overall performance of many operations. typedef _implementation-defined_ node_type; ---- -A class for holding extracted table elements, modelling +A class for holding extracted table elements, modelling https://en.cppreference.com/w/cpp/container/node_handle[NodeHandle]. --- @@ -610,7 +610,7 @@ If statistics are xref:concurrent_node_set_boost_unordered_enable_stats[enabled] transfers the internal statistical information from `other` and calls `other.reset_stats()`. [horizontal] -Complexity:;; O(`bucket_count()`) +Complexity:;; O(`bucket_count()`) --- @@ -745,7 +745,7 @@ Note:;; The destructor is applied to every element, and all memory is deallocate concurrent_node_set& operator=(concurrent_node_set const& other); ``` -The assignment operator. Destroys previously existing elements, copy-assigns the hash function and predicate from `other`, +The assignment operator. Destroys previously existing elements, copy-assigns the hash function and predicate from `other`, copy-assigns the allocator from `other` if `Alloc::propagate_on_container_copy_assignment` exists and `Alloc::propagate_on_container_copy_assignment::value` is `true`, and finally inserts copies of the elements of `other`. @@ -833,7 +833,7 @@ to increase further. [horizontal] Requires:;; `FwdIterator` is a https://en.cppreference.com/w/cpp/named_req/ForwardIterator[LegacyForwardIterator^] -({cpp}11 to {cpp}17), +({cpp}11 to {cpp}17), or satisfies https://en.cppreference.com/w/cpp/iterator/forward_iterator[std::forward_iterator^] ({cpp}20 and later). For `K` = `std::iterator_traits::value_type`, either `K` is `key_type` or else `Hash::is_transparent` and `Pred::is_transparent` are valid member typedefs. @@ -999,7 +999,7 @@ Inserts `obj` in the table if and only if there is no element in the table with [horizontal] Requires:;; `value_type` is https://en.cppreference.com/w/cpp/named_req/MoveInsertable[MoveInsertable^]. -Returns:;; `true` if an insert took place. +Returns:;; `true` if an insert took place. Concurrency:;; Blocking on rehashing of `*this`. --- @@ -1013,7 +1013,7 @@ Inserts an element constructed from `std::forward(k)` in the container if and [horizontal] Requires:;; `value_type` is https://en.cppreference.com/w/cpp/named_req/EmplaceConstructible[EmplaceConstructible^] from `k`. -Returns:;; `true` if an insert took place. +Returns:;; `true` if an insert took place. Concurrency:;; Blocking on rehashing of `*this`. Notes:;; This overload only participates in overload resolution if `Hash::is_transparent` and `Pred::is_transparent` are valid member typedefs. The library assumes that `Hash` is callable with both `K` and `Key` and that `Pred` is transparent. This enables heterogeneous lookup which avoids the cost of instantiating an instance of the `Key` type. @@ -1031,7 +1031,7 @@ Equivalent to ----- [horizontal] -Returns:;; The number of elements inserted. +Returns:;; The number of elements inserted. --- @@ -1047,7 +1047,7 @@ Equivalent to ----- [horizontal] -Returns:;; The number of elements inserted. +Returns:;; The number of elements inserted. --- @@ -1130,7 +1130,7 @@ Otherwise, invokes `f` with a const reference to the equivalent element. [horizontal] Requires:;; `value_type` is https://en.cppreference.com/w/cpp/named_req/EmplaceConstructible[EmplaceConstructible^] from `k`. -Returns:;; `true` if an insert took place. +Returns:;; `true` if an insert took place. Concurrency:;; Blocking on rehashing of `*this`. Notes:;; These overloads only participate in overload resolution if `Hash::is_transparent` and `Pred::is_transparent` are valid member typedefs. The library assumes that `Hash` is callable with both `K` and `Key` and that `Pred` is transparent. This enables heterogeneous lookup which avoids the cost of instantiating an instance of the `Key` type. @@ -1151,7 +1151,7 @@ Equivalent to ----- [horizontal] -Returns:;; The number of elements inserted. +Returns:;; The number of elements inserted. --- @@ -1168,7 +1168,7 @@ Equivalent to ----- [horizontal] -Returns:;; The number of elements inserted. +Returns:;; The number of elements inserted. --- @@ -1259,7 +1259,7 @@ Otherwise, invokes `f2` with a const reference to the equivalent element. [horizontal] Requires:;; `value_type` is https://en.cppreference.com/w/cpp/named_req/EmplaceConstructible[EmplaceConstructible^] from `k`. -Returns:;; `true` if an insert took place. +Returns:;; `true` if an insert took place. Concurrency:;; Blocking on rehashing of `*this`. Notes:;; These overloads only participate in overload resolution if `Hash::is_transparent` and `Pred::is_transparent` are valid member typedefs. The library assumes that `Hash` is callable with both `K` and `Key` and that `Pred` is transparent. This enables heterogeneous lookup which avoids the cost of instantiating an instance of the `Key` type. @@ -1280,7 +1280,7 @@ Equivalent to ----- [horizontal] -Returns:;; The number of elements inserted. +Returns:;; The number of elements inserted. --- @@ -1299,7 +1299,7 @@ Equivalent to ----- [horizontal] -Returns:;; The number of elements inserted. +Returns:;; The number of elements inserted. --- @@ -1631,7 +1631,7 @@ stats get_stats() const; [horizontal] Returns:;; A statistical description of the insertion and lookup operations performed by the table so far. -Notes:;; Only available if xref:stats[statistics calculation] is xref:concurrent_node_set_boost_unordered_enable_stats[enabled]. +Notes:;; Only available if xref:reference/stats.adoc#stats[statistics calculation] is xref:concurrent_node_set_boost_unordered_enable_stats[enabled]. --- @@ -1642,7 +1642,7 @@ void reset_stats() noexcept; [horizontal] Effects:;; Sets to zero the internal statistics kept by the table. -Notes:;; Only available if xref:stats[statistics calculation] is xref:concurrent_node_set_boost_unordered_enable_stats[enabled]. +Notes:;; Only available if xref:reference/stats.adoc#stats[statistics calculation] is xref:concurrent_node_set_boost_unordered_enable_stats[enabled]. --- @@ -1731,7 +1731,7 @@ c.xref:#concurrent_node_set_erase_if[erase_if](pred); ``concurrent_node_set``s can be archived/retrieved by means of link:../../../serialization/index.html[Boost.Serialization^] using the API provided -by this library. Both regular and XML archives are supported. +by this library. Both regular and XML archives are supported. ==== Saving an concurrent_node_set to an archive @@ -1741,7 +1741,7 @@ Saves all the elements of a `concurrent_node_set` `x` to an archive (XML archive Requires:;; `value_type` is serializable (XML serializable), and it supports Boost.Serialization `save_construct_data`/`load_construct_data` protocol (automatically suported by https://en.cppreference.com/w/cpp/named_req/DefaultConstructible[DefaultConstructible^] -types). +types). Concurrency:;; Blocking on `x`. --- diff --git a/doc/unordered/hash_traits.adoc b/doc/modules/ROOT/pages/reference/hash_traits.adoc similarity index 100% rename from doc/unordered/hash_traits.adoc rename to doc/modules/ROOT/pages/reference/hash_traits.adoc diff --git a/doc/unordered/stats.adoc b/doc/modules/ROOT/pages/reference/stats.adoc similarity index 85% rename from doc/unordered/stats.adoc rename to doc/modules/ROOT/pages/reference/stats.adoc index 944b6069..fe690f7a 100644 --- a/doc/unordered/stats.adoc +++ b/doc/modules/ROOT/pages/reference/stats.adoc @@ -30,7 +30,7 @@ struct xref:stats_lookup_stats_type[__lookup-stats-type__] xref:#stats_stats_summary_type[__stats-summary-type__] num_comparisons; }; -struct xref:stats_stats_type[__stats-type__] +struct xref:reference/stats.adoc#stats_stats_type[__stats-type__] { xref:#stats_insertion_stats_type[__insertion-stats-type__] insertion; xref:stats_lookup_stats_type[__lookup-stats-type__] successful_lookup, @@ -46,14 +46,14 @@ Provides the average value, variance and standard deviation of a sequence of num Provides the number of insertion operations performed by a container and statistics on the associated __probe length__ (number of -xref:#structures_open_addressing_containers[bucket groups] accessed per operation). +xref:structures.adoc#structures_open_addressing_containers[bucket groups] accessed per operation). ==== __lookup-stats-type__ For successful (element found) or unsuccessful (not found) lookup, provides the number of operations performed by a container and statistics on the associated __probe length__ (number of -xref:#structures_open_addressing_containers[bucket groups] accessed) +xref:structures.adoc#structures_open_addressing_containers[bucket groups] accessed) and number of element comparisons per operation. ==== __stats-type__ @@ -66,6 +66,6 @@ If the supplied hash function has good quality, then: * For unsuccessful lookups, the average number of element comparisons should be close to 0.0. These statistics can be used to determine if a given hash function -can be marked as xref:hash_traits_hash_is_avalanching[__avalanching__]. +can be marked as xref:reference/hash_traits.adoc#hash_traits_hash_is_avalanching[__avalanching__]. --- diff --git a/doc/unordered/unordered_flat_map.adoc b/doc/modules/ROOT/pages/reference/unordered_flat_map.adoc similarity index 97% rename from doc/unordered/unordered_flat_map.adoc rename to doc/modules/ROOT/pages/reference/unordered_flat_map.adoc index 4b42ec26..99e8746f 100644 --- a/doc/unordered/unordered_flat_map.adoc +++ b/doc/modules/ROOT/pages/reference/unordered_flat_map.adoc @@ -12,9 +12,9 @@ array, and insertions into an already occupied bucket are diverted to available vicinity of the original position. This type of data layout is known as _open addressing_. As a result of its using open addressing, the interface of `boost::unordered_flat_map` deviates in -a number of aspects from that of `boost::unordered_map`/`std::unordered_map`: +a number of aspects from that of `boost::unordered_map`/`std::unordered_map`: - - `value_type` must be move-constructible. + - `value_type` must be move-constructible. - Pointer stability is not kept under rehashing. - `begin()` is not constant-time. - There is no API for bucket handling (except `bucket_count`) or node extraction/insertion. @@ -58,7 +58,7 @@ namespace boost { using iterator = _implementation-defined_; using const_iterator = _implementation-defined_; - using stats = xref:stats_stats_type[__stats-type__]; // if statistics are xref:unordered_flat_map_boost_unordered_enable_stats[enabled] + using stats = xref:reference/stats.adoc#stats_stats_type[__stats-type__]; // if statistics are xref:unordered_flat_map_boost_unordered_enable_stats[enabled] // construct/copy/destroy xref:#unordered_flat_map_default_constructor[unordered_flat_map](); @@ -343,7 +343,7 @@ The size of the bucket array can be automatically increased by a call to `insert greater than `max_load_factor()`, except possibly for small sizes where the implementation may decide to allow for higher loads. -If `xref:hash_traits_hash_is_avalanching[hash_is_avalanching]::value` is `true`, the hash function +If `xref:reference/hash_traits.adoc#hash_traits_hash_is_avalanching[hash_is_avalanching]::value` is `true`, the hash function is used as-is; otherwise, a bit-mixing post-processing stage is added to increase the quality of hashing at the expense of extra computational cost. @@ -353,7 +353,7 @@ at the expense of extra computational cost. ==== `BOOST_UNORDERED_ENABLE_STATS` -Globally define this macro to enable xref:#stats[statistics calculation] for the container. Note +Globally define this macro to enable xref:reference/stats.adoc#stats[statistics calculation] for the container. Note that this option decreases the overall performance of many operations. --- @@ -653,7 +653,7 @@ Note:;; The destructor is applied to every element, and all memory is deallocate unordered_flat_map& operator=(unordered_flat_map const& other); ``` -The assignment operator. Destroys previously existing elements, copy-assigns the hash function and predicate from `other`, +The assignment operator. Destroys previously existing elements, copy-assigns the hash function and predicate from `other`, copy-assigns the allocator from `other` if `Alloc::propagate_on_container_copy_assignment` exists and `Alloc::propagate_on_container_copy_assignment::value` is `true`, and finally inserts copies of the elements of `other`. @@ -1400,7 +1400,7 @@ stats get_stats() const; [horizontal] Returns:;; A statistical description of the insertion and lookup operations performed by the container so far. -Notes:;; Only available if xref:stats[statistics calculation] is xref:unordered_flat_map_boost_unordered_enable_stats[enabled]. +Notes:;; Only available if xref:reference/stats.adoc#stats[statistics calculation] is xref:unordered_flat_map_boost_unordered_enable_stats[enabled]. --- @@ -1411,7 +1411,7 @@ void reset_stats() noexcept; [horizontal] Effects:;; Sets to zero the internal statistics kept by the container. -Notes:;; Only available if xref:stats[statistics calculation] is xref:unordered_flat_map_boost_unordered_enable_stats[enabled]. +Notes:;; Only available if xref:reference/stats.adoc#stats[statistics calculation] is xref:unordered_flat_map_boost_unordered_enable_stats[enabled]. --- @@ -1440,7 +1440,7 @@ template ----- template using __iter-key-type__ = std::remove_const_t< - std::tuple_element_t<0, xref:#unordered_map_iter_value_type[__iter-value-type__]>>; // exposition only + std::tuple_element_t<0, xref:#unordered_flat_map_iter_value_type[__iter-value-type__]>>; // exposition only ----- ==== __iter-mapped-type__ @@ -1448,7 +1448,7 @@ template ----- template using __iter-mapped-type__ = - std::tuple_element_t<1, xref:#unordered_map_iter_value_type[__iter-value-type__]>; // exposition only + std::tuple_element_t<1, xref:#unordered_flat_map_iter_value_type[__iter-value-type__]>; // exposition only ----- ==== __iter-to-alloc-type__ @@ -1456,8 +1456,8 @@ template ----- template using __iter-to-alloc-type__ = std::pair< - std::add_const_t>>, - std::tuple_element_t<1, xref:#unordered_map_iter_value_type[__iter-value-type__]>>; // exposition only + std::add_const_t>>, + std::tuple_element_t<1, xref:#unordered_flat_map_iter_value_type[__iter-value-type__]>>; // exposition only ----- === Equality Comparisons @@ -1535,7 +1535,7 @@ return original_size - c.size(); ``unordered_flat_map``s can be archived/retrieved by means of link:../../../serialization/index.html[Boost.Serialization^] using the API provided -by this library. Both regular and XML archives are supported. +by this library. Both regular and XML archives are supported. ==== Saving an unordered_flat_map to an archive @@ -1546,7 +1546,7 @@ Requires:;; `std::remove_const::type` and `std::remove_const::value` is `true`, the hash function +If `xref:reference/hash_traits.adoc#hash_traits_hash_is_avalanching[hash_is_avalanching]::value` is `true`, the hash function is used as-is; otherwise, a bit-mixing post-processing stage is added to increase the quality of hashing at the expense of extra computational cost. @@ -301,7 +301,7 @@ at the expense of extra computational cost. ==== `BOOST_UNORDERED_ENABLE_STATS` -Globally define this macro to enable xref:#stats[statistics calculation] for the container. Note +Globally define this macro to enable xref:reference/stats.adoc#stats[statistics calculation] for the container. Note that this option decreases the overall performance of many operations. --- @@ -601,7 +601,7 @@ Note:;; The destructor is applied to every element, and all memory is deallocate unordered_flat_set& operator=(unordered_flat_set const& other); ``` -The assignment operator. Destroys previously existing elements, copy-assigns the hash function and predicate from `other`, +The assignment operator. Destroys previously existing elements, copy-assigns the hash function and predicate from `other`, copy-assigns the allocator from `other` if `Alloc::propagate_on_container_copy_assignment` exists and `Alloc::propagate_on_container_copy_assignment::value` is `true`, and finally inserts copies of the elements of `other`. @@ -1173,7 +1173,7 @@ stats get_stats() const; [horizontal] Returns:;; A statistical description of the insertion and lookup operations performed by the container so far. -Notes:;; Only available if xref:stats[statistics calculation] is xref:unordered_flat_set_boost_unordered_enable_stats[enabled]. +Notes:;; Only available if xref:reference/stats.adoc#stats[statistics calculation] is xref:unordered_flat_set_boost_unordered_enable_stats[enabled]. --- @@ -1184,7 +1184,7 @@ void reset_stats() noexcept; [horizontal] Effects:;; Sets to zero the internal statistics kept by the container. -Notes:;; Only available if xref:stats[statistics calculation] is xref:unordered_flat_set_boost_unordered_enable_stats[enabled]. +Notes:;; Only available if xref:reference/stats.adoc#stats[statistics calculation] is xref:unordered_flat_set_boost_unordered_enable_stats[enabled]. --- @@ -1283,7 +1283,7 @@ return original_size - c.size(); ``unordered_flat_set``s can be archived/retrieved by means of link:../../../serialization/index.html[Boost.Serialization^] using the API provided -by this library. Both regular and XML archives are supported. +by this library. Both regular and XML archives are supported. ==== Saving an unordered_flat_set to an archive @@ -1294,7 +1294,7 @@ Requires:;; `value_type` is serializable (XML serializable), and it supports Boost.Serialization `save_construct_data`/`load_construct_data` protocol (automatically suported by https://en.cppreference.com/w/cpp/named_req/DefaultConstructible[DefaultConstructible^] -types). +types). --- diff --git a/doc/unordered/unordered_map.adoc b/doc/modules/ROOT/pages/reference/unordered_map.adoc similarity index 100% rename from doc/unordered/unordered_map.adoc rename to doc/modules/ROOT/pages/reference/unordered_map.adoc diff --git a/doc/unordered/unordered_multimap.adoc b/doc/modules/ROOT/pages/reference/unordered_multimap.adoc similarity index 99% rename from doc/unordered/unordered_multimap.adoc rename to doc/modules/ROOT/pages/reference/unordered_multimap.adoc index 2c6d50b5..81af13e5 100644 --- a/doc/unordered/unordered_multimap.adoc +++ b/doc/modules/ROOT/pages/reference/unordered_multimap.adoc @@ -1420,7 +1420,7 @@ template ----- template using __iter-key-type__ = std::remove_const_t< - std::tuple_element_t<0, xref:#unordered_map_iter_value_type[__iter-value-type__]>>; // exposition only + std::tuple_element_t<0, xref:#unordered_multimap_iter_value_type[__iter-value-type__]>>; // exposition only ----- ==== __iter-mapped-type__ @@ -1428,7 +1428,7 @@ template ----- template using __iter-mapped-type__ = - std::tuple_element_t<1, xref:#unordered_map_iter_value_type[__iter-value-type__]>; // exposition only + std::tuple_element_t<1, xref:#unordered_multimap_iter_value_type[__iter-value-type__]>; // exposition only ----- ==== __iter-to-alloc-type__ @@ -1436,8 +1436,8 @@ template ----- template using __iter-to-alloc-type__ = std::pair< - std::add_const_t>>, - std::tuple_element_t<1, xref:#unordered_map_iter_value_type[__iter-value-type__]>>; // exposition only + std::add_const_t>>, + std::tuple_element_t<1, xref:#unordered_multimap_iter_value_type[__iter-value-type__]>>; // exposition only ----- === Equality Comparisons @@ -1518,7 +1518,7 @@ return original_size - c.size(); ``unordered_multimap``s can be archived/retrieved by means of link:../../../serialization/index.html[Boost.Serialization^] using the API provided -by this library. Both regular and XML archives are supported. +by this library. Both regular and XML archives are supported. ==== Saving an unordered_multimap to an archive @@ -1529,7 +1529,7 @@ Requires:;; `std::remove_const::type` and `std::remove_const::value` is `true`, the hash function +If `xref:reference/hash_traits.adoc#hash_traits_hash_is_avalanching[hash_is_avalanching]::value` is `true`, the hash function is used as-is; otherwise, a bit-mixing post-processing stage is added to increase the quality of hashing at the expense of extra computational cost. @@ -356,7 +356,7 @@ at the expense of extra computational cost. ==== `BOOST_UNORDERED_ENABLE_STATS` -Globally define this macro to enable xref:#stats[statistics calculation] for the container. Note +Globally define this macro to enable xref:reference/stats.adoc#stats[statistics calculation] for the container. Note that this option decreases the overall performance of many operations. --- @@ -392,7 +392,7 @@ The iterator category is at least a forward iterator. typedef _implementation-defined_ node_type; ---- -A class for holding extracted container elements, modelling +A class for holding extracted container elements, modelling https://en.cppreference.com/w/cpp/container/node_handle[NodeHandle]. --- @@ -687,7 +687,7 @@ Note:;; The destructor is applied to every element, and all memory is deallocate unordered_node_map& operator=(unordered_node_map const& other); ``` -The assignment operator. Destroys previously existing elements, copy-assigns the hash function and predicate from `other`, +The assignment operator. Destroys previously existing elements, copy-assigns the hash function and predicate from `other`, copy-assigns the allocator from `other` if `Alloc::propagate_on_container_copy_assignment` exists and `Alloc::propagate_on_container_copy_assignment::value` is `true`, and finally inserts copies of the elements of `other`. @@ -1504,7 +1504,7 @@ stats get_stats() const; [horizontal] Returns:;; A statistical description of the insertion and lookup operations performed by the container so far. -Notes:;; Only available if xref:stats[statistics calculation] is xref:unordered_node_map_boost_unordered_enable_stats[enabled]. +Notes:;; Only available if xref:reference/stats.adoc#stats[statistics calculation] is xref:unordered_node_map_boost_unordered_enable_stats[enabled]. --- @@ -1515,7 +1515,7 @@ void reset_stats() noexcept; [horizontal] Effects:;; Sets to zero the internal statistics kept by the container. -Notes:;; Only available if xref:stats[statistics calculation] is xref:unordered_node_map_boost_unordered_enable_stats[enabled]. +Notes:;; Only available if xref:reference/stats.adoc#stats[statistics calculation] is xref:unordered_node_map_boost_unordered_enable_stats[enabled]. --- @@ -1544,7 +1544,7 @@ template ----- template using __iter-key-type__ = std::remove_const_t< - std::tuple_element_t<0, xref:#unordered_map_iter_value_type[__iter-value-type__]>>; // exposition only + std::tuple_element_t<0, xref:#unordered_node_map_iter_value_type[__iter-value-type__]>>; // exposition only ----- ==== __iter-mapped-type__ @@ -1552,7 +1552,7 @@ template ----- template using __iter-mapped-type__ = - std::tuple_element_t<1, xref:#unordered_map_iter_value_type[__iter-value-type__]>; // exposition only + std::tuple_element_t<1, xref:#unordered_node_map_iter_value_type[__iter-value-type__]>; // exposition only ----- ==== __iter-to-alloc-type__ @@ -1560,8 +1560,8 @@ template ----- template using __iter-to-alloc-type__ = std::pair< - std::add_const_t>>, - std::tuple_element_t<1, xref:#unordered_map_iter_value_type[__iter-value-type__]>>; // exposition only + std::add_const_t>>, + std::tuple_element_t<1, xref:#unordered_node_map_iter_value_type[__iter-value-type__]>>; // exposition only ----- === Equality Comparisons @@ -1639,7 +1639,7 @@ return original_size - c.size(); ``unordered_node_map``s can be archived/retrieved by means of link:../../../serialization/index.html[Boost.Serialization^] using the API provided -by this library. Both regular and XML archives are supported. +by this library. Both regular and XML archives are supported. ==== Saving an unordered_node_map to an archive @@ -1650,7 +1650,7 @@ Requires:;; `std::remove_const::type` and `std::remove_const::value` is `true`, the hash function +If `xref:reference/hash_traits.adoc#hash_traits_hash_is_avalanching[hash_is_avalanching]::value` is `true`, the hash function is used as-is; otherwise, a bit-mixing post-processing stage is added to increase the quality of hashing at the expense of extra computational cost. @@ -305,7 +305,7 @@ at the expense of extra computational cost. ==== `BOOST_UNORDERED_ENABLE_STATS` -Globally define this macro to enable xref:#stats[statistics calculation] for the container. Note +Globally define this macro to enable xref:reference/stats.adoc#stats[statistics calculation] for the container. Note that this option decreases the overall performance of many operations. --- @@ -341,7 +341,7 @@ The iterator category is at least a forward iterator. typedef _implementation-defined_ node_type; ---- -A class for holding extracted container elements, modelling +A class for holding extracted container elements, modelling https://en.cppreference.com/w/cpp/container/node_handle[NodeHandle]. --- @@ -639,7 +639,7 @@ Note:;; The destructor is applied to every element, and all memory is deallocate unordered_node_set& operator=(unordered_node_set const& other); ``` -The assignment operator. Destroys previously existing elements, copy-assigns the hash function and predicate from `other`, +The assignment operator. Destroys previously existing elements, copy-assigns the hash function and predicate from `other`, copy-assigns the allocator from `other` if `Alloc::propagate_on_container_copy_assignment` exists and `Alloc::propagate_on_container_copy_assignment::value` is `true`, and finally inserts copies of the elements of `other`. @@ -1281,7 +1281,7 @@ stats get_stats() const; [horizontal] Returns:;; A statistical description of the insertion and lookup operations performed by the container so far. -Notes:;; Only available if xref:stats[statistics calculation] is xref:unordered_node_set_boost_unordered_enable_stats[enabled]. +Notes:;; Only available if xref:reference/stats.adoc#stats[statistics calculation] is xref:unordered_node_set_boost_unordered_enable_stats[enabled]. --- @@ -1292,7 +1292,7 @@ void reset_stats() noexcept; [horizontal] Effects:;; Sets to zero the internal statistics kept by the container. -Notes:;; Only available if xref:stats[statistics calculation] is xref:unordered_node_set_boost_unordered_enable_stats[enabled]. +Notes:;; Only available if xref:reference/stats.adoc#stats[statistics calculation] is xref:unordered_node_set_boost_unordered_enable_stats[enabled]. --- @@ -1391,7 +1391,7 @@ return original_size - c.size(); ``unordered_node_set``s can be archived/retrieved by means of link:../../../serialization/index.html[Boost.Serialization^] using the API provided -by this library. Both regular and XML archives are supported. +by this library. Both regular and XML archives are supported. ==== Saving an unordered_node_set to an archive @@ -1402,7 +1402,7 @@ Requires:;; `value_type` is serializable (XML serializable), and it supports Boost.Serialization `save_construct_data`/`load_construct_data` protocol (automatically suported by https://en.cppreference.com/w/cpp/named_req/DefaultConstructible[DefaultConstructible^] -types). +types). --- diff --git a/doc/unordered/unordered_set.adoc b/doc/modules/ROOT/pages/reference/unordered_set.adoc similarity index 100% rename from doc/unordered/unordered_set.adoc rename to doc/modules/ROOT/pages/reference/unordered_set.adoc diff --git a/doc/unordered/regular.adoc b/doc/modules/ROOT/pages/regular.adoc similarity index 93% rename from doc/unordered/regular.adoc rename to doc/modules/ROOT/pages/regular.adoc index 9ad36258..bd6f0a6a 100644 --- a/doc/unordered/regular.adoc +++ b/doc/modules/ROOT/pages/regular.adoc @@ -5,12 +5,12 @@ Boost.Unordered closed-addressing containers (`boost::unordered_set`, `boost::unordered_map`, `boost::unordered_multiset` and `boost::unordered_multimap`) are fully conformant with the -C++ specification for unordered associative containers, so for those who know how to use +C++ specification for unordered associative containers, so for those who know how to use `std::unordered_set`, `std::unordered_map`, etc., their homonyms in Boost.Unordered are -drop-in replacements. The interface of open-addressing containers (`boost::unordered_node_set`, +drop-in replacements. The interface of open-addressing containers (`boost::unordered_node_set`, `boost::unordered_node_map`, `boost::unordered_flat_set` and `boost::unordered_flat_map`) is very similar, but they present some minor differences listed in the dedicated -xref:#compliance_open_addressing_containers[standard compliance section]. +xref:compliance.adoc#compliance_open_addressing_containers[standard compliance section]. For readers without previous experience with hash containers but familiar @@ -48,7 +48,7 @@ three,3 ---- There are other differences, which are listed in the -<> section. +xref:regular.adoc#comparison[Comparison with Associative Containers] section. == Iterator Invalidation @@ -60,7 +60,7 @@ change the number of buckets when this happens. Iterators can be invalidated by calls to `insert`, `rehash` and `reserve`. As for pointers and references, -they are never invalidated for node-based containers +they are never invalidated for node-based containers (`boost::unordered_[multi]set`, `boost::unordered_[multi]map`, `boost::unordered_node_set`, `boost::unordered_node_map`), but they will be when rehashing occurs for `boost::unordered_flat_set` and `boost::unordered_flat_map`: this is because @@ -87,7 +87,7 @@ number of available buckets, this function is logically equivalent to: x.rehash(std::ceil(n / x.max_load_factor())) ``` + -See the <> on the `rehash` function. +See the xref:reference/unordered_map.adoc#unordered_map_rehash[reference for more details] on the `rehash` function. [#comparison] @@ -106,10 +106,10 @@ See the <> on the `rehash` func |Keys can be compared using `key_compare` which is accessed by member function `key_comp()`, values can be compared using `value_compare` which is accessed by member function `value_comp()`. |Keys can be hashed using `hasher` which is accessed by member function `hash_function()`, and checked for equality using `key_equal` which is accessed by member function `key_eq()`. There is no function object for compared or hashing values. -|Constructors have optional extra parameters for the comparison object. +|Constructors have optional extra parameters for the comparison object. |Constructors have optional extra parameters for the initial minimum number of buckets, a hash function and an equality object. -|Keys `k1`, `k2` are considered equivalent if `!Compare(k1, k2) && !Compare(k2, k1)`. +|Keys `k1`, `k2` are considered equivalent if `!Compare(k1, k2) && !Compare(k2, k1)`. |Keys `k1`, `k2` are considered equivalent if `Pred(k1, k2)` |Member function `lower_bound(k)` and `upper_bound(k)` @@ -123,7 +123,7 @@ See the <> on the `rehash` func |`iterator`, `const_iterator` are of at least the forward category. |Iterators, pointers and references to the container's elements are never invalidated. -|<>. + +|xref:regular.adoc#regular_iterator_invalidation[Iterators can be invalidated by calls to insert or rehash]. + **Node-based containers:** Pointers and references to the container's elements are never invalidated. + **Flat containers:** Pointers and references to the container's elements are invalidated when rehashing occurs. diff --git a/doc/unordered/structures.adoc b/doc/modules/ROOT/pages/structures.adoc similarity index 95% rename from doc/unordered/structures.adoc rename to doc/modules/ROOT/pages/structures.adoc index 66214340..d266267b 100644 --- a/doc/unordered/structures.adoc +++ b/doc/modules/ROOT/pages/structures.adoc @@ -25,7 +25,7 @@ Canonical standard implementations will wind up looking like the diagram below: [.text-center] .The canonical standard approach -image::singly-linked.png[align=center,link=../diagrams/singly-linked.png,window=_blank] +image::singly-linked.png[align=center,link=_images/singly-linked.png,window=_blank] It's worth noting that this approach is only used by pass:[libc++] and pass:[libstdc++]; the MSVC Dinkumware implementation uses a different one. A more detailed analysis of the standard containers can be found http://bannalia.blogspot.com/2013/10/implementation-of-c-unordered.html[here]. @@ -63,7 +63,7 @@ A more detailed description of Boost.Unordered's closed-addressing implementatio given in an https://bannalia.blogspot.com/2022/06/advancing-state-of-art-for.html[external article]. For more information on implementation rationale, read the -xref:#rationale_closed_addressing_containers[corresponding section]. +xref:rationale.adoc#rationale_closed_addressing_containers[corresponding section]. == Open-addressing Containers @@ -125,13 +125,13 @@ A more detailed description of Boost.Unordered's open-addressing implementation given in an https://bannalia.blogspot.com/2022/11/inside-boostunorderedflatmap.html[external article]. For more information on implementation rationale, read the -xref:#rationale_open_addresing_containers[corresponding section]. +xref:rationale.adoc#rationale_open_addresing_containers[corresponding section]. == Concurrent Containers `boost::concurrent_flat_set`/`boost::concurrent_node_set` and `boost::concurrent_flat_map`/`boost::concurrent_node_map` use the basic -xref:#structures_open_addressing_containers[open-addressing layout] described above +xref:structures.adoc#structures_open_addressing_containers[open-addressing layout] described above augmented with synchronization mechanisms. @@ -177,4 +177,4 @@ practice, the start-over frequency is extremely small, measured in the range of parts per million for some of our benchmarks. For more information on implementation rationale, read the -xref:#rationale_concurrent_containers[corresponding section]. +xref:rationale.adoc#rationale_concurrent_containers[corresponding section]. diff --git a/doc/package-lock.json b/doc/package-lock.json new file mode 100644 index 00000000..a4abd7e4 --- /dev/null +++ b/doc/package-lock.json @@ -0,0 +1,1608 @@ +{ + "name": "doc", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "devDependencies": { + "@antora/cli": "3.1.10", + "@antora/site-generator": "3.1.10", + "antora": "3.1.10" + } + }, + "node_modules/@antora/asciidoc-loader": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/@antora/asciidoc-loader/-/asciidoc-loader-3.1.10.tgz", + "integrity": "sha512-np0JkOV37CK7V4eDZUZXf4fQuCKYW3Alxl8FlyzBevXi2Ujv29O82JLbHbv1cyTsvGkGNNB+gzJIx9XBsQ7+Nw==", + "dev": true, + "dependencies": { + "@antora/logger": "3.1.10", + "@antora/user-require-helper": "~3.0", + "@asciidoctor/core": "~2.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@antora/cli": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/@antora/cli/-/cli-3.1.10.tgz", + "integrity": "sha512-gp8u9aVM0w1DtWSsB5PwvEfFYKrooPENLhN58RAfdgTrcsTsWw+CDysFZPgEaHB0Y1ZbanR82ZH/f6JVKGcZfQ==", + "dev": true, + "dependencies": { + "@antora/logger": "3.1.10", + "@antora/playbook-builder": "3.1.10", + "@antora/user-require-helper": "~3.0", + "commander": "~11.1" + }, + "bin": { + "antora": "bin/antora" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@antora/content-aggregator": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/@antora/content-aggregator/-/content-aggregator-3.1.10.tgz", + "integrity": "sha512-OT6ZcCA7LrtNfrAZUr3hFh+Z/1isKpsfnqFjCDC66NEMqIyzJO99jq0CM66rYlYhyX7mb5BwEua8lHcwpOXNow==", + "dev": true, + "dependencies": { + "@antora/expand-path-helper": "~3.0", + "@antora/logger": "3.1.10", + "@antora/user-require-helper": "~3.0", + "braces": "~3.0", + "cache-directory": "~2.0", + "fast-glob": "~3.3", + "hpagent": "~1.2", + "isomorphic-git": "~1.25", + "js-yaml": "~4.1", + "multi-progress": "~4.0", + "picomatch": "~4.0", + "progress": "~2.0", + "should-proxy": "~1.0", + "simple-get": "~4.0", + "vinyl": "~3.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@antora/content-classifier": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/@antora/content-classifier/-/content-classifier-3.1.10.tgz", + "integrity": "sha512-3JJl4IIiTX00v/MirK603NoqIcHjGYAaRWt3Q4U03tI1Fv2Aho/ypO3FE45069jFf0Dx2uDJfp5kapb9gaIjdQ==", + "dev": true, + "dependencies": { + "@antora/asciidoc-loader": "3.1.10", + "@antora/logger": "3.1.10", + "mime-types": "~2.1", + "vinyl": "~3.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@antora/document-converter": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/@antora/document-converter/-/document-converter-3.1.10.tgz", + "integrity": "sha512-qi9ctgcKal8tZtWflVo66w+4zCJoBmUKRV+eA9aRRR09KDdU9r514vu1adWNgniPppISr90zD13V5l2JUy/2CQ==", + "dev": true, + "dependencies": { + "@antora/asciidoc-loader": "3.1.10" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@antora/expand-path-helper": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@antora/expand-path-helper/-/expand-path-helper-3.0.0.tgz", + "integrity": "sha512-7PdEIhk97v85/CSm3HynCsX14TR6oIVz1s233nNLsiWubE8tTnpPt4sNRJR+hpmIZ6Bx9c6QDp3XIoiyu/WYYA==", + "dev": true, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@antora/file-publisher": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/@antora/file-publisher/-/file-publisher-3.1.10.tgz", + "integrity": "sha512-DPR/0d1P+kr3qV4T0Gh81POEO/aCmNWIp/oLUYAhr0HHOcFzgpTUUoLStgcYynZPFRIB7EYKSab+oYSCK17DGA==", + "dev": true, + "dependencies": { + "@antora/expand-path-helper": "~3.0", + "@antora/user-require-helper": "~3.0", + "vinyl": "~3.0", + "yazl": "~2.5" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@antora/logger": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/@antora/logger/-/logger-3.1.10.tgz", + "integrity": "sha512-WSuIxEP2tVrhWtTj/sIrwBDjpi4ldB/1Kpiu4PXmY4/qeWP8thW6u8nXdwdDcWss5zqkZWjourvWKwVq7y8Wjg==", + "dev": true, + "dependencies": { + "@antora/expand-path-helper": "~3.0", + "pino": "~9.2", + "pino-pretty": "~11.2", + "sonic-boom": "~4.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@antora/navigation-builder": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/@antora/navigation-builder/-/navigation-builder-3.1.10.tgz", + "integrity": "sha512-aLMK49nYsSB3mEZbLkmUXDAUYmscv2AFWu+5c3eqVGkQ6Wgyd79WQ6Bz3/TN9YqkzGL+PqGs0G39F0VQzD23Hw==", + "dev": true, + "dependencies": { + "@antora/asciidoc-loader": "3.1.10" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@antora/page-composer": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/@antora/page-composer/-/page-composer-3.1.10.tgz", + "integrity": "sha512-JoEg8J8HVsnPmAgUrYSGzf0C8rQefXyCi/18ucy0utyfUvlJNsZvUbGUPx62Het9p0JP0FkAz2MTLyDlNdArVg==", + "dev": true, + "dependencies": { + "@antora/logger": "3.1.10", + "handlebars": "~4.7", + "require-from-string": "~2.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@antora/playbook-builder": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/@antora/playbook-builder/-/playbook-builder-3.1.10.tgz", + "integrity": "sha512-UB8UmRYfkKgActTUlotdVS4FKGjaZgTnSXE7Fns1xb3/3HRanWvI+Yze1OmCkGC33cTpoQFnSYp7ySEH8LaiBw==", + "dev": true, + "dependencies": { + "@iarna/toml": "~2.2", + "convict": "~6.2", + "js-yaml": "~4.1", + "json5": "~2.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@antora/redirect-producer": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/@antora/redirect-producer/-/redirect-producer-3.1.10.tgz", + "integrity": "sha512-IbWJGh6LmsxJQ821h0B9JfooofFZBgFLZxsbp/IoTLkBFGLFAY5tDRvB6rvubfNLRoSjM8VjEUXGqVLlwZOb+g==", + "dev": true, + "dependencies": { + "vinyl": "~3.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@antora/site-generator": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/@antora/site-generator/-/site-generator-3.1.10.tgz", + "integrity": "sha512-NCULYtwUjIyr5FGCymhfG/zDVUmZ6pfmCPorka8mAzo4/GDx1T7bgaRL9rEIyf2AMqcm7apQiAz03mpU4kucsw==", + "dev": true, + "dependencies": { + "@antora/asciidoc-loader": "3.1.10", + "@antora/content-aggregator": "3.1.10", + "@antora/content-classifier": "3.1.10", + "@antora/document-converter": "3.1.10", + "@antora/file-publisher": "3.1.10", + "@antora/logger": "3.1.10", + "@antora/navigation-builder": "3.1.10", + "@antora/page-composer": "3.1.10", + "@antora/playbook-builder": "3.1.10", + "@antora/redirect-producer": "3.1.10", + "@antora/site-mapper": "3.1.10", + "@antora/site-publisher": "3.1.10", + "@antora/ui-loader": "3.1.10", + "@antora/user-require-helper": "~3.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@antora/site-mapper": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/@antora/site-mapper/-/site-mapper-3.1.10.tgz", + "integrity": "sha512-KY1j/y0uxC2Y7RAo4r4yKv9cgFm8aZoRylZXEODJnwj3tffbZ2ZdRzSWHp6fN0QX/Algrr9JNd9CWrjcj2f3Zw==", + "dev": true, + "dependencies": { + "@antora/content-classifier": "3.1.10", + "vinyl": "~3.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@antora/site-publisher": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/@antora/site-publisher/-/site-publisher-3.1.10.tgz", + "integrity": "sha512-G4xcUWvgth8oeEQwiu9U1cE0miQtYHwKHOobUbDBt2Y6LlC5H31zQQmAyvMwTsGRlvYRgLVtG6j9d6JBwQ6w9Q==", + "dev": true, + "dependencies": { + "@antora/file-publisher": "3.1.10" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@antora/ui-loader": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/@antora/ui-loader/-/ui-loader-3.1.10.tgz", + "integrity": "sha512-H1f5wI5a5HjLuE/Wexvc8NZy8w83Bhqjka7t1DbwOOqP+LyxFGLx/QbBVKdTtgFNDHVMtNBlplQq0ixeoTSh0A==", + "dev": true, + "dependencies": { + "@antora/expand-path-helper": "~3.0", + "braces": "~3.0", + "cache-directory": "~2.0", + "fast-glob": "~3.3", + "hpagent": "~1.2", + "js-yaml": "~4.1", + "picomatch": "~4.0", + "should-proxy": "~1.0", + "simple-get": "~4.0", + "vinyl": "~3.0", + "yauzl": "~3.1" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@antora/user-require-helper": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@antora/user-require-helper/-/user-require-helper-3.0.0.tgz", + "integrity": "sha512-KIXb8WYhnrnwH7Jj21l1w+et9k5GvcgcqvLOwxqWLEd0uVZOiMFdqFjqbVm3M+zcrs1JXWMeh2LLvxBbQs3q/Q==", + "dev": true, + "dependencies": { + "@antora/expand-path-helper": "~3.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@asciidoctor/core": { + "version": "2.2.8", + "resolved": "https://registry.npmjs.org/@asciidoctor/core/-/core-2.2.8.tgz", + "integrity": "sha512-oozXk7ZO1RAd/KLFLkKOhqTcG4GO3CV44WwOFg2gMcCsqCUTarvMT7xERIoWW2WurKbB0/ce+98r01p8xPOlBw==", + "dev": true, + "dependencies": { + "asciidoctor-opal-runtime": "0.3.3", + "unxhr": "1.0.1" + }, + "engines": { + "node": ">=8.11", + "npm": ">=5.0.0", + "yarn": ">=1.1.0" + } + }, + "node_modules/@iarna/toml": { + "version": "2.2.5", + "resolved": "https://registry.npmjs.org/@iarna/toml/-/toml-2.2.5.tgz", + "integrity": "sha512-trnsAYxU3xnS1gPHPyU961coFyLkh4gAD/0zQ5mymY4yOZ+CYvsPqUbOFSw0aDM4y0tV7tiFxL/1XfXPNC6IPg==", + "dev": true + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/abort-controller": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", + "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", + "dev": true, + "dependencies": { + "event-target-shim": "^5.0.0" + }, + "engines": { + "node": ">=6.5" + } + }, + "node_modules/antora": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/antora/-/antora-3.1.10.tgz", + "integrity": "sha512-FcXPfqxi5xrGF2fTrFiiau45q8w0bzRcnfk97nxvpvztPDHX/lUOrBF/GpaGl1JT5K085VkI3/dbxTlvWK1jjw==", + "dev": true, + "dependencies": { + "@antora/cli": "3.1.10", + "@antora/site-generator": "3.1.10" + }, + "bin": { + "antora": "bin/antora" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "node_modules/asciidoctor-opal-runtime": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/asciidoctor-opal-runtime/-/asciidoctor-opal-runtime-0.3.3.tgz", + "integrity": "sha512-/CEVNiOia8E5BMO9FLooo+Kv18K4+4JBFRJp8vUy/N5dMRAg+fRNV4HA+o6aoSC79jVU/aT5XvUpxSxSsTS8FQ==", + "dev": true, + "dependencies": { + "glob": "7.1.3", + "unxhr": "1.0.1" + }, + "engines": { + "node": ">=8.11" + } + }, + "node_modules/async-lock": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/async-lock/-/async-lock-1.4.1.tgz", + "integrity": "sha512-Az2ZTpuytrtqENulXwO3GGv1Bztugx6TT37NIo7imr/Qo0gsYiGtSdBa2B6fsXhTpVZDNfu1Qn3pk531e3q+nQ==", + "dev": true + }, + "node_modules/atomic-sleep": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/atomic-sleep/-/atomic-sleep-1.0.0.tgz", + "integrity": "sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==", + "dev": true, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/b4a": { + "version": "1.6.7", + "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.6.7.tgz", + "integrity": "sha512-OnAYlL5b7LEkALw87fUVafQw5rVR9RjwGd4KUwNQ6DrrNmaVaUCgLipfVlzrPQ4tWOR9P0IXGNOx50jYCCdSJg==", + "dev": true + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "node_modules/bare-events": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.5.0.tgz", + "integrity": "sha512-/E8dDe9dsbLyh2qrZ64PEPadOQ0F4gbl1sUJOrmph7xOiIxfY8vwab/4bFLh4Y88/Hk/ujKcrQKc+ps0mv873A==", + "dev": true, + "optional": true + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, + "node_modules/buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/cache-directory": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/cache-directory/-/cache-directory-2.0.0.tgz", + "integrity": "sha512-7YKEapH+2Uikde8hySyfobXBqPKULDyHNl/lhKm7cKf/GJFdG/tU/WpLrOg2y9aUrQrWUilYqawFIiGJPS6gDA==", + "dev": true, + "dependencies": { + "xdg-basedir": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/clean-git-ref": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/clean-git-ref/-/clean-git-ref-2.0.1.tgz", + "integrity": "sha512-bLSptAy2P0s6hU4PzuIMKmMJJSE6gLXGH1cntDu7bWJUksvuM+7ReOK61mozULErYvP6a15rnYl0zFDef+pyPw==", + "dev": true + }, + "node_modules/clone": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", + "integrity": "sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==", + "dev": true, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/clone-stats": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-1.0.0.tgz", + "integrity": "sha512-au6ydSpg6nsrigcZ4m8Bc9hxjeW+GJ8xh5G3BJCMt4WXe1H10UNaVOamqQTmrx1kjVuxAHIQSNU6hY4Nsn9/ag==", + "dev": true + }, + "node_modules/colorette": { + "version": "2.0.20", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", + "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", + "dev": true + }, + "node_modules/commander": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-11.1.0.tgz", + "integrity": "sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==", + "dev": true, + "engines": { + "node": ">=16" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true + }, + "node_modules/convict": { + "version": "6.2.4", + "resolved": "https://registry.npmjs.org/convict/-/convict-6.2.4.tgz", + "integrity": "sha512-qN60BAwdMVdofckX7AlohVJ2x9UvjTNoKVXCL2LxFk1l7757EJqf1nySdMkPQer0bt8kQ5lQiyZ9/2NvrFBuwQ==", + "dev": true, + "dependencies": { + "lodash.clonedeep": "^4.5.0", + "yargs-parser": "^20.2.7" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/crc-32": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz", + "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==", + "dev": true, + "bin": { + "crc32": "bin/crc32.njs" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/dateformat": { + "version": "4.6.3", + "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-4.6.3.tgz", + "integrity": "sha512-2P0p0pFGzHS5EMnhdxQi7aJN+iMheud0UhG4dlE1DLAlvL8JHjJJTX/CSm4JXwV0Ka5nGk3zC5mcb5bUQUxxMA==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/decompress-response": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", + "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", + "dev": true, + "dependencies": { + "mimic-response": "^3.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/diff3": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/diff3/-/diff3-0.0.3.tgz", + "integrity": "sha512-iSq8ngPOt0K53A6eVr4d5Kn6GNrM2nQZtC740pzIriHtn4pOQ2lyzEXQMBeVcWERN0ye7fhBsk9PbLLQOnUx/g==", + "dev": true + }, + "node_modules/end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dev": true, + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/event-target-shim": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", + "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "dev": true, + "engines": { + "node": ">=0.8.x" + } + }, + "node_modules/fast-copy": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/fast-copy/-/fast-copy-3.0.2.tgz", + "integrity": "sha512-dl0O9Vhju8IrcLndv2eU4ldt1ftXMqqfgN4H1cpmGV7P6jeB9FwpN9a2c8DPGE1Ys88rNUJVYDHq73CGAGOPfQ==", + "dev": true + }, + "node_modules/fast-fifo": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/fast-fifo/-/fast-fifo-1.3.2.tgz", + "integrity": "sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==", + "dev": true + }, + "node_modules/fast-glob": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", + "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-redact": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/fast-redact/-/fast-redact-3.5.0.tgz", + "integrity": "sha512-dwsoQlS7h9hMeYUq1W++23NDcBLV4KqONnITDV9DjfS3q1SgDGVrBdvvTLUotWtPSD7asWDV9/CmsZPy8Hf70A==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/fast-safe-stringify": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz", + "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==", + "dev": true + }, + "node_modules/fastq": { + "version": "1.18.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.18.0.tgz", + "integrity": "sha512-QKHXPW0hD8g4UET03SdOdunzSouc9N4AuHdsX8XNcTsuz+yYFILVNIX4l9yHABMhiEI9Db0JTTIpu0wB+Y1QQw==", + "dev": true, + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true + }, + "node_modules/glob": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", + "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/handlebars": { + "version": "4.7.8", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.8.tgz", + "integrity": "sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==", + "dev": true, + "dependencies": { + "minimist": "^1.2.5", + "neo-async": "^2.6.2", + "source-map": "^0.6.1", + "wordwrap": "^1.0.0" + }, + "bin": { + "handlebars": "bin/handlebars" + }, + "engines": { + "node": ">=0.4.7" + }, + "optionalDependencies": { + "uglify-js": "^3.1.4" + } + }, + "node_modules/help-me": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/help-me/-/help-me-5.0.0.tgz", + "integrity": "sha512-7xgomUX6ADmcYzFik0HzAxh/73YlKR9bmFzf51CZwR+b6YtzU2m0u49hQCqV6SvlqIqsaxovfwdvbnsw3b/zpg==", + "dev": true + }, + "node_modules/hpagent": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/hpagent/-/hpagent-1.2.0.tgz", + "integrity": "sha512-A91dYTeIB6NoXG+PxTQpCCDDnfHsW9kc06Lvpu1TEe9gnd6ZFeiBoRO9JvzEv6xK7EX97/dUE8g/vBMTqTS3CA==", + "dev": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", + "dev": true, + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/isomorphic-git": { + "version": "1.25.10", + "resolved": "https://registry.npmjs.org/isomorphic-git/-/isomorphic-git-1.25.10.tgz", + "integrity": "sha512-IxGiaKBwAdcgBXwIcxJU6rHLk+NrzYaaPKXXQffcA0GW3IUrQXdUPDXDo+hkGVcYruuz/7JlGBiuaeTCgIgivQ==", + "dev": true, + "dependencies": { + "async-lock": "^1.4.1", + "clean-git-ref": "^2.0.1", + "crc-32": "^1.2.0", + "diff3": "0.0.3", + "ignore": "^5.1.4", + "minimisted": "^2.0.0", + "pako": "^1.0.10", + "pify": "^4.0.1", + "readable-stream": "^3.4.0", + "sha.js": "^2.4.9", + "simple-get": "^4.0.1" + }, + "bin": { + "isogit": "cli.cjs" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/joycon": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/joycon/-/joycon-3.1.1.tgz", + "integrity": "sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/lodash.clonedeep": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", + "integrity": "sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==", + "dev": true + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "dev": true, + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/micromatch/node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dev": true, + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-response": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", + "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/minimisted": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/minimisted/-/minimisted-2.0.1.tgz", + "integrity": "sha512-1oPjfuLQa2caorJUM8HV8lGgWCc0qqAO1MNv/k05G4qslmsndV/5WdNZrqCiyqiz3wohia2Ij2B7w2Dr7/IyrA==", + "dev": true, + "dependencies": { + "minimist": "^1.2.5" + } + }, + "node_modules/multi-progress": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/multi-progress/-/multi-progress-4.0.0.tgz", + "integrity": "sha512-9zcjyOou3FFCKPXsmkbC3ethv51SFPoA4dJD6TscIp2pUmy26kBDZW6h9XofPELrzseSkuD7r0V+emGEeo39Pg==", + "dev": true, + "peerDependencies": { + "progress": "^2.0.0" + } + }, + "node_modules/neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "dev": true + }, + "node_modules/on-exit-leak-free": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/on-exit-leak-free/-/on-exit-leak-free-2.1.2.tgz", + "integrity": "sha512-0eJJY6hXLGf1udHwfNftBqH+g73EU4B504nZeKpz1sYRKafAghwxEJunB2O7rDZkL4PGfsMVnTXZ2EjibbqcsA==", + "dev": true, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/pako": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", + "dev": true + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pend": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", + "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==", + "dev": true + }, + "node_modules/picomatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", + "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/pino": { + "version": "9.2.0", + "resolved": "https://registry.npmjs.org/pino/-/pino-9.2.0.tgz", + "integrity": "sha512-g3/hpwfujK5a4oVbaefoJxezLzsDgLcNJeITvC6yrfwYeT9la+edCK42j5QpEQSQCZgTKapXvnQIdgZwvRaZug==", + "dev": true, + "dependencies": { + "atomic-sleep": "^1.0.0", + "fast-redact": "^3.1.1", + "on-exit-leak-free": "^2.1.0", + "pino-abstract-transport": "^1.2.0", + "pino-std-serializers": "^7.0.0", + "process-warning": "^3.0.0", + "quick-format-unescaped": "^4.0.3", + "real-require": "^0.2.0", + "safe-stable-stringify": "^2.3.1", + "sonic-boom": "^4.0.1", + "thread-stream": "^3.0.0" + }, + "bin": { + "pino": "bin.js" + } + }, + "node_modules/pino-abstract-transport": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pino-abstract-transport/-/pino-abstract-transport-1.2.0.tgz", + "integrity": "sha512-Guhh8EZfPCfH+PMXAb6rKOjGQEoy0xlAIn+irODG5kgfYV+BQ0rGYYWTIel3P5mmyXqkYkPmdIkywsn6QKUR1Q==", + "dev": true, + "dependencies": { + "readable-stream": "^4.0.0", + "split2": "^4.0.0" + } + }, + "node_modules/pino-abstract-transport/node_modules/readable-stream": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.6.0.tgz", + "integrity": "sha512-cbAdYt0VcnpN2Bekq7PU+k363ZRsPwJoEEJOEtSJQlJXzwaxt3FIo/uL+KeDSGIjJqtkwyge4KQgD2S2kd+CQw==", + "dev": true, + "dependencies": { + "abort-controller": "^3.0.0", + "buffer": "^6.0.3", + "events": "^3.3.0", + "process": "^0.11.10", + "string_decoder": "^1.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/pino-pretty": { + "version": "11.2.2", + "resolved": "https://registry.npmjs.org/pino-pretty/-/pino-pretty-11.2.2.tgz", + "integrity": "sha512-2FnyGir8nAJAqD3srROdrF1J5BIcMT4nwj7hHSc60El6Uxlym00UbCCd8pYIterstVBFlMyF1yFV8XdGIPbj4A==", + "dev": true, + "dependencies": { + "colorette": "^2.0.7", + "dateformat": "^4.6.3", + "fast-copy": "^3.0.2", + "fast-safe-stringify": "^2.1.1", + "help-me": "^5.0.0", + "joycon": "^3.1.1", + "minimist": "^1.2.6", + "on-exit-leak-free": "^2.1.0", + "pino-abstract-transport": "^1.0.0", + "pump": "^3.0.0", + "readable-stream": "^4.0.0", + "secure-json-parse": "^2.4.0", + "sonic-boom": "^4.0.1", + "strip-json-comments": "^3.1.1" + }, + "bin": { + "pino-pretty": "bin.js" + } + }, + "node_modules/pino-pretty/node_modules/readable-stream": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.6.0.tgz", + "integrity": "sha512-cbAdYt0VcnpN2Bekq7PU+k363ZRsPwJoEEJOEtSJQlJXzwaxt3FIo/uL+KeDSGIjJqtkwyge4KQgD2S2kd+CQw==", + "dev": true, + "dependencies": { + "abort-controller": "^3.0.0", + "buffer": "^6.0.3", + "events": "^3.3.0", + "process": "^0.11.10", + "string_decoder": "^1.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/pino-std-serializers": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/pino-std-serializers/-/pino-std-serializers-7.0.0.tgz", + "integrity": "sha512-e906FRY0+tV27iq4juKzSYPbUj2do2X2JX4EzSca1631EB2QJQUqGbDuERal7LCtOpxl6x3+nvo9NPZcmjkiFA==", + "dev": true + }, + "node_modules/process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", + "dev": true, + "engines": { + "node": ">= 0.6.0" + } + }, + "node_modules/process-warning": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/process-warning/-/process-warning-3.0.0.tgz", + "integrity": "sha512-mqn0kFRl0EoqhnL0GQ0veqFHyIN1yig9RHh/InzORTUiZHFRAur+aMtRkELNwGs9aNwKS6tg/An4NYBPGwvtzQ==", + "dev": true + }, + "node_modules/progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/pump": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.2.tgz", + "integrity": "sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw==", + "dev": true, + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/queue-tick": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/queue-tick/-/queue-tick-1.0.1.tgz", + "integrity": "sha512-kJt5qhMxoszgU/62PLP1CJytzd2NKetjSRnyuj31fDd3Rlcz3fzlFdFLD1SItunPwyqEOkca6GbV612BWfaBag==", + "dev": true + }, + "node_modules/quick-format-unescaped": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/quick-format-unescaped/-/quick-format-unescaped-4.0.4.tgz", + "integrity": "sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==", + "dev": true + }, + "node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/real-require": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/real-require/-/real-require-0.2.0.tgz", + "integrity": "sha512-57frrGM/OCTLqLOAh0mhVA9VBMHd+9U7Zb2THMGdBUoZVOtGbJzjxsYGDJ3A9AYYCP4hn6y1TVbaOfzWtm5GFg==", + "dev": true, + "engines": { + "node": ">= 12.13.0" + } + }, + "node_modules/remove-trailing-separator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", + "integrity": "sha512-/hS+Y0u3aOfIETiaiirUFwDBDzmXPvO+jAfKTitUngIPzdKc6Z0LoFjM/CK5PL4C+eKwHohlHAb6H0VFfmmUsw==", + "dev": true + }, + "node_modules/replace-ext": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-2.0.0.tgz", + "integrity": "sha512-UszKE5KVK6JvyD92nzMn9cDapSk6w/CaFZ96CnmDMUqH9oowfxF/ZjRITD25H4DnOQClLA4/j7jLGXXLVKxAug==", + "dev": true, + "engines": { + "node": ">= 10" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true, + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/safe-stable-stringify": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.5.0.tgz", + "integrity": "sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/secure-json-parse": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/secure-json-parse/-/secure-json-parse-2.7.0.tgz", + "integrity": "sha512-6aU+Rwsezw7VR8/nyvKTx8QpWH9FrcYiXXlqC4z5d5XQBDRqtbfsRjnwGyqbi3gddNtWHuEk9OANUotL26qKUw==", + "dev": true + }, + "node_modules/sha.js": { + "version": "2.4.11", + "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", + "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", + "dev": true, + "dependencies": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + }, + "bin": { + "sha.js": "bin.js" + } + }, + "node_modules/should-proxy": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/should-proxy/-/should-proxy-1.0.4.tgz", + "integrity": "sha512-RPQhIndEIVUCjkfkQ6rs6sOR6pkxJWCNdxtfG5pP0RVgUYbK5911kLTF0TNcCC0G3YCGd492rMollFT2aTd9iQ==", + "dev": true + }, + "node_modules/simple-concat": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", + "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/simple-get": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-4.0.1.tgz", + "integrity": "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "decompress-response": "^6.0.0", + "once": "^1.3.1", + "simple-concat": "^1.0.0" + } + }, + "node_modules/sonic-boom": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/sonic-boom/-/sonic-boom-4.0.1.tgz", + "integrity": "sha512-hTSD/6JMLyT4r9zeof6UtuBDpjJ9sO08/nmS5djaA9eozT9oOlNdpXSnzcgj4FTqpk3nkLrs61l4gip9r1HCrQ==", + "dev": true, + "dependencies": { + "atomic-sleep": "^1.0.0" + } + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/split2": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz", + "integrity": "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==", + "dev": true, + "engines": { + "node": ">= 10.x" + } + }, + "node_modules/streamx": { + "version": "2.21.1", + "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.21.1.tgz", + "integrity": "sha512-PhP9wUnFLa+91CPy3N6tiQsK+gnYyUNuk15S3YG/zjYE7RuPeCjJngqnzpC31ow0lzBHQ+QGO4cNJnd0djYUsw==", + "dev": true, + "dependencies": { + "fast-fifo": "^1.3.2", + "queue-tick": "^1.0.1", + "text-decoder": "^1.1.0" + }, + "optionalDependencies": { + "bare-events": "^2.2.0" + } + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/teex": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/teex/-/teex-1.0.1.tgz", + "integrity": "sha512-eYE6iEI62Ni1H8oIa7KlDU6uQBtqr4Eajni3wX7rpfXD8ysFx8z0+dri+KWEPWpBsxXfxu58x/0jvTVT1ekOSg==", + "dev": true, + "dependencies": { + "streamx": "^2.12.5" + } + }, + "node_modules/text-decoder": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/text-decoder/-/text-decoder-1.2.3.tgz", + "integrity": "sha512-3/o9z3X0X0fTupwsYvR03pJ/DjWuqqrfwBgTQzdWDiQSm9KitAyz/9WqsT2JQW7KV2m+bC2ol/zqpW37NHxLaA==", + "dev": true, + "dependencies": { + "b4a": "^1.6.4" + } + }, + "node_modules/thread-stream": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/thread-stream/-/thread-stream-3.1.0.tgz", + "integrity": "sha512-OqyPZ9u96VohAyMfJykzmivOrY2wfMSf3C5TtFJVgN+Hm6aj+voFhlK+kZEIv2FBh1X6Xp3DlnCOfEQ3B2J86A==", + "dev": true, + "dependencies": { + "real-require": "^0.2.0" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/uglify-js": { + "version": "3.19.3", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.19.3.tgz", + "integrity": "sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ==", + "dev": true, + "optional": true, + "bin": { + "uglifyjs": "bin/uglifyjs" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/unxhr": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/unxhr/-/unxhr-1.0.1.tgz", + "integrity": "sha512-MAhukhVHyaLGDjyDYhy8gVjWJyhTECCdNsLwlMoGFoNJ3o79fpQhtQuzmAE4IxCMDwraF4cW8ZjpAV0m9CRQbg==", + "dev": true, + "engines": { + "node": ">=8.11" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true + }, + "node_modules/vinyl": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-3.0.0.tgz", + "integrity": "sha512-rC2VRfAVVCGEgjnxHUnpIVh3AGuk62rP3tqVrn+yab0YH7UULisC085+NYH+mnqf3Wx4SpSi1RQMwudL89N03g==", + "dev": true, + "dependencies": { + "clone": "^2.1.2", + "clone-stats": "^1.0.0", + "remove-trailing-separator": "^1.1.0", + "replace-ext": "^2.0.0", + "teex": "^1.0.1" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/wordwrap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==", + "dev": true + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true + }, + "node_modules/xdg-basedir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-3.0.0.tgz", + "integrity": "sha512-1Dly4xqlulvPD3fZUQJLY+FUIeqN3N2MM3uqe4rCJftAvOjFa3jFGfctOgluGx4ahPbUCsZkmJILiP0Vi4T6lQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/yauzl": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-3.1.3.tgz", + "integrity": "sha512-JCCdmlJJWv7L0q/KylOekyRaUrdEoUxWkWVcgorosTROCFWiS9p2NNPE9Yb91ak7b1N5SxAZEliWpspbZccivw==", + "dev": true, + "dependencies": { + "buffer-crc32": "~0.2.3", + "pend": "~1.2.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yazl": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/yazl/-/yazl-2.5.1.tgz", + "integrity": "sha512-phENi2PLiHnHb6QBVot+dJnaAZ0xosj7p3fWl+znIjBDlnMI2PsZCJZ306BPTFOaHf5qdDEI8x5qFrSOBN5vrw==", + "dev": true, + "dependencies": { + "buffer-crc32": "~0.2.3" + } + } + } + } diff --git a/doc/package.json b/doc/package.json new file mode 100644 index 00000000..ff17a156 --- /dev/null +++ b/doc/package.json @@ -0,0 +1,7 @@ +{ + "devDependencies": { + "@antora/cli": "3.1.10", + "@antora/site-generator": "3.1.10", + "antora": "3.1.10" + } + } diff --git a/doc/preview.md b/doc/preview.md deleted file mode 100644 index 872f05be..00000000 --- a/doc/preview.md +++ /dev/null @@ -1,47 +0,0 @@ -# Building Boost from the Tip of Develop - -To build Boost from the tip of the develop branch without cloning the entire -history, use the command below: - -Linux: -```bash -cwd=$(pwd) \ - && cd ~ \ - && git clone -b develop --depth 1 --recurse-submodules --shallow-submodules --jobs 8 https://github.com/boostorg/boost.git boost-develop-beta \ - && cd boost-develop-beta \ - && ./bootstrap.sh \ - && ./b2 install --prefix=boost-install cxxstd=17 \ - && echo "Boost successfully installed into $(realpath boost-install)! - Add this to your CMake toolchain file. - list(APPEND CMAKE_PREFIX_PATH $(realpath boost-install)) - " \ - && cd $cwd -``` - -Windows (using plain Command Prompt): -```bat -cmd /v -set cwd=%cd% ^ - && cd %homepath% ^ - && git clone -b develop --depth 1 --recurse-submodules --shallow-submodules --jobs 8 https://github.com/boostorg/boost.git boost-develop-beta ^ - && cd boost-develop-beta ^ - && bootstrap.bat ^ - && b2 install --prefix=boost-install cxxstd=17 address-model=64 ^ - && echo Boost successfully installed into !cd!\boost-install! ^ - && echo Add this to your CMake toolchain file. ^ - && echo list(APPEND CMAKE_PREFIX_PATH !cd:\=/!/boost-install) ^ - && cd !cwd! ^ - && exit -``` - -Note: you can build Boost with a specific compiler by setting the toolset in -the `./b2` command above. To build with clang, specify `toolset=clang`; to build -with a specific version of gcc, clang or msvc, specify e.g. `toolset=gcc-12` for GCC -12, `clang-14` for Clang 14, `msvc-14.3` for MSVC 14.3. The value of `cxxstd` -can also be set to other values such as 11 for C++11, 14 for C++14, etc. - -For more info on what's possible, check out this link on b2: -https://www.boost.org/doc/libs/develop/tools/build/doc/html/index.html#bbv2.overview.builtins.features - -This should hopefully cover the two most common cases of building a dependency, -setting the compiler and C++ standard used. diff --git a/doc/roadmap.md b/doc/roadmap.md deleted file mode 100644 index 88267547..00000000 --- a/doc/roadmap.md +++ /dev/null @@ -1,188 +0,0 @@ -# Refactoring Roadmap - -[Proof of concept](https://github.com/joaquintides/fca_unordered) implementation for a fast closed-addressing implementation. - -## Plan of Refactoring - -* remove `ptr_node` and `ptr_bucket` -* see if the code can survive a lack of the `extra_node` or maybe we hard-code it in -* implement bucket groups as they are in `fca` but don't use them directly yet, add alongside the `buckets_` data member in `struct table` -* try to remove `bucket_info_` from the node structure (breaks all call-sites that use `get_bucket()` and dependents) -* make sure `fca` can successfully handle multi-variants at this stage + supports mutable iterators for `map`/`multimap` -* do a hard-break: - * update code to no longer use one single linked list across all buckets (each bucket contains its own unique list) - * integrate the `bucket_group` structure into the `table` (update iterator call-sites to include `bucket_iterator`s) - -Blockers: -* how to handle `multi` variants with new `fca` prototype - -## Implementation Differences - -### Unordered - -### Node Type - -Bullet Points: -* reify node type into a single one -* come up with implementation for multi- variants -* code that touches `get_bucket()` and `*_in_group()` member functions may need updating - -There are two node types in Unordered, `struct node` and `struct ptr_node`, and the node type is selected conditionally based on the Allocator's pointer type: -```c++ -template -struct pick_node2 -{ - typedef boost::unordered::detail::node node; - // ... -}; - -template -struct pick_node2*, - boost::unordered::detail::ptr_bucket*> -{ - typedef boost::unordered::detail::ptr_node node; - // ... -}; - -template struct pick_node -{ - typedef typename boost::remove_const::type nonconst; - - typedef boost::unordered::detail::allocator_traits< - typename boost::unordered::detail::rebind_wrap >::type> - tentative_node_traits; - - typedef boost::unordered::detail::allocator_traits< - typename boost::unordered::detail::rebind_wrap::type> - tentative_bucket_traits; - - typedef pick_node2 - pick; - - typedef typename pick::node node; - typedef typename pick::bucket bucket; - typedef typename pick::link_pointer link_pointer; -}; -``` - -The node types are identical in terms of interface and the only difference is that `node` is chosen when the Allocator uses fancy pointers and `ptr_node` is chosen when the Allocator's pointer type is `T*`. - -Nodes in Unorderd store `bucket_info_`: -```cpp -template -struct node : boost::unordered::detail::value_base -{ - link_pointer next_; - std::size_t bucket_info_; - node() : next_(), bucket_info_(0) {} - // ... -}; -``` - -`bucket_info_` maps each node back to its corresponding bucket via the member function: -```cpp -std::size_t get_bucket() const -{ - return bucket_info_ & ((std::size_t)-1 >> 1); -} -``` - -`bucket_info_` is also used to demarcate the start of equivalent nodes in the containers via: -```cpp -// Note that nodes start out as the first in their group, as `bucket_info_` defaults to 0. -std::size_t is_first_in_group() const -{ return !(bucket_info_ & ~((std::size_t)-1 >> 1)); } - -void set_first_in_group() -{ bucket_info_ = bucket_info_ & ((std::size_t)-1 >> 1); } - -void reset_first_in_group() -{ bucket_info_ = bucket_info_ | ~((std::size_t)-1 >> 1); } -``` - -A goal of refactoring is to simply have one node type: -```cpp -template -struct node { - node *next; - T value; -}; -``` -that is used unconditionally. This also requires updating the code that touches the `bucket_info_` along with the code that that touches the `*_in_group()` member functions. - -### Bucket Type - -Bullet points: -* reify bucket structure into a single one -* figure out how to add `bucket_group`s to the table struct - -Buckets are similar to nodes in that there are two variations: `template struct bucket` and `struct ptr_bucket`. - -The buckets exist to contain a pointer to a node, however they contain an `enum { extra_node = true };` or `enum { extra_node = false }` to determine whether or not the code should explicitly allocate a default constructed node whose address assigned as the dummy node at the end of the bucket array. - -`extra_node` is used in the creation and deletion of the bucket array but it is not inherently clear what its intended purpose is. - -### Iterators - -Iterators are currently templated on the type of Node they store. Because `fca` constructs iterators with two arguments, all the call-sites that instantiate iterators will need to be updated but this a straight-forward mechanical change. - -Iterators are selected, as of now, via the `detail::map` and `detail::set` class templates. - -For example, for `unordered_map`, `iterator` is defined as: -```cpp -typedef boost::unordered::detail::map types; -typedef typename types::table table; -typedef typename table::iterator iterator; -``` - -The iterator is a member typedef of the `table` which is `types::table`. Examining `types` (aka `detail::map<...>`), we see: -```cpp -template -struct map { - // ... - typedef boost::unordered::detail::table table; - // ... -}; -``` - -Examining the `detail::table` struct, we see: -```cpp -template -struct table { - // ... - typedef typename Types::iterator iterator; - // ... -} -``` - -Collapsing all of this, we see that our iterator types are defined here: -```cpp -template -struct map -{ - // ... - typedef boost::unordered::detail::pick_node pick; - typedef typename pick::node node; - - typedef boost::unordered::iterator_detail::iterator iterator; - typedef boost::unordered::iterator_detail::c_iterator c_iterator; - typedef boost::unordered::iterator_detail::l_iterator l_iterator; - typedef boost::unordered::iterator_detail::cl_iterator - cl_iterator; - // ... -}; -``` - -This is similarly designed for `detail::set`: -```cpp -typedef boost::unordered::iterator_detail::c_iterator iterator; -typedef boost::unordered::iterator_detail::c_iterator c_iterator; -typedef boost::unordered::iterator_detail::cl_iterator l_iterator; -typedef boost::unordered::iterator_detail::cl_iterator - cl_iterator; -``` - -The only difference here is that `set::iterator` is always a `c_iterator`, a `const_iterator` type. diff --git a/doc/unordered-playbook.yml b/doc/unordered-playbook.yml new file mode 100644 index 00000000..94cbb1ef --- /dev/null +++ b/doc/unordered-playbook.yml @@ -0,0 +1,14 @@ +site: + title: Boost.Unordered + start_page: unordered::index.adoc +content: + sources: + - url: .. + start_path: doc + branches: HEAD +output: + dir: html +ui: + bundle: + url: https://github.com/cmazakas/unordered-ui-bundle/raw/450505aa457796028a36e9d712e5d52f9f394c1a/ui-bundle.zip + output_dir: unordered/_ diff --git a/doc/unordered.adoc b/doc/unordered.adoc deleted file mode 100644 index 8f339623..00000000 --- a/doc/unordered.adoc +++ /dev/null @@ -1,27 +0,0 @@ -= Boost.Unordered -:toc: left -:toclevels: 3 -:idprefix: -:docinfo: private-footer -:source-highlighter: rouge -:source-language: c++ -:nofooter: -:sectlinks: - -:leveloffset: +1 - -include::unordered/intro.adoc[] -include::unordered/buckets.adoc[] -include::unordered/hash_equality.adoc[] -include::unordered/regular.adoc[] -include::unordered/concurrent.adoc[] -include::unordered/hash_quality.adoc[] -include::unordered/compliance.adoc[] -include::unordered/structures.adoc[] -include::unordered/debuggability.adoc[] -include::unordered/benchmarks.adoc[] -include::unordered/rationale.adoc[] -include::unordered/ref.adoc[] -include::unordered/changes.adoc[] -include::unordered/bibliography.adoc[] -include::unordered/copyright.adoc[] diff --git a/doc/unordered/benchmarks.adoc b/doc/unordered/benchmarks.adoc deleted file mode 100644 index a19a5270..00000000 --- a/doc/unordered/benchmarks.adoc +++ /dev/null @@ -1,726 +0,0 @@ -[#benchmarks] -:idprefix: benchmarks_ -:imagesdir: ../diagrams - -= Benchmarks - -== boost::unordered_[multi]set - -All benchmarks were created using `unordered_set` (non-duplicate) and `unordered_multiset` (duplicate). The source code can be https://github.com/boostorg/boost_unordered_benchmarks/tree/boost_unordered_set[found here^]. - -The insertion benchmarks insert `n` random values, where `n` is between 10,000 and 3 million. For the duplicated benchmarks, the same random values are repeated an average of 5 times. - -The erasure benchmarks erase all `n` elements randomly until the container is empty. Erasure by key uses `erase(const key_type&)` to remove entire groups of equivalent elements in each operation. - -The successful lookup benchmarks are done by looking up all `n` values, in their original insertion order. - -The unsuccessful lookup benchmarks use `n` randomly generated integers but using a different seed value. - -=== GCC 12 + libstdc++-v3, x64 - -==== Insertion - -[caption=] -[cols="3*^.^a", frame=all, grid=all] -|=== - -|image::benchmarks-set/gcc/running insertion.xlsx.practice.png[width=250,link=../diagrams/benchmarks-set/gcc/running insertion.xlsx.practice.png,window=_blank] -|image::benchmarks-set/gcc/running%20insertion.xlsx.practice non-unique.png[width=250,link=../diagrams/benchmarks-set/gcc/running%20insertion.xlsx.practice non-unique.png,window=_blank] -|image::benchmarks-set/gcc/running%20insertion.xlsx.practice non-unique 5.png[width=250,link=../diagrams/benchmarks-set/gcc/running%20insertion.xlsx.practice non-unique 5.png,window=_blank] - -h|non-duplicate elements -h|duplicate elements -h|duplicate elements, + -max load factor 5 -|=== - -[caption=] -[cols="3*^.^a", frame=all, grid=all] -|=== - -|image::benchmarks-set/gcc/running%20insertion.xlsx.practice norehash.png[width=250,link=../diagrams/benchmarks-set/gcc/running%20insertion.xlsx.practice norehash.png,window=_blank] -|image::benchmarks-set/gcc/running%20insertion.xlsx.practice norehash non-unique.png[width=250,link=../diagrams/benchmarks-set/gcc/running%20insertion.xlsx.practice norehash non-unique.png,window=_blank] -|image::benchmarks-set/gcc/running%20insertion.xlsx.practice norehash non-unique 5.png[width=250,link=../diagrams/benchmarks-set/gcc/running%20insertion.xlsx.practice norehash non-unique 5.png,window=_blank] - -h|non-duplicate elements, + -prior `reserve` -h|duplicate elements, + -prior `reserve` -h|duplicate elements, + -max load factor 5, + -prior `reserve` - -|=== - -==== Erasure - -[caption=] -[cols="3*^.^a", frame=all, grid=all] -|=== - -|image::benchmarks-set/gcc/scattered%20erasure.xlsx.practice.png[width=250,link=../diagrams/benchmarks-set/gcc/scattered%20erasure.xlsx.practice.png,window=_blank] -|image::benchmarks-set/gcc/scattered%20erasure.xlsx.practice non-unique.png[width=250,link=../diagrams/benchmarks-set/gcc/scattered%20erasure.xlsx.practice non-unique.png,window=_blank] -|image::benchmarks-set/gcc/scattered%20erasure.xlsx.practice non-unique 5.png[width=250,link=../diagrams/benchmarks-set/gcc/scattered%20erasure.xlsx.practice non-unique 5.png,window=_blank] - -h|non-duplicate elements -h|duplicate elements -h|duplicate elements, + -max load factor 5 - -| -|image::benchmarks-set/gcc/scattered%20erasure%20by%20key.xlsx.practice non-unique.png[width=250,link=../diagrams/benchmarks-set/gcc/scattered%20erasure%20by%20key.xlsx.practice non-unique.png,window=_blank] -|image::benchmarks-set/gcc/scattered%20erasure%20by%20key.xlsx.practice non-unique 5.png[width=250,link=../diagrams/benchmarks-set/gcc/scattered%20erasure%20by%20key.xlsx.practice non-unique 5.png,window=_blank] - -| -h|by key, duplicate elements -h|by key, duplicate elements, + -max load factor 5 - -|=== - -==== Successful Lookup - -[caption=] -[cols="3*^.^a", frame=all, grid=all] -|=== - -|image::benchmarks-set/gcc/scattered%20successful%20looukp.xlsx.practice.png[width=250,window=_blank,link=../diagrams/benchmarks-set/gcc/scattered%20successful%20looukp.xlsx.practice.png] -|image::benchmarks-set/gcc/scattered%20successful%20looukp.xlsx.practice non-unique.png[width=250,window=_blank,link=../diagrams/benchmarks-set/gcc/scattered%20successful%20looukp.xlsx.practice non-unique.png] -|image::benchmarks-set/gcc/scattered%20successful%20looukp.xlsx.practice non-unique 5.png[width=250,window=_blank,link=../diagrams/benchmarks-set/gcc/scattered%20successful%20looukp.xlsx.practice non-unique 5.png] - -h|non-duplicate elements -h|duplicate elements -h|duplicate elements, + -max load factor 5 - -|=== - -==== Unsuccessful lookup - -[caption=] -[cols="3*^.^a", frame=all, grid=all] -|=== - -|image::benchmarks-set/gcc/scattered%20unsuccessful%20looukp.xlsx.practice.png[width=250,window=_blank,link=../diagrams/benchmarks-set/gcc/scattered%20unsuccessful%20looukp.xlsx.practice.png] -|image::benchmarks-set/gcc/scattered%20unsuccessful%20looukp.xlsx.practice non-unique.png[width=250,window=_blank,link=../diagrams/benchmarks-set/gcc/scattered%20unsuccessful%20looukp.xlsx.practice non-unique.png] -|image::benchmarks-set/gcc/scattered%20unsuccessful%20looukp.xlsx.practice non-unique 5.png[width=250,window=_blank,link=../diagrams/benchmarks-set/gcc/scattered%20unsuccessful%20looukp.xlsx.practice non-unique 5.png] - -h|non-duplicate elements -h|duplicate elements -h|duplicate elements, + -max load factor 5 - -|=== - -=== Clang 15 + libc++, x64 - -==== Insertion - -[caption=] -[cols="3*^.^a", frame=all, grid=all] -|=== - -|image::benchmarks-set/clang_libcpp/running%20insertion.xlsx.practice.png[width=250, window=_blank,link=../diagrams/benchmarks-set/clang_libcpp/running%20insertion.xlsx.practice.png] -|image::benchmarks-set/clang_libcpp/running%20insertion.xlsx.practice non-unique.png[width=250, window=_blank,link=../diagrams/benchmarks-set/clang_libcpp/running%20insertion.xlsx.practice non-unique.png] -|image::benchmarks-set/clang_libcpp/running%20insertion.xlsx.practice non-unique 5.png[width=250, window=_blank,link=../diagrams/benchmarks-set/clang_libcpp/running%20insertion.xlsx.practice non-unique 5.png] - -h|non-duplicate elements -h|duplicate elements -h|duplicate elements, + -max load factor 5 - -|=== - -[caption=] -[cols="3*^.^a", frame=all, grid=all] -|=== - -|image::benchmarks-set/clang_libcpp/running%20insertion.xlsx.practice norehash.png[width=250,window=_blank,link=../diagrams/benchmarks-set/clang_libcpp/running%20insertion.xlsx.practice norehash.png] -|image::benchmarks-set/clang_libcpp/running%20insertion.xlsx.practice norehash non-unique.png[width=250,window=_blank,link=../diagrams/benchmarks-set/clang_libcpp/running%20insertion.xlsx.practice norehash non-unique.png] -|image::benchmarks-set/clang_libcpp/running%20insertion.xlsx.practice norehash non-unique 5.png[width=250,window=_blank,link=../diagrams/benchmarks-set/clang_libcpp/running%20insertion.xlsx.practice norehash non-unique 5.png] - -h|non-duplicate elements, + -prior `reserve` -h|duplicate elements, + -prior `reserve` -h|duplicate elements, + -max load factor 5, + -prior `reserve` - -|=== - -==== Erasure - -[caption=] -[cols="3*^.^a", frame=all, grid=all] -|=== - -|image::benchmarks-set/clang_libcpp/scattered%20erasure.xlsx.practice.png[width=250,window=_blank,link=../diagrams/benchmarks-set/clang_libcpp/scattered%20erasure.xlsx.practice.png] -|image::benchmarks-set/clang_libcpp/scattered%20erasure.xlsx.practice non-unique.png[width=250,window=_blank,link=../diagrams/benchmarks-set/clang_libcpp/scattered%20erasure.xlsx.practice non-unique.png] -|image::benchmarks-set/clang_libcpp/scattered%20erasure.xlsx.practice non-unique 5.png[width=250,window=_blank,link=../diagrams/benchmarks-set/clang_libcpp/scattered%20erasure.xlsx.practice non-unique 5.png] - -h|non-duplicate elements -h|duplicate elements -h|duplicate elements, + -max load factor 5 - -| -|image::benchmarks-set/clang_libcpp/scattered%20erasure%20by%20key.xlsx.practice non-unique.png[width=250,link=../diagrams/benchmarks-set/clang_libcpp/scattered%20erasure%20by%20key.xlsx.practice non-unique.png,window=_blank] -|image::benchmarks-set/clang_libcpp/scattered%20erasure%20by%20key.xlsx.practice non-unique 5.png[width=250,link=../diagrams/benchmarks-set/clang_libcpp/scattered%20erasure%20by%20key.xlsx.practice non-unique 5.png,window=_blank] - -| -h|by key, duplicate elements -h|by key, duplicate elements, + -max load factor 5 - -|=== - -==== Successful lookup - -[caption=] -[cols="3*^.^a", frame=all, grid=all] -|=== - -|image::benchmarks-set/clang_libcpp/scattered%20successful%20looukp.xlsx.practice.png[width=250,window=_blank,link=../diagrams/benchmarks-set/clang_libcpp/scattered%20successful%20looukp.xlsx.practice.png] -|image::benchmarks-set/clang_libcpp/scattered%20successful%20looukp.xlsx.practice non-unique.png[width=250,window=_blank,link=../diagrams/benchmarks-set/clang_libcpp/scattered%20successful%20looukp.xlsx.practice non-unique.png] -|image::benchmarks-set/clang_libcpp/scattered%20successful%20looukp.xlsx.practice non-unique 5.png[width=250,window=_blank,link=../diagrams/benchmarks-set/clang_libcpp/scattered%20successful%20looukp.xlsx.practice non-unique 5.png] - -h|non-duplicate elements -h|duplicate elements -h|duplicate elements, + -max load factor 5 - -|=== - -==== Unsuccessful lookup - -[caption=] -[cols="3*^.^a", frame=all, grid=all] -|=== - -|image::benchmarks-set/clang_libcpp/scattered%20unsuccessful%20looukp.xlsx.practice.png[width=250,window=_blank,link=../diagrams/benchmarks-set/clang_libcpp/scattered%20unsuccessful%20looukp.xlsx.practice.png] -|image::benchmarks-set/clang_libcpp/scattered%20unsuccessful%20looukp.xlsx.practice non-unique.png[width=250,window=_blank,link=../diagrams/benchmarks-set/clang_libcpp/scattered%20unsuccessful%20looukp.xlsx.practice non-unique.png] -|image::benchmarks-set/clang_libcpp/scattered%20unsuccessful%20looukp.xlsx.practice non-unique 5.png[width=250,window=_blank,link=../diagrams/benchmarks-set/clang_libcpp/scattered%20unsuccessful%20looukp.xlsx.practice non-unique 5.png] - -h|non-duplicate elements -h|duplicate elements -h|duplicate elements, + -max load factor 5 - -|=== - -=== Visual Studio 2022 + Dinkumware, x64 - -==== Insertion - -[caption=] -[cols="3*^.^a", frame=all, grid=all] -|=== - -|image::benchmarks-set/vs/running%20insertion.xlsx.practice.png[width=250,window=_blank,link=../diagrams/benchmarks-set/vs/running%20insertion.xlsx.practice.png] -|image::benchmarks-set/vs/running%20insertion.xlsx.practice non-unique.png[width=250,window=_blank,link=../diagrams/benchmarks-set/vs/running%20insertion.xlsx.practice non-unique.png] -|image::benchmarks-set/vs/running%20insertion.xlsx.practice non-unique 5.png[width=250,window=_blank,link=../diagrams/benchmarks-set/vs/running%20insertion.xlsx.practice non-unique 5.png] - -h|non-duplicate elements -h|duplicate elements -h|duplicate elements, + -max load factor 5 - -|=== - -[caption=] -[cols="3*^.^a", frame=all, grid=all] -|=== - -|image::benchmarks-set/vs/running%20insertion.xlsx.practice norehash.png[width=250,window=_blank,link=../diagrams/benchmarks-set/vs/running%20insertion.xlsx.practice norehash.png] -|image::benchmarks-set/vs/running%20insertion.xlsx.practice norehash non-unique.png[width=250,window=_blank,link=../diagrams/benchmarks-set/vs/running%20insertion.xlsx.practice norehash non-unique.png] -|image::benchmarks-set/vs/running%20insertion.xlsx.practice norehash non-unique 5.png[width=250,window=_blank,link=../diagrams/benchmarks-set/vs/running%20insertion.xlsx.practice norehash non-unique 5.png] - -h|non-duplicate elements, + -prior `reserve` -h|duplicate elements, + -prior `reserve` -h|duplicate elements, + -max load factor 5, + -prior `reserve` - -|=== - -==== Erasure - -[caption=] -[cols="3*^.^a", frame=all, grid=all] -|=== - -|image::benchmarks-set/vs/scattered%20erasure.xlsx.practice.png[width=250,window=_blank,link=../diagrams/benchmarks-set/vs/scattered%20erasure.xlsx.practice.png] -|image::benchmarks-set/vs/scattered%20erasure.xlsx.practice non-unique.png[width=250,window=_blank,link=../diagrams/benchmarks-set/vs/scattered%20erasure.xlsx.practice non-unique.png] -|image::benchmarks-set/vs/scattered%20erasure.xlsx.practice non-unique 5.png[width=250,window=_blank,link=../diagrams/benchmarks-set/vs/scattered%20erasure.xlsx.practice non-unique 5.png] - -h|non-duplicate elements -h|duplicate elements -h|duplicate elements, + -max load factor 5 - -| -|image::benchmarks-set/vs/scattered%20erasure%20by%20key.xlsx.practice non-unique.png[width=250,link=../diagrams/benchmarks-set/vs/scattered%20erasure%20by%20key.xlsx.practice non-unique.png,window=_blank] -|image::benchmarks-set/vs/scattered%20erasure%20by%20key.xlsx.practice non-unique 5.png[width=250,link=../diagrams/benchmarks-set/vs/scattered%20erasure%20by%20key.xlsx.practice non-unique 5.png,window=_blank] - -| -h|by key, duplicate elements -h|by key, duplicate elements, + -max load factor 5 - -|=== - -==== Successful lookup - -[caption=] -[cols="3*^.^a", frame=all, grid=all] -|=== - -|image::benchmarks-set/vs/scattered%20successful%20looukp.xlsx.practice.png[width=250,window=_blank,link=../diagrams/benchmarks-set/vs/scattered%20successful%20looukp.xlsx.practice.png] -|image::benchmarks-set/vs/scattered%20successful%20looukp.xlsx.practice non-unique.png[width=250,window=_blank,link=../diagrams/benchmarks-set/vs/scattered%20successful%20looukp.xlsx.practice non-unique.png] -|image::benchmarks-set/vs/scattered%20successful%20looukp.xlsx.practice non-unique 5.png[width=250,window=_blank,link=../diagrams/benchmarks-set/vs/scattered%20successful%20looukp.xlsx.practice non-unique 5.png] - -h|non-duplicate elements -h|duplicate elements -h|duplicate elements, + -max load factor 5 - -|=== - -==== Unsuccessful lookup - -[caption=] -[cols="3*^.^a", frame=all, grid=all] -|=== - -|image::benchmarks-set/vs/scattered%20unsuccessful%20looukp.xlsx.practice.png[width=250,window=_blank,link=../diagrams/benchmarks-set/vs/scattered%20unsuccessful%20looukp.xlsx.practice.png] -|image::benchmarks-set/vs/scattered%20unsuccessful%20looukp.xlsx.practice non-unique.png[width=250,window=_blank,link=../diagrams/benchmarks-set/vs/scattered%20unsuccessful%20looukp.xlsx.practice non-unique.png] -|image::benchmarks-set/vs/scattered%20unsuccessful%20looukp.xlsx.practice non-unique 5.png[width=250,window=_blank,link=../diagrams/benchmarks-set/vs/scattered%20unsuccessful%20looukp.xlsx.practice non-unique 5.png] - -h|non-duplicate elements -h|duplicate elements -h|duplicate elements, + -max load factor 5 - -|=== - -== boost::unordered_(flat|node)_map - -All benchmarks were created using: - -* `https://abseil.io/docs/cpp/guides/container[absl::flat_hash_map^]` -* `boost::unordered_map` -* `boost::unordered_flat_map` -* `boost::unordered_node_map` - -The source code can be https://github.com/boostorg/boost_unordered_benchmarks/tree/boost_unordered_flat_map[found here^]. - -The insertion benchmarks insert `n` random values, where `n` is between 10,000 and 10 million. - -The erasure benchmarks erase traverse the `n` elements and erase those with odd key (50% on average). - -The successful lookup benchmarks are done by looking up all `n` values, in their original insertion order. - -The unsuccessful lookup benchmarks use `n` randomly generated integers but using a different seed value. - - -=== GCC 12, x64 - - -[caption=] -[cols="4*^.^a", frame=all, grid=all] -|=== - -|image::benchmarks-flat_map/gcc-x64/Running%20insertion.xlsx.plot.png[width=250,window=_blank,link=../diagrams/benchmarks-flat_map/gcc-x64/Running%20insertion.xlsx.plot.png] -|image::benchmarks-flat_map/gcc-x64/Running%20erasure.xlsx.plot.png[width=250,window=_blank,link=../diagrams/benchmarks-flat_map/gcc-x64/Running%20erasure.xlsx.plot.png] -|image::benchmarks-flat_map/gcc-x64/Scattered%20successful%20looukp.xlsx.plot.png[width=250,window=_blank,link=../diagrams/benchmarks-flat_map/gcc-x64/Scattered%20successful%20looukp.xlsx.plot.png] -|image::benchmarks-flat_map/gcc-x64/Scattered%20unsuccessful%20looukp.xlsx.plot.png[width=250,window=_blank,link=../diagrams/benchmarks-flat_map/gcc-x64/Scattered%20unsuccessful%20looukp.xlsx.plot.png] - -h|running insertion -h|running erasure -h|successful lookup -h|unsuccessful lookup - -|=== - -=== Clang 15, x64 - - -[caption=] -[cols="4*^.^a", frame=all, grid=all] -|=== - -|image::benchmarks-flat_map/clang-x64/Running%20insertion.xlsx.plot.png[width=250,window=_blank,link=../diagrams/benchmarks-flat_map/clang-x64/Running%20insertion.xlsx.plot.png] -|image::benchmarks-flat_map/clang-x64/Running%20erasure.xlsx.plot.png[width=250,window=_blank,link=../diagrams/benchmarks-flat_map/clang-x64/Running%20erasure.xlsx.plot.png] -|image::benchmarks-flat_map/clang-x64/Scattered%20successful%20looukp.xlsx.plot.png[width=250,window=_blank,link=../diagrams/benchmarks-flat_map/clang-x64/Scattered%20successful%20looukp.xlsx.plot.png] -|image::benchmarks-flat_map/clang-x64/Scattered%20unsuccessful%20looukp.xlsx.plot.png[width=250,window=_blank,link=../diagrams/benchmarks-flat_map/clang-x64/Scattered%20unsuccessful%20looukp.xlsx.plot.png] - -h|running insertion -h|running erasure -h|successful lookup -h|unsuccessful lookup - -|=== - -=== Visual Studio 2022, x64 - - -[caption=] -[cols="4*^.^a", frame=all, grid=all] -|=== - -|image::benchmarks-flat_map/vs-x64/Running%20insertion.xlsx.plot.png[width=250,window=_blank,link=../diagrams/benchmarks-flat_map/vs-x64/Running%20insertion.xlsx.plot.png] -|image::benchmarks-flat_map/vs-x64/Running%20erasure.xlsx.plot.png[width=250,window=_blank,link=../diagrams/benchmarks-flat_map/vs-x64/Running%20erasure.xlsx.plot.png] -|image::benchmarks-flat_map/vs-x64/Scattered%20successful%20looukp.xlsx.plot.png[width=250,window=_blank,link=../diagrams/benchmarks-flat_map/vs-x64/Scattered%20successful%20looukp.xlsx.plot.png] -|image::benchmarks-flat_map/vs-x64/Scattered%20unsuccessful%20looukp.xlsx.plot.png[width=250,window=_blank,link=../diagrams/benchmarks-flat_map/vs-x64/Scattered%20unsuccessful%20looukp.xlsx.plot.png] - -h|running insertion -h|running erasure -h|successful lookup -h|unsuccessful lookup - -|=== - -=== Clang 12, ARM64 - - -[caption=] -[cols="4*^.^a", frame=all, grid=all] -|=== - -|image::benchmarks-flat_map/clang-arm64/Running%20insertion.xlsx.plot.png[width=250,window=_blank,link=../diagrams/benchmarks-flat_map/clang-arm64/Running%20insertion.xlsx.plot.png] -|image::benchmarks-flat_map/clang-arm64/Running%20erasure.xlsx.plot.png[width=250,window=_blank,link=../diagrams/benchmarks-flat_map/clang-arm64/Running%20erasure.xlsx.plot.png] -|image::benchmarks-flat_map/clang-arm64/Scattered%20successful%20looukp.xlsx.plot.png[width=250,window=_blank,link=../diagrams/benchmarks-flat_map/clang-arm64/Scattered%20successful%20looukp.xlsx.plot.png] -|image::benchmarks-flat_map/clang-arm64/Scattered%20unsuccessful%20looukp.xlsx.plot.png[width=250,window=_blank,link=../diagrams/benchmarks-flat_map/clang-arm64/Scattered%20unsuccessful%20looukp.xlsx.plot.png] - -h|running insertion -h|running erasure -h|successful lookup -h|unsuccessful lookup - -|=== - -=== GCC 12, x86 - - -[caption=] -[cols="4*^.^a", frame=all, grid=all] -|=== - -|image::benchmarks-flat_map/gcc-x86/Running%20insertion.xlsx.plot.png[width=250,window=_blank,link=../diagrams/benchmarks-flat_map/gcc-x86/Running%20insertion.xlsx.plot.png] -|image::benchmarks-flat_map/gcc-x86/Running%20erasure.xlsx.plot.png[width=250,window=_blank,link=../diagrams/benchmarks-flat_map/gcc-x86/Running%20erasure.xlsx.plot.png] -|image::benchmarks-flat_map/gcc-x86/Scattered%20successful%20looukp.xlsx.plot.png[width=250,window=_blank,link=../diagrams/benchmarks-flat_map/gcc-x86/Scattered%20successful%20looukp.xlsx.plot.png] -|image::benchmarks-flat_map/gcc-x86/Scattered%20unsuccessful%20looukp.xlsx.plot.png[width=250,window=_blank,link=../diagrams/benchmarks-flat_map/gcc-x86/Scattered%20unsuccessful%20looukp.xlsx.plot.png] - -h|running insertion -h|running erasure -h|successful lookup -h|unsuccessful lookup - -|=== - -=== Clang 15, x86 - - -[caption=] -[cols="4*^.^a", frame=all, grid=all] -|=== - -|image::benchmarks-flat_map/clang-x86/Running%20insertion.xlsx.plot.png[width=250,window=_blank,link=../diagrams/benchmarks-flat_map/clang-x86/Running%20insertion.xlsx.plot.png] -|image::benchmarks-flat_map/clang-x86/Running%20erasure.xlsx.plot.png[width=250,window=_blank,link=../diagrams/benchmarks-flat_map/clang-x86/Running%20erasure.xlsx.plot.png] -|image::benchmarks-flat_map/clang-x86/Scattered%20successful%20looukp.xlsx.plot.png[width=250,window=_blank,link=../diagrams/benchmarks-flat_map/clang-x86/Scattered%20successful%20looukp.xlsx.plot.png] -|image::benchmarks-flat_map/clang-x86/Scattered%20unsuccessful%20looukp.xlsx.plot.png[width=250,window=_blank,link=../diagrams/benchmarks-flat_map/clang-x86/Scattered%20unsuccessful%20looukp.xlsx.plot.png] - -h|running insertion -h|running erasure -h|successful lookup -h|unsuccessful lookup - -|=== - -=== Visual Studio 2022, x86 - - -[caption=] -[cols="4*^.^a", frame=all, grid=all] -|=== - -|image::benchmarks-flat_map/vs-x86/Running%20insertion.xlsx.plot.png[width=250,window=_blank,link=../diagrams/benchmarks-flat_map/vs-x86/Running%20insertion.xlsx.plot.png] -|image::benchmarks-flat_map/vs-x86/Running%20erasure.xlsx.plot.png[width=250,window=_blank,link=../diagrams/benchmarks-flat_map/vs-x86/Running%20erasure.xlsx.plot.png] -|image::benchmarks-flat_map/vs-x86/Scattered%20successful%20looukp.xlsx.plot.png[width=250,window=_blank,link=../diagrams/benchmarks-flat_map/vs-x86/Scattered%20successful%20looukp.xlsx.plot.png] -|image::benchmarks-flat_map/vs-x86/Scattered%20unsuccessful%20looukp.xlsx.plot.png[width=250,window=_blank,link=../diagrams/benchmarks-flat_map/vs-x86/Scattered%20unsuccessful%20looukp.xlsx.plot.png] - -h|running insertion -h|running erasure -h|successful lookup -h|unsuccessful lookup - -|=== - -== boost::concurrent_(flat|node)_map - -All benchmarks were created using: - -* `https://spec.oneapi.io/versions/latest/elements/oneTBB/source/containers/concurrent_hash_map_cls.html[oneapi::tbb::concurrent_hash_map^]` -* `https://github.com/greg7mdp/gtl/blob/main/docs/phmap.md[gtl::parallel_flat_hash_map^]` with 64 submaps -* `boost::concurrent_flat_map` -* `boost::concurrent_node_map` - -The source code can be https://github.com/boostorg/boost_unordered_benchmarks/tree/boost_concurrent_flat_map[found here^]. - -The benchmarks exercise a number of threads _T_ (between 1 and 16) concurrently performing operations -randomly chosen among **update**, **successful lookup** and **unsuccessful lookup**. The keys used in the -operations follow a https://en.wikipedia.org/wiki/Zipf%27s_law#Formal_definition[Zipf distribution^] -with different _skew_ parameters: the higher the skew, the more concentrated are the keys in the lower values -of the covered range. - -`boost::concurrent_flat_map` and `boost::concurrent_node_map` are exercised using both regular and xref:#concurrent_bulk_visitation[bulk visitation]: -in the latter case, lookup keys are buffered in a local array and then processed at -once each time the buffer reaches xref:#concurrent_flat_map_constants[`bulk_visit_size`]. - -=== GCC 12, x64 - - -[caption=] -[cols="3*^.^a", frame=all, grid=all] -|=== - -|image::benchmarks-concurrent_map/gcc-x64/Parallel%20workload.xlsx.500k%2C%200.01.png[width=250,window=_blank,link=../diagrams/benchmarks-concurrent_map/gcc-x64/Parallel%20workload.xlsx.500k%2C%200.01.png] -|image::benchmarks-concurrent_map/gcc-x64/Parallel%20workload.xlsx.500k%2C%200.5.png[width=250,window=_blank,link=../diagrams/benchmarks-concurrent_map/gcc-x64/Parallel%20workload.xlsx.500k%2C%200.5.png] -|image::benchmarks-concurrent_map/gcc-x64/Parallel%20workload.xlsx.500k%2C%200.99.png[width=250,window=_blank,link=../diagrams/benchmarks-concurrent_map/gcc-x64/Parallel%20workload.xlsx.500k%2C%200.99.png] - -h|500k updates, 4.5M lookups + -skew=0.01 -h|500k updates, 4.5M lookups + -skew=0.5 -h|500k updates, 4.5M lookups + -skew=0.99 -|=== - -[caption=] -[cols="3*^.^a", frame=all, grid=all] -|=== - -|image::benchmarks-concurrent_map/gcc-x64/Parallel%20workload.xlsx.5M%2C%200.01.png[width=250,window=_blank,link=../diagrams/benchmarks-concurrent_map/gcc-x64/Parallel%20workload.xlsx.5M%2C%200.01.png] -|image::benchmarks-concurrent_map/gcc-x64/Parallel%20workload.xlsx.5M%2C%200.5.png[width=250,window=_blank,link=../diagrams/benchmarks-concurrent_map/gcc-x64/Parallel%20workload.xlsx.5M%2C%200.5.png] -|image::benchmarks-concurrent_map/gcc-x64/Parallel%20workload.xlsx.5M%2C%200.99.png[width=250,window=_blank,link=../diagrams/benchmarks-concurrent_map/gcc-x64/Parallel%20workload.xlsx.5M%2C%200.99.png] - -h|5M updates, 45M lookups + -skew=0.01 -h|5M updates, 45M lookups + -skew=0.5 -h|5M updates, 45M lookups + -skew=0.99 -|=== - -=== Clang 15, x64 - - -[caption=] -[cols="3*^.^a", frame=all, grid=all] -|=== - -|image::benchmarks-concurrent_map/clang-x64/Parallel%20workload.xlsx.500k%2C%200.01.png[width=250,window=_blank,link=../diagrams/benchmarks-concurrent_map/clang-x64/Parallel%20workload.xlsx.500k%2C%200.01.png] -|image::benchmarks-concurrent_map/clang-x64/Parallel%20workload.xlsx.500k%2C%200.5.png[width=250,window=_blank,link=../diagrams/benchmarks-concurrent_map/clang-x64/Parallel%20workload.xlsx.500k%2C%200.5.png] -|image::benchmarks-concurrent_map/clang-x64/Parallel%20workload.xlsx.500k%2C%200.99.png[width=250,window=_blank,link=../diagrams/benchmarks-concurrent_map/clang-x64/Parallel%20workload.xlsx.500k%2C%200.99.png] - -h|500k updates, 4.5M lookups + -skew=0.01 -h|500k updates, 4.5M lookups + -skew=0.5 -h|500k updates, 4.5M lookups + -skew=0.99 -|=== - -[caption=] -[cols="3*^.^a", frame=all, grid=all] -|=== - -|image::benchmarks-concurrent_map/clang-x64/Parallel%20workload.xlsx.5M%2C%200.01.png[width=250,window=_blank,link=../diagrams/benchmarks-concurrent_map/clang-x64/Parallel%20workload.xlsx.5M%2C%200.01.png] -|image::benchmarks-concurrent_map/clang-x64/Parallel%20workload.xlsx.5M%2C%200.5.png[width=250,window=_blank,link=../diagrams/benchmarks-concurrent_map/clang-x64/Parallel%20workload.xlsx.5M%2C%200.5.png] -|image::benchmarks-concurrent_map/clang-x64/Parallel%20workload.xlsx.5M%2C%200.99.png[width=250,window=_blank,link=../diagrams/benchmarks-concurrent_map/clang-x64/Parallel%20workload.xlsx.5M%2C%200.99.png] - -h|5M updates, 45M lookups + -skew=0.01 -h|5M updates, 45M lookups + -skew=0.5 -h|5M updates, 45M lookups + -skew=0.99 -|=== - -=== Visual Studio 2022, x64 - - -[caption=] -[cols="3*^.^a", frame=all, grid=all] -|=== - -|image::benchmarks-concurrent_map/vs-x64/Parallel%20workload.xlsx.500k%2C%200.01.png[width=250,window=_blank,link=../diagrams/benchmarks-concurrent_map/vs-x64/Parallel%20workload.xlsx.500k%2C%200.01.png] -|image::benchmarks-concurrent_map/vs-x64/Parallel%20workload.xlsx.500k%2C%200.5.png[width=250,window=_blank,link=../diagrams/benchmarks-concurrent_map/vs-x64/Parallel%20workload.xlsx.500k%2C%200.5.png] -|image::benchmarks-concurrent_map/vs-x64/Parallel%20workload.xlsx.500k%2C%200.99.png[width=250,window=_blank,link=../diagrams/benchmarks-concurrent_map/vs-x64/Parallel%20workload.xlsx.500k%2C%200.99.png] - -h|500k updates, 4.5M lookups + -skew=0.01 -h|500k updates, 4.5M lookups + -skew=0.5 -h|500k updates, 4.5M lookups + -skew=0.99 -|=== - -[caption=] -[cols="3*^.^a", frame=all, grid=all] -|=== - -|image::benchmarks-concurrent_map/vs-x64/Parallel%20workload.xlsx.5M%2C%200.01.png[width=250,window=_blank,link=../diagrams/benchmarks-concurrent_map/vs-x64/Parallel%20workload.xlsx.5M%2C%200.01.png] -|image::benchmarks-concurrent_map/vs-x64/Parallel%20workload.xlsx.5M%2C%200.5.png[width=250,window=_blank,link=../diagrams/benchmarks-concurrent_map/vs-x64/Parallel%20workload.xlsx.5M%2C%200.5.png] -|image::benchmarks-concurrent_map/vs-x64/Parallel%20workload.xlsx.5M%2C%200.99.png[width=250,window=_blank,link=../diagrams/benchmarks-concurrent_map/vs-x64/Parallel%20workload.xlsx.5M%2C%200.99.png] - -h|5M updates, 45M lookups + -skew=0.01 -h|5M updates, 45M lookups + -skew=0.5 -h|5M updates, 45M lookups + -skew=0.99 -|=== - -=== Clang 12, ARM64 - - -[caption=] -[cols="3*^.^a", frame=all, grid=all] -|=== - -|image::benchmarks-concurrent_map/clang-arm64/Parallel%20workload.xlsx.500k%2C%200.01.png[width=250,window=_blank,link=../diagrams/benchmarks-concurrent_map/clang-arm64/Parallel%20workload.xlsx.500k%2C%200.01.png] -|image::benchmarks-concurrent_map/clang-arm64/Parallel%20workload.xlsx.500k%2C%200.5.png[width=250,window=_blank,link=../diagrams/benchmarks-concurrent_map/clang-arm64/Parallel%20workload.xlsx.500k%2C%200.5.png] -|image::benchmarks-concurrent_map/clang-arm64/Parallel%20workload.xlsx.500k%2C%200.99.png[width=250,window=_blank,link=../diagrams/benchmarks-concurrent_map/clang-arm64/Parallel%20workload.xlsx.500k%2C%200.99.png] - -h|500k updates, 4.5M lookups + -skew=0.01 -h|500k updates, 4.5M lookups + -skew=0.5 -h|500k updates, 4.5M lookups + -skew=0.99 -|=== - -[caption=] -[cols="3*^.^a", frame=all, grid=all] -|=== - -|image::benchmarks-concurrent_map/clang-arm64/Parallel%20workload.xlsx.5M%2C%200.01.png[width=250,window=_blank,link=../diagrams/benchmarks-concurrent_map/clang-arm64/Parallel%20workload.xlsx.5M%2C%200.01.png] -|image::benchmarks-concurrent_map/clang-arm64/Parallel%20workload.xlsx.5M%2C%200.5.png[width=250,window=_blank,link=../diagrams/benchmarks-concurrent_map/clang-arm64/Parallel%20workload.xlsx.5M%2C%200.5.png] -|image::benchmarks-concurrent_map/clang-arm64/Parallel%20workload.xlsx.5M%2C%200.99.png[width=250,window=_blank,link=../diagrams/benchmarks-concurrent_map/clang-arm64/Parallel%20workload.xlsx.5M%2C%200.99.png] - -h|5M updates, 45M lookups + -skew=0.01 -h|5M updates, 45M lookups + -skew=0.5 -h|5M updates, 45M lookups + -skew=0.99 -|=== - -=== GCC 12, x86 - - -[caption=] -[cols="3*^.^a", frame=all, grid=all] -|=== - -|image::benchmarks-concurrent_map/gcc-x86/Parallel%20workload.xlsx.500k%2C%200.01.png[width=250,window=_blank,link=../diagrams/benchmarks-concurrent_map/gcc-x86/Parallel%20workload.xlsx.500k%2C%200.01.png] -|image::benchmarks-concurrent_map/gcc-x86/Parallel%20workload.xlsx.500k%2C%200.5.png[width=250,window=_blank,link=../diagrams/benchmarks-concurrent_map/gcc-x86/Parallel%20workload.xlsx.500k%2C%200.5.png] -|image::benchmarks-concurrent_map/gcc-x86/Parallel%20workload.xlsx.500k%2C%200.99.png[width=250,window=_blank,link=../diagrams/benchmarks-concurrent_map/gcc-x86/Parallel%20workload.xlsx.500k%2C%200.99.png] - -h|500k updates, 4.5M lookups + -skew=0.01 -h|500k updates, 4.5M lookups + -skew=0.5 -h|500k updates, 4.5M lookups + -skew=0.99 -|=== - -[caption=] -[cols="3*^.^a", frame=all, grid=all] -|=== - -|image::benchmarks-concurrent_map/gcc-x86/Parallel%20workload.xlsx.5M%2C%200.01.png[width=250,window=_blank,link=../diagrams/benchmarks-concurrent_map/gcc-x86/Parallel%20workload.xlsx.5M%2C%200.01.png] -|image::benchmarks-concurrent_map/gcc-x86/Parallel%20workload.xlsx.5M%2C%200.5.png[width=250,window=_blank,link=../diagrams/benchmarks-concurrent_map/gcc-x86/Parallel%20workload.xlsx.5M%2C%200.5.png] -|image::benchmarks-concurrent_map/gcc-x86/Parallel%20workload.xlsx.5M%2C%200.99.png[width=250,window=_blank,link=../diagrams/benchmarks-concurrent_map/gcc-x86/Parallel%20workload.xlsx.5M%2C%200.99.png] - -h|5M updates, 45M lookups + -skew=0.01 -h|5M updates, 45M lookups + -skew=0.5 -h|5M updates, 45M lookups + -skew=0.99 -|=== - -=== Clang 15, x86 - - -[caption=] -[cols="3*^.^a", frame=all, grid=all] -|=== - -|image::benchmarks-concurrent_map/clang-x86/Parallel%20workload.xlsx.500k%2C%200.01.png[width=250,window=_blank,link=../diagrams/benchmarks-concurrent_map/clang-x86/Parallel%20workload.xlsx.500k%2C%200.01.png] -|image::benchmarks-concurrent_map/clang-x86/Parallel%20workload.xlsx.500k%2C%200.5.png[width=250,window=_blank,link=../diagrams/benchmarks-concurrent_map/clang-x86/Parallel%20workload.xlsx.500k%2C%200.5.png] -|image::benchmarks-concurrent_map/clang-x86/Parallel%20workload.xlsx.500k%2C%200.99.png[width=250,window=_blank,link=../diagrams/benchmarks-concurrent_map/clang-x86/Parallel%20workload.xlsx.500k%2C%200.99.png] - -h|500k updates, 4.5M lookups + -skew=0.01 -h|500k updates, 4.5M lookups + -skew=0.5 -h|500k updates, 4.5M lookups + -skew=0.99 -|=== - -[caption=] -[cols="3*^.^a", frame=all, grid=all] -|=== - -|image::benchmarks-concurrent_map/clang-x86/Parallel%20workload.xlsx.5M%2C%200.01.png[width=250,window=_blank,link=../diagrams/benchmarks-concurrent_map/clang-x86/Parallel%20workload.xlsx.5M%2C%200.01.png] -|image::benchmarks-concurrent_map/clang-x86/Parallel%20workload.xlsx.5M%2C%200.5.png[width=250,window=_blank,link=../diagrams/benchmarks-concurrent_map/clang-x86/Parallel%20workload.xlsx.5M%2C%200.5.png] -|image::benchmarks-concurrent_map/clang-x86/Parallel%20workload.xlsx.5M%2C%200.99.png[width=250,window=_blank,link=../diagrams/benchmarks-concurrent_map/clang-x86/Parallel%20workload.xlsx.5M%2C%200.99.png] - -h|5M updates, 45M lookups + -skew=0.01 -h|5M updates, 45M lookups + -skew=0.5 -h|5M updates, 45M lookups + -skew=0.99 -|=== - -=== Visual Studio 2022, x86 - - -[caption=] -[cols="3*^.^a", frame=all, grid=all] -|=== - -|image::benchmarks-concurrent_map/vs-x86/Parallel%20workload.xlsx.500k%2C%200.01.png[width=250,window=_blank,link=../diagrams/benchmarks-concurrent_map/vs-x86/Parallel%20workload.xlsx.500k%2C%200.01.png] -|image::benchmarks-concurrent_map/vs-x86/Parallel%20workload.xlsx.500k%2C%200.5.png[width=250,window=_blank,link=../diagrams/benchmarks-concurrent_map/vs-x86/Parallel%20workload.xlsx.500k%2C%200.5.png] -|image::benchmarks-concurrent_map/vs-x86/Parallel%20workload.xlsx.500k%2C%200.99.png[width=250,window=_blank,link=../diagrams/benchmarks-concurrent_map/vs-x86/Parallel%20workload.xlsx.500k%2C%200.99.png] - -h|500k updates, 4.5M lookups + -skew=0.01 -h|500k updates, 4.5M lookups + -skew=0.5 -h|500k updates, 4.5M lookups + -skew=0.99 -|=== - -[caption=] -[cols="3*^.^a", frame=all, grid=all] -|=== - -|image::benchmarks-concurrent_map/vs-x86/Parallel%20workload.xlsx.5M%2C%200.01.png[width=250,window=_blank,link=../diagrams/benchmarks-concurrent_map/vs-x86/Parallel%20workload.xlsx.5M%2C%200.01.png] -|image::benchmarks-concurrent_map/vs-x86/Parallel%20workload.xlsx.5M%2C%200.5.png[width=250,window=_blank,link=../diagrams/benchmarks-concurrent_map/vs-x86/Parallel%20workload.xlsx.5M%2C%200.5.png] -|image::benchmarks-concurrent_map/vs-x86/Parallel%20workload.xlsx.5M%2C%200.99.png[width=250,window=_blank,link=../diagrams/benchmarks-concurrent_map/vs-x86/Parallel%20workload.xlsx.5M%2C%200.99.png] - -h|5M updates, 45M lookups + -skew=0.01 -h|5M updates, 45M lookups + -skew=0.5 -h|5M updates, 45M lookups + -skew=0.99 -|=== diff --git a/doc/unordered/ref.adoc b/doc/unordered/ref.adoc deleted file mode 100644 index 9a1a5098..00000000 --- a/doc/unordered/ref.adoc +++ /dev/null @@ -1,17 +0,0 @@ -[#reference] -= Reference - -include::unordered_map.adoc[] -include::unordered_multimap.adoc[] -include::unordered_set.adoc[] -include::unordered_multiset.adoc[] -include::hash_traits.adoc[] -include::stats.adoc[] -include::unordered_flat_map.adoc[] -include::unordered_flat_set.adoc[] -include::unordered_node_map.adoc[] -include::unordered_node_set.adoc[] -include::concurrent_flat_map.adoc[] -include::concurrent_flat_set.adoc[] -include::concurrent_node_map.adoc[] -include::concurrent_node_set.adoc[] diff --git a/index.html b/index.html index afbc35e3..a9d60f6a 100644 --- a/index.html +++ b/index.html @@ -7,10 +7,10 @@ file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) - + Automatic redirection failed, please go to -doc/html/unordered.html +doc/html/index.html