Repository: boostorg/boost Branch: master Commit: 460b20ab28cc Files: 122 Total size: 4.5 MB Directory structure: gitextract_nspmsd4k/ ├── .circleci/ │ ├── autocancel.sh │ └── config.yml ├── .gitattributes ├── .github/ │ └── workflows/ │ ├── ci.yml │ ├── commit-bot.yml │ └── release-cmake.yml ├── .gitignore ├── .gitmodules ├── .travis.yml ├── CMakeLists.txt ├── INSTALL ├── Jamroot ├── LICENSE_1_0.txt ├── README.md ├── appveyor.yml ├── boost-build.jam ├── boost.css ├── boostcpp.jam ├── bootstrap.bat ├── bootstrap.sh ├── doc/ │ ├── Jamfile.v2 │ ├── html/ │ │ ├── Assignable.html │ │ ├── CopyConstructible.html │ │ ├── accumulators.html │ │ ├── any.html │ │ ├── array.html │ │ ├── atomic.html │ │ ├── bbv2/ │ │ │ └── installation.html │ │ ├── bbv2.html │ │ ├── boost_asio.html │ │ ├── boost_lexical_cast.html │ │ ├── boost_random.html │ │ ├── boost_staticassert.html │ │ ├── boost_typeerasure.html │ │ ├── boostbook.html │ │ ├── chrono.html │ │ ├── circular_buffer.html │ │ ├── container.html │ │ ├── date_time/ │ │ │ ├── date_time_io.html │ │ │ ├── details.html │ │ │ └── local_time.html │ │ ├── date_time.html │ │ ├── foreach.html │ │ ├── function.html │ │ ├── hash/ │ │ │ └── custom.html │ │ ├── hash.html │ │ ├── heap.html │ │ ├── interprocess.html │ │ ├── intrusive.html │ │ ├── lambda.html │ │ ├── lockfree.html │ │ ├── move.html │ │ ├── mpi.html │ │ ├── program_options.html │ │ ├── property_tree.html │ │ ├── proto.html │ │ ├── quickbook.html │ │ ├── ratio.html │ │ ├── ref.html │ │ ├── signals.html │ │ ├── signals2.html │ │ ├── string_algo.html │ │ ├── thread.html │ │ ├── tribool.html │ │ ├── typeof.html │ │ ├── unordered.html │ │ ├── variant.html │ │ └── xpressive.html │ ├── pdf/ │ │ ├── Jamfile.v2 │ │ └── build │ ├── src/ │ │ ├── boost.xml │ │ ├── boostbook.css │ │ ├── docutils.css │ │ ├── minimal.css │ │ └── reference.css │ └── test/ │ ├── HTML4_symbols.qbk │ ├── Jamfile.v2 │ ├── array.xml │ ├── array1.xml │ ├── array2.xml │ ├── array3.xml │ ├── array4.xml │ ├── gold/ │ │ ├── boost/ │ │ │ ├── accumulators/ │ │ │ │ ├── extract/ │ │ │ │ │ └── weighted_tail_quantile.html │ │ │ │ ├── impl/ │ │ │ │ │ └── weighted_tail_quantile__id330053.html │ │ │ │ └── tag/ │ │ │ │ └── weighted_tail_quantile.html │ │ │ └── array.html │ │ ├── document_to_test_formatting/ │ │ │ ├── accumulators.html │ │ │ ├── array.html │ │ │ ├── basic_formatting.html │ │ │ ├── blurbs.html │ │ │ ├── code_blocks.html │ │ │ ├── images.html │ │ │ ├── lists_and_tables.html │ │ │ ├── remez.html │ │ │ └── test.html │ │ └── index.html │ ├── remez.qbk │ ├── stub.cpp │ ├── test.mml │ ├── test.qbk │ ├── test_HTML4_symbols.qbk │ └── weighted_tail_quantile.hpp ├── index.htm ├── index.html ├── libs/ │ ├── Jamfile.v2 │ ├── index.html │ ├── libraries.htm │ ├── maintainers.txt │ ├── numeric/ │ │ ├── doc/ │ │ │ └── build.jam │ │ ├── index.html │ │ └── sublibs │ └── platform_maintainers.txt ├── rst.css ├── status/ │ ├── Jamfile.v2 │ ├── boost-no-inspect │ ├── boost_check_library.py │ ├── expected_results.xml │ ├── explicit-failures-markup.xml │ └── explicit-failures.xsd └── tools/ ├── Jamfile.v2 ├── index.html └── make-cputime-page.pl ================================================ FILE CONTENTS ================================================ ================================================ FILE: .circleci/autocancel.sh ================================================ #!/bin/bash # Auto-cancel preceding workflows # https://discuss.circleci.com/t/workaround-auto-cancel-redundant-builds-on-the-default-branch/39468 set -x ## Get the name of the workflow and the related pipeline number curl --header "Circle-Token: $PERS_API_TOKEN_BOOST_5" --request GET "https://circleci.com/api/v2/workflow/${CIRCLE_WORKFLOW_ID}" -o current_workflow.json WF_NAME=$(jq -r '.name' current_workflow.json) CURRENT_PIPELINE_NUM=$(jq -r '.pipeline_number' current_workflow.json) CURRENT_PIPELINE_CREATED=$(jq -r '.created_at' current_workflow.json) TIME_THRESHOLD=$(date --utc +'%Y-%m-%dT%TZ' -d "${CURRENT_PIPELINE_CREATED} -10 minutes") ## Get the IDs of pipelines created by the current user on the same branch. (Only consider pipelines that have a pipeline number inferior to the current pipeline) PIPE_IDS=$(curl --header "Circle-Token: $PERS_API_TOKEN_BOOST_5" --request GET "https://circleci.com/api/v2/project/gh/$CIRCLE_PROJECT_USERNAME/$CIRCLE_PROJECT_REPONAME/pipeline?branch=$CIRCLE_BRANCH"|jq -r --argjson CURRENT_PIPELINE_NUM "$CURRENT_PIPELINE_NUM" --arg TIME_THRESHOLD "${TIME_THRESHOLD}" '.items[] | select(.state == "created") | select(.number < $CURRENT_PIPELINE_NUM) | select(.created_at > $TIME_THRESHOLD) | .id') ## Get the IDs of currently running/on_hold workflows that have the same name as the current workflow, in all previously created pipelines. if [ ! -z "$PIPE_IDS" ]; then for PIPE_ID in $PIPE_IDS do curl --header "Circle-Token: $PERS_API_TOKEN_BOOST_5" --request GET "https://circleci.com/api/v2/pipeline/${PIPE_ID}/workflow"|jq -r --arg WF_NAME "${WF_NAME}" '.items[]|select(.status == "on_hold" or .status == "running") | select(.name == $WF_NAME) | .id' >> WF_to_cancel.txt done fi ## Cancel any currently running/on_hold workflow with the same name if [ -s WF_to_cancel.txt ]; then echo "Cancelling the following workflow(s):" cat WF_to_cancel.txt while read WF_ID; do curl --header "Circle-Token: $PERS_API_TOKEN_BOOST_5" --request POST https://circleci.com/api/v2/workflow/$WF_ID/cancel done < WF_to_cancel.txt ## Allowing some time to complete the cancellation sleep 2 else echo "Nothing to cancel" fi ================================================ FILE: .circleci/config.yml ================================================ version: 2.1 jobs: build: resource_class: large docker: - image: cppalliance/boost_superproject_build:24.04-v4 parallelism: 2 steps: - checkout - run: ./.circleci/autocancel.sh || true - run: wget "https://raw.githubusercontent.com/boostorg/release-tools/master/ci_boost_common.py" -P ${HOME} - run: wget "https://raw.githubusercontent.com/boostorg/release-tools/master/ci_boost_release.py" -P ${HOME} - run: python3 ${HOME}/ci_boost_release.py checkout_post # - run: python3 ${HOME}/ci_boost_release.py dependencies_override - run: '[ "$CIRCLE_NODE_INDEX" != "0" ] || EOL=LF python3 ${HOME}/ci_boost_release.py test_pre' - run: '[ "$CIRCLE_NODE_INDEX" != "1" ] || EOL=CRLF python3 ${HOME}/ci_boost_release.py test_pre' - run: '[ "$CIRCLE_NODE_INDEX" != "0" ] || EOL=LF python3 ${HOME}/ci_boost_release.py test_override' - run: '[ "$CIRCLE_NODE_INDEX" != "1" ] || EOL=CRLF python3 ${HOME}/ci_boost_release.py test_override' ================================================ FILE: .gitattributes ================================================ * text=auto !eol svneol=native#text/plain *.gitattributes text svneol=native#text/plain # Scriptish formats *.bat text svneol=native#text/plain *.bsh text svneol=native#text/x-beanshell *.cgi text svneol=native#text/plain *.cmd text svneol=native#text/plain *.js text svneol=native#text/javascript *.php text svneol=native#text/x-php *.pl text svneol=native#text/x-perl *.pm text svneol=native#text/x-perl *.py text svneol=native#text/x-python *.sh eol=lf svneol=LF#text/x-sh configure eol=lf svneol=LF#text/x-sh # Image formats *.bmp binary svneol=unset#image/bmp *.gif binary svneol=unset#image/gif *.ico binary svneol=unset#image/ico *.jpeg binary svneol=unset#image/jpeg *.jpg binary svneol=unset#image/jpeg *.png binary svneol=unset#image/png *.tif binary svneol=unset#image/tiff *.tiff binary svneol=unset#image/tiff *.svg text svneol=native#image/svg%2Bxml # Data formats *.pdf binary svneol=unset#application/pdf *.avi binary svneol=unset#video/avi *.doc binary svneol=unset#application/msword *.dsp text svneol=crlf#text/plain *.dsw text svneol=crlf#text/plain *.eps binary svneol=unset#application/postscript *.gz binary svneol=unset#application/gzip *.mov binary svneol=unset#video/quicktime *.mp3 binary svneol=unset#audio/mpeg *.ppt binary svneol=unset#application/vnd.ms-powerpoint *.ps binary svneol=unset#application/postscript *.psd binary svneol=unset#application/photoshop *.rdf binary svneol=unset#text/rdf *.rss text svneol=unset#text/xml *.rtf binary svneol=unset#text/rtf *.sln text svneol=native#text/plain *.swf binary svneol=unset#application/x-shockwave-flash *.tgz binary svneol=unset#application/gzip *.vcproj text svneol=native#text/xml *.vcxproj text svneol=native#text/xml *.vsprops text svneol=native#text/xml *.wav binary svneol=unset#audio/wav *.xls binary svneol=unset#application/vnd.ms-excel *.zip binary svneol=unset#application/zip # Text formats .htaccess text svneol=native#text/plain *.bbk text svneol=native#text/xml *.cmake text svneol=native#text/plain *.css text svneol=native#text/css *.dtd text svneol=native#text/xml *.htm text svneol=native#text/html *.html text svneol=native#text/html *.ini text svneol=native#text/plain *.log text svneol=native#text/plain *.mak text svneol=native#text/plain *.qbk text svneol=native#text/plain *.rst text svneol=native#text/plain *.sql text svneol=native#text/x-sql *.txt text svneol=native#text/plain *.xhtml text svneol=native#text/xhtml%2Bxml *.xml text svneol=native#text/xml *.xsd text svneol=native#text/xml *.xsl text svneol=native#text/xml *.xslt text svneol=native#text/xml *.xul text svneol=native#text/xul *.yml text svneol=native#text/plain boost-no-inspect text svneol=native#text/plain CHANGES text svneol=native#text/plain COPYING text svneol=native#text/plain INSTALL text svneol=native#text/plain Jamfile text svneol=native#text/plain Jamroot text svneol=native#text/plain Jamfile.v2 text svneol=native#text/plain Jamrules text svneol=native#text/plain Makefile* text svneol=native#text/plain README text svneol=native#text/plain TODO text svneol=native#text/plain # Code formats *.c text svneol=native#text/plain *.cpp text svneol=native#text/plain *.h text svneol=native#text/plain *.hpp text svneol=native#text/plain *.ipp text svneol=native#text/plain *.tpp text svneol=native#text/plain *.jam text svneol=native#text/plain *.java text svneol=native#text/plain ================================================ FILE: .github/workflows/ci.yml ================================================ name: CI on: pull_request: push: branches: - master - develop - feature/** tags: - '**' jobs: b2-posix: strategy: fail-fast: false matrix: include: - os: ubuntu-22.04 - os: ubuntu-22.04-arm - os: ubuntu-24.04 - os: ubuntu-24.04-arm - os: macos-14 - os: macos-15 - os: macos-26 runs-on: ${{matrix.os}} steps: - uses: actions/checkout@v4 with: submodules: true - name: Setup Boost run: | ./bootstrap.sh ./b2 -d0 headers - name: Build Boost run: | ./b2 -j3 stage - name: Install Boost run: | ./b2 -j3 --prefix=$HOME/.local install - name: Test Boost run: | cd status ../b2 -j3 quick b2-windows: strategy: fail-fast: false matrix: include: - os: windows-2022 - os: windows-2025 runs-on: ${{matrix.os}} steps: - uses: actions/checkout@v4 with: submodules: true - name: Setup Boost shell: cmd run: | cmd /c bootstrap b2 -d0 headers - name: Build Boost run: | ./b2 -j3 stage - name: Install Boost run: | ./b2 -j3 install - name: Test Boost run: | cd status ../b2 -j3 quick cmake-install-posix: strategy: fail-fast: false matrix: include: - os: ubuntu-22.04 - os: ubuntu-22.04-arm - os: ubuntu-24.04 - os: ubuntu-24.04-arm - os: macos-14 - os: macos-15 - os: macos-26 runs-on: ${{matrix.os}} timeout-minutes: 20 steps: - uses: actions/checkout@v4 with: submodules: true - name: Configure Boost run: | mkdir __build__ && cd __build__ cmake -DBUILD_SHARED_LIBS=ON -DCMAKE_INSTALL_PREFIX=~/.local .. - name: Build Boost run: | cd __build__ cmake --build . -j 3 - name: Install Boost run: | cd __build__ cmake --build . -j 3 --target install cmake-install-windows: strategy: fail-fast: false matrix: include: - os: windows-2022 - os: windows-2025 runs-on: ${{matrix.os}} steps: - uses: actions/checkout@v4 with: submodules: true - name: Configure Boost run: | mkdir __build__ && cd __build__ cmake -DBUILD_SHARED_LIBS=ON .. - name: Build Boost run: | cd __build__ cmake --build . -j 3 - name: Install Boost run: | cd __build__ cmake --build . -j 3 --target install cmake-test-posix: strategy: fail-fast: false matrix: include: - os: ubuntu-latest runs-on: ${{matrix.os}} steps: - uses: actions/checkout@v4 with: submodules: true - name: Configure Boost run: | mkdir __build__ && cd __build__ cmake -DBUILD_TESTING=ON -DBOOST_EXCLUDE_LIBRARIES="process;geometry" .. - name: Build tests run: | cd __build__ cmake --build . -j 3 --target tests - name: Run tests run: | cd __build__ ctest --output-on-failure --no-tests=error -j 3 cmake-test-posix-quick: strategy: fail-fast: false matrix: include: - os: ubuntu-22.04 - os: ubuntu-22.04-arm - os: ubuntu-24.04 - os: ubuntu-24.04-arm - os: macos-14 - os: macos-15 - os: macos-26 runs-on: ${{matrix.os}} timeout-minutes: 90 steps: - uses: actions/checkout@v4 with: submodules: true - name: Configure Boost run: | mkdir __build__ && cd __build__ cmake -DBUILD_TESTING=ON .. - name: Build tests run: | cd __build__ cmake --build . -j 3 --target tests-quick - name: Run tests run: | cd __build__ ctest --output-on-failure --no-tests=error -j 3 -R quick cmake-test-windows-quick: strategy: fail-fast: false matrix: include: - os: windows-2022 - os: windows-2025 runs-on: ${{matrix.os}} steps: - uses: actions/checkout@v4 with: submodules: true - name: Configure Boost run: | mkdir __build__ && cd __build__ cmake -DBUILD_TESTING=ON .. - name: Build tests run: | cd __build__ cmake --build . -j 3 --target tests-quick - name: Run tests run: | cd __build__ ctest --output-on-failure --no-tests=error -j 3 -R quick -C Debug ================================================ FILE: .github/workflows/commit-bot.yml ================================================ name: Commit Bot # Instructions # # - One-time setup: create a personal access token with permissions. Then configure it here # as secrets.CI_PAT. https://github.com/boostorg/boost/settings/secrets/actions # The reason is explained in https://github.com/orgs/community/discussions/25702 # "If an action pushes code using the repository's GITHUB_TOKEN, a new workflow will not run" # # - Processing of either the 'master' or 'develop' branch may be stopped by creating the variables # vars.block_master or vars.block_develop with the value "yes" (case-insensitive). # https://github.com/boostorg/boost/settings/variables/actions # # To avoid infinite loops, don't trigger on "push" on: schedule: - cron: "0,30 * * * *" concurrency: group: ${{format('commit-bot-{0}:{1}', github.repository, github.ref)}} cancel-in-progress: true jobs: update-modules: runs-on: ubuntu-latest name: Commit Bot if: github.repository == 'boostorg/boost' steps: - name: Check for module updates id: branches run: | set -xe branches="" block_master="${{ vars.block_master }}" block_develop="${{ vars.block_develop }}" if [[ "${{ github.event_name }}" == "push" ]]; then # The job doesn't run on "push" so this will not execute. if [[ ! ${block_master,,} =~ yes && "${{ github.ref_name }}" == "master" ]]; then branches="master" elif [[ ! ${block_develop,,} =~ yes && "${{ github.ref_name }}" == "develop" ]]; then branches="develop" fi else # from a schedule: if [[ ! ${block_master,,} =~ yes ]]; then branches="master" fi if [[ ! ${block_develop,,} =~ yes ]]; then branches="${branches} develop" fi fi echo "branches=$branches" >> $GITHUB_OUTPUT echo "branches is ${branches}" - name: Checkout master repository uses: actions/checkout@v4 if: contains(steps.branches.outputs.branches, 'master') with: ref: master path: master persist-credentials: false - name: Checkout develop repository uses: actions/checkout@v4 if: contains(steps.branches.outputs.branches, 'develop') with: ref: develop path: develop persist-credentials: false - name: Check for module updates run: | branches="${{ steps.branches.outputs.branches }}" # Set up Git git config --global user.name "boost-commitbot" git config --global user.email "boost-commitbot@example.com" # Update each branch for branch in $branches; do cd $branch module_paths=$(git config --file .gitmodules --get-regexp '^submodule\..*\.path$') while IFS=' ' read -r key path; do submodule_name=$(echo "$key" | awk -F '.' '{print $2}') submodule_path=$(echo "$path") url=$(git config --file .gitmodules --get-regexp "^submodule\.$submodule_name\.url$" | awk '{print $2}') if [[ ! "$url" =~ ^https:// ]]; then basicreponame=$(basename $url) url=${GITHUB_SERVER_URL}/${GITHUB_REPOSITORY_OWNER}/${basicreponame} fi hash=$(git ls-remote "$url" "refs/heads/$branch" | cut -f 1) hash="${hash#"${hash%%[![:space:]]*}"}" hash="${hash%"${hash##*[![:space:]]}"}" commit_id="${hash:0:8}" previous_hash=$(git ls-tree HEAD "$submodule_path" | awk '{print $3}') previous_hash="${previous_hash#"${previous_hash%%[![:space:]]*}"}" previous_hash="${previous_hash%"${previous_hash##*[![:space:]]}"}" previous_commit_id="${previous_hash:0:8}" if [ "$hash" == "$previous_hash" ]; then echo "$submodule_name ($commit_id): OK" else echo "$submodule_name: $previous_commit_id -> $commit_id" set -x set +e git submodule update --init "$submodule_path" git submodule update --remote "$submodule_path" git add "$submodule_path" git commit -m "Update $submodule_name from $branch" set -e set +x fi done <<< "$module_paths" cd .. done - name: Push changes from master uses: ad-m/github-push-action@v0.8.0 if: contains(steps.branches.outputs.branches, 'master') with: # github_token: ${{ secrets.GITHUB_TOKEN }} github_token: ${{ secrets.CI_PAT }} branch: master directory: master - name: Push changes from develop uses: ad-m/github-push-action@v0.8.0 if: contains(steps.branches.outputs.branches, 'develop') with: # github_token: ${{ secrets.GITHUB_TOKEN }} github_token: ${{ secrets.CI_PAT }} branch: develop directory: develop ================================================ FILE: .github/workflows/release-cmake.yml ================================================ name: Release on: push: tags: - boost-* jobs: release-posix-cmake: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 with: path: ${{ github.ref_name }} submodules: true - name: Cleanup shell: bash run: | find ${{ github.ref_name }} -name ".git" -prune -exec rm -rf {} + - name: Create archives run: | tar -czf ${{ github.ref_name }}-cmake.tar.gz ${{ github.ref_name }} sha256sum ${{ github.ref_name }}-cmake.tar.gz > ${{ github.ref_name }}-cmake.tar.gz.txt tar -cJf ${{ github.ref_name }}-cmake.tar.xz ${{ github.ref_name }} sha256sum ${{ github.ref_name }}-cmake.tar.xz > ${{ github.ref_name }}-cmake.tar.xz.txt - uses: softprops/action-gh-release@v2 with: files: | ${{ github.ref_name }}-cmake.tar.gz ${{ github.ref_name }}-cmake.tar.gz.txt ${{ github.ref_name }}-cmake.tar.xz ${{ github.ref_name }}-cmake.tar.xz.txt release-windows-cmake: runs-on: windows-latest needs: release-posix-cmake steps: - uses: actions/checkout@v4 with: path: ${{ github.ref_name }} submodules: true - name: Cleanup shell: bash run: | find ${{ github.ref_name }} -name ".git" -prune -exec rm -rf {} + - name: Create archives shell: cmd run: | 7z a ${{ github.ref_name }}-cmake.zip ${{ github.ref_name }} sha256sum ${{ github.ref_name }}-cmake.zip > ${{ github.ref_name }}-cmake.zip.txt 7z a ${{ github.ref_name }}-cmake.7z ${{ github.ref_name }} sha256sum ${{ github.ref_name }}-cmake.7z > ${{ github.ref_name }}-cmake.7z.txt - uses: softprops/action-gh-release@v2 with: files: | ${{ github.ref_name }}-cmake.zip ${{ github.ref_name }}-cmake.zip.txt ${{ github.ref_name }}-cmake.7z ${{ github.ref_name }}-cmake.7z.txt release-posix-b2-nodocs: runs-on: ubuntu-latest needs: release-windows-cmake steps: - uses: actions/checkout@v4 with: path: ${{ github.ref_name }} submodules: true - name: Cleanup shell: bash run: | find ${{ github.ref_name }} -name ".git" -prune -exec rm -rf {} + - name: Move headers, remove docs shell: bash run: | cd ${{ github.ref_name }} cp -r libs/*/include/boost libs/numeric/*/include/boost . rm -rf libs/*/include libs/numeric/*/include rm -rf libs/*/doc libs/numeric/*/doc rm -f CMakeLists.txt - name: Create archives run: | tar -czf ${{ github.ref_name }}-b2-nodocs.tar.gz ${{ github.ref_name }} sha256sum ${{ github.ref_name }}-b2-nodocs.tar.gz > ${{ github.ref_name }}-b2-nodocs.tar.gz.txt tar -cJf ${{ github.ref_name }}-b2-nodocs.tar.xz ${{ github.ref_name }} sha256sum ${{ github.ref_name }}-b2-nodocs.tar.xz > ${{ github.ref_name }}-b2-nodocs.tar.xz.txt - uses: softprops/action-gh-release@v2 with: files: | ${{ github.ref_name }}-b2-nodocs.tar.gz ${{ github.ref_name }}-b2-nodocs.tar.gz.txt ${{ github.ref_name }}-b2-nodocs.tar.xz ${{ github.ref_name }}-b2-nodocs.tar.xz.txt release-windows-b2-nodocs: runs-on: windows-latest needs: release-posix-b2-nodocs steps: - uses: actions/checkout@v4 with: path: ${{ github.ref_name }} submodules: true - name: Cleanup shell: bash run: | find ${{ github.ref_name }} -name ".git" -prune -exec rm -rf {} + - name: Move headers, remove docs shell: bash run: | cd ${{ github.ref_name }} cp -r libs/*/include/boost libs/numeric/*/include/boost . rm -rf libs/*/include libs/numeric/*/include rm -rf libs/*/doc libs/numeric/*/doc rm -f CMakeLists.txt - name: Create archives shell: cmd run: | 7z a ${{ github.ref_name }}-b2-nodocs.zip ${{ github.ref_name }} sha256sum ${{ github.ref_name }}-b2-nodocs.zip > ${{ github.ref_name }}-b2-nodocs.zip.txt 7z a ${{ github.ref_name }}-b2-nodocs.7z ${{ github.ref_name }} sha256sum ${{ github.ref_name }}-b2-nodocs.7z > ${{ github.ref_name }}-b2-nodocs.7z.txt - uses: softprops/action-gh-release@v2 with: files: | ${{ github.ref_name }}-b2-nodocs.zip ${{ github.ref_name }}-b2-nodocs.zip.txt ${{ github.ref_name }}-b2-nodocs.7z ${{ github.ref_name }}-b2-nodocs.7z.txt ================================================ FILE: .gitignore ================================================ /b2 /b2.exe /bin.v2 /bjam /bjam.exe /bootstrap.log /boost /dist /project-config.jam* /stage /stage_x64/ /user-config.jam /.settings/ /.project /.pydevproject ================================================ FILE: .gitmodules ================================================ [submodule "system"] path = libs/system url = ../system.git fetchRecurseSubmodules = on-demand branch = . [submodule "multi_array"] path = libs/multi_array url = ../multi_array.git fetchRecurseSubmodules = on-demand branch = . [submodule "math"] path = libs/math url = ../math.git fetchRecurseSubmodules = on-demand branch = . [submodule "smart_ptr"] path = libs/smart_ptr url = ../smart_ptr.git fetchRecurseSubmodules = on-demand branch = . [submodule "parameter"] path = libs/parameter url = ../parameter.git fetchRecurseSubmodules = on-demand branch = . [submodule "algorithm"] path = libs/algorithm url = ../algorithm.git fetchRecurseSubmodules = on-demand branch = . [submodule "any"] path = libs/any url = ../any.git fetchRecurseSubmodules = on-demand branch = . [submodule "concept_check"] path = libs/concept_check url = ../concept_check.git fetchRecurseSubmodules = on-demand branch = . [submodule "python"] path = libs/python url = ../python.git fetchRecurseSubmodules = on-demand branch = . [submodule "tti"] path = libs/tti url = ../tti.git fetchRecurseSubmodules = on-demand branch = . [submodule "functional"] path = libs/functional url = ../functional.git fetchRecurseSubmodules = on-demand branch = . [submodule "config"] path = libs/config url = ../config.git fetchRecurseSubmodules = on-demand branch = . [submodule "log"] path = libs/log url = ../log.git fetchRecurseSubmodules = on-demand branch = . [submodule "interprocess"] path = libs/interprocess url = ../interprocess.git fetchRecurseSubmodules = on-demand branch = . [submodule "exception"] path = libs/exception url = ../exception.git fetchRecurseSubmodules = on-demand branch = . [submodule "foreach"] path = libs/foreach url = ../foreach.git fetchRecurseSubmodules = on-demand branch = . [submodule "spirit"] path = libs/spirit url = ../spirit.git fetchRecurseSubmodules = on-demand branch = . [submodule "io"] path = libs/io url = ../io.git fetchRecurseSubmodules = on-demand branch = . [submodule "units"] path = libs/units url = ../units.git fetchRecurseSubmodules = on-demand branch = . [submodule "preprocessor"] path = libs/preprocessor url = ../preprocessor.git fetchRecurseSubmodules = on-demand branch = . [submodule "format"] path = libs/format url = ../format.git fetchRecurseSubmodules = on-demand branch = . [submodule "xpressive"] path = libs/xpressive url = ../xpressive.git fetchRecurseSubmodules = on-demand branch = . [submodule "integer"] path = libs/integer url = ../integer.git fetchRecurseSubmodules = on-demand branch = . [submodule "thread"] path = libs/thread url = ../thread.git fetchRecurseSubmodules = on-demand branch = . [submodule "tokenizer"] path = libs/tokenizer url = ../tokenizer.git fetchRecurseSubmodules = on-demand branch = . [submodule "timer"] path = libs/timer url = ../timer.git fetchRecurseSubmodules = on-demand branch = . [submodule "inspect"] path = tools/inspect url = ../inspect.git fetchRecurseSubmodules = on-demand branch = . [submodule "boostbook"] path = tools/boostbook url = ../boostbook.git fetchRecurseSubmodules = on-demand branch = . [submodule "regex"] path = libs/regex url = ../regex.git fetchRecurseSubmodules = on-demand branch = . [submodule "crc"] path = libs/crc url = ../crc.git fetchRecurseSubmodules = on-demand branch = . [submodule "random"] path = libs/random url = ../random.git fetchRecurseSubmodules = on-demand branch = . [submodule "serialization"] path = libs/serialization url = ../serialization.git fetchRecurseSubmodules = on-demand branch = . [submodule "test"] path = libs/test url = ../test.git fetchRecurseSubmodules = on-demand branch = . [submodule "date_time"] path = libs/date_time url = ../date_time.git fetchRecurseSubmodules = on-demand branch = . [submodule "logic"] path = libs/logic url = ../logic.git fetchRecurseSubmodules = on-demand branch = . [submodule "graph"] path = libs/graph url = ../graph.git fetchRecurseSubmodules = on-demand branch = . [submodule "numeric_conversion"] path = libs/numeric/conversion url = ../numeric_conversion.git fetchRecurseSubmodules = on-demand branch = . [submodule "lambda"] path = libs/lambda url = ../lambda.git fetchRecurseSubmodules = on-demand branch = . [submodule "mpl"] path = libs/mpl url = ../mpl.git fetchRecurseSubmodules = on-demand branch = . [submodule "typeof"] path = libs/typeof url = ../typeof.git fetchRecurseSubmodules = on-demand branch = . [submodule "tuple"] path = libs/tuple url = ../tuple.git fetchRecurseSubmodules = on-demand branch = . [submodule "utility"] path = libs/utility url = ../utility.git fetchRecurseSubmodules = on-demand branch = . [submodule "dynamic_bitset"] path = libs/dynamic_bitset url = ../dynamic_bitset.git fetchRecurseSubmodules = on-demand branch = . [submodule "assign"] path = libs/assign url = ../assign.git fetchRecurseSubmodules = on-demand branch = . [submodule "filesystem"] path = libs/filesystem url = ../filesystem.git fetchRecurseSubmodules = on-demand branch = . [submodule "function"] path = libs/function url = ../function.git fetchRecurseSubmodules = on-demand branch = . [submodule "conversion"] path = libs/conversion url = ../conversion.git fetchRecurseSubmodules = on-demand branch = . [submodule "optional"] path = libs/optional url = ../optional.git fetchRecurseSubmodules = on-demand branch = . [submodule "property_tree"] path = libs/property_tree url = ../property_tree.git fetchRecurseSubmodules = on-demand branch = . [submodule "bimap"] path = libs/bimap url = ../bimap.git fetchRecurseSubmodules = on-demand branch = . [submodule "variant"] path = libs/variant url = ../variant.git fetchRecurseSubmodules = on-demand branch = . [submodule "array"] path = libs/array url = ../array.git fetchRecurseSubmodules = on-demand branch = . [submodule "iostreams"] path = libs/iostreams url = ../iostreams.git fetchRecurseSubmodules = on-demand branch = . [submodule "multi_index"] path = libs/multi_index url = ../multi_index.git fetchRecurseSubmodules = on-demand branch = . [submodule "bcp"] path = tools/bcp url = ../bcp.git fetchRecurseSubmodules = on-demand branch = . [submodule "ptr_container"] path = libs/ptr_container url = ../ptr_container.git fetchRecurseSubmodules = on-demand branch = . [submodule "statechart"] path = libs/statechart url = ../statechart.git fetchRecurseSubmodules = on-demand branch = . [submodule "static_assert"] path = libs/static_assert url = ../static_assert.git fetchRecurseSubmodules = on-demand branch = . [submodule "range"] path = libs/range url = ../range.git fetchRecurseSubmodules = on-demand branch = . [submodule "rational"] path = libs/rational url = ../rational.git fetchRecurseSubmodules = on-demand branch = . [submodule "iterator"] path = libs/iterator url = ../iterator.git fetchRecurseSubmodules = on-demand branch = . [submodule "build"] path = tools/build url = ../build.git fetchRecurseSubmodules = on-demand branch = . [submodule "quickbook"] path = tools/quickbook url = ../quickbook.git fetchRecurseSubmodules = on-demand branch = . [submodule "graph_parallel"] path = libs/graph_parallel url = ../graph_parallel.git fetchRecurseSubmodules = on-demand branch = . [submodule "property_map"] path = libs/property_map url = ../property_map.git fetchRecurseSubmodules = on-demand branch = . [submodule "program_options"] path = libs/program_options url = ../program_options.git fetchRecurseSubmodules = on-demand branch = . [submodule "detail"] path = libs/detail url = ../detail.git fetchRecurseSubmodules = on-demand branch = . [submodule "interval"] path = libs/numeric/interval url = ../interval.git fetchRecurseSubmodules = on-demand branch = . [submodule "ublas"] path = libs/numeric/ublas url = ../ublas.git fetchRecurseSubmodules = on-demand branch = . [submodule "wave"] path = libs/wave url = ../wave.git fetchRecurseSubmodules = on-demand branch = . [submodule "type_traits"] path = libs/type_traits url = ../type_traits.git fetchRecurseSubmodules = on-demand branch = . [submodule "bind"] path = libs/bind url = ../bind.git fetchRecurseSubmodules = on-demand branch = . [submodule "pool"] path = libs/pool url = ../pool.git fetchRecurseSubmodules = on-demand branch = . [submodule "proto"] path = libs/proto url = ../proto.git fetchRecurseSubmodules = on-demand branch = . [submodule "fusion"] path = libs/fusion url = ../fusion.git fetchRecurseSubmodules = on-demand branch = . [submodule "function_types"] path = libs/function_types url = ../function_types.git fetchRecurseSubmodules = on-demand branch = . [submodule "gil"] path = libs/gil url = ../gil.git fetchRecurseSubmodules = on-demand branch = . [submodule "intrusive"] path = libs/intrusive url = ../intrusive.git fetchRecurseSubmodules = on-demand branch = . [submodule "asio"] path = libs/asio url = ../asio.git fetchRecurseSubmodules = on-demand branch = . [submodule "uuid"] path = libs/uuid url = ../uuid.git fetchRecurseSubmodules = on-demand branch = . [submodule "litre"] path = tools/litre url = ../litre.git fetchRecurseSubmodules = on-demand branch = . [submodule "circular_buffer"] path = libs/circular_buffer url = ../circular_buffer.git fetchRecurseSubmodules = on-demand branch = . [submodule "mpi"] path = libs/mpi url = ../mpi.git fetchRecurseSubmodules = on-demand branch = . [submodule "unordered"] path = libs/unordered url = ../unordered.git fetchRecurseSubmodules = on-demand branch = . [submodule "signals2"] path = libs/signals2 url = ../signals2.git fetchRecurseSubmodules = on-demand branch = . [submodule "accumulators"] path = libs/accumulators url = ../accumulators.git fetchRecurseSubmodules = on-demand branch = . [submodule "atomic"] path = libs/atomic url = ../atomic.git fetchRecurseSubmodules = on-demand branch = . [submodule "scope_exit"] path = libs/scope_exit url = ../scope_exit.git fetchRecurseSubmodules = on-demand branch = . [submodule "flyweight"] path = libs/flyweight url = ../flyweight.git fetchRecurseSubmodules = on-demand branch = . [submodule "icl"] path = libs/icl url = ../icl.git fetchRecurseSubmodules = on-demand branch = . [submodule "predef"] path = libs/predef url = ../predef.git fetchRecurseSubmodules = on-demand branch = . [submodule "chrono"] path = libs/chrono url = ../chrono.git fetchRecurseSubmodules = on-demand branch = . [submodule "polygon"] path = libs/polygon url = ../polygon.git fetchRecurseSubmodules = on-demand branch = . [submodule "msm"] path = libs/msm url = ../msm.git fetchRecurseSubmodules = on-demand branch = . [submodule "heap"] path = libs/heap url = ../heap.git fetchRecurseSubmodules = on-demand branch = . [submodule "coroutine"] path = libs/coroutine url = ../coroutine.git fetchRecurseSubmodules = on-demand branch = . [submodule "coroutine2"] path = libs/coroutine2 url = ../coroutine2.git fetchRecurseSubmodules = on-demand branch = . [submodule "ratio"] path = libs/ratio url = ../ratio.git fetchRecurseSubmodules = on-demand branch = . [submodule "odeint"] path = libs/numeric/odeint url = ../odeint.git fetchRecurseSubmodules = on-demand branch = . [submodule "geometry"] path = libs/geometry url = ../geometry.git fetchRecurseSubmodules = on-demand branch = . [submodule "phoenix"] path = libs/phoenix url = ../phoenix.git fetchRecurseSubmodules = on-demand branch = . [submodule "move"] path = libs/move url = ../move.git fetchRecurseSubmodules = on-demand branch = . [submodule "locale"] path = libs/locale url = ../locale.git fetchRecurseSubmodules = on-demand branch = . [submodule "auto_index"] path = tools/auto_index url = ../auto_index.git fetchRecurseSubmodules = on-demand branch = . [submodule "container"] path = libs/container url = ../container.git fetchRecurseSubmodules = on-demand branch = . [submodule "local_function"] path = libs/local_function url = ../local_function.git fetchRecurseSubmodules = on-demand branch = . [submodule "context"] path = libs/context url = ../context.git fetchRecurseSubmodules = on-demand branch = . [submodule "type_erasure"] path = libs/type_erasure url = ../type_erasure.git fetchRecurseSubmodules = on-demand branch = . [submodule "multiprecision"] path = libs/multiprecision url = ../multiprecision.git fetchRecurseSubmodules = on-demand branch = . [submodule "lockfree"] path = libs/lockfree url = ../lockfree.git fetchRecurseSubmodules = on-demand branch = . [submodule "assert"] path = libs/assert url = ../assert.git fetchRecurseSubmodules = on-demand branch = . [submodule "align"] path = libs/align url = ../align.git fetchRecurseSubmodules = on-demand branch = . [submodule "type_index"] path = libs/type_index url = ../type_index.git fetchRecurseSubmodules = on-demand branch = . [submodule "core"] path = libs/core url = ../core.git fetchRecurseSubmodules = on-demand branch = . [submodule "throw_exception"] path = libs/throw_exception url = ../throw_exception.git fetchRecurseSubmodules = on-demand branch = . [submodule "winapi"] path = libs/winapi url = ../winapi.git fetchRecurseSubmodules = on-demand branch = . [submodule "boostdep"] path = tools/boostdep url = ../boostdep.git fetchRecurseSubmodules = on-demand branch = . [submodule "lexical_cast"] path = libs/lexical_cast url = ../lexical_cast.git fetchRecurseSubmodules = on-demand branch = . [submodule "sort"] path = libs/sort url = ../sort.git fetchRecurseSubmodules = on-demand branch = . [submodule "convert"] path = libs/convert url = ../convert.git fetchRecurseSubmodules = on-demand branch = . [submodule "endian"] path = libs/endian url = ../endian.git fetchRecurseSubmodules = on-demand branch = . [submodule "vmd"] path = libs/vmd url = ../vmd.git fetchRecurseSubmodules = on-demand branch = . [submodule "dll"] path = libs/dll url = ../dll.git fetchRecurseSubmodules = on-demand branch = . [submodule "compute"] path = libs/compute url = ../compute.git fetchRecurseSubmodules = on-demand branch = . [submodule "hana"] path = libs/hana url = ../hana.git fetchRecurseSubmodules = on-demand branch = . [submodule "metaparse"] path = libs/metaparse url = ../metaparse.git fetchRecurseSubmodules = on-demand branch = . [submodule "qvm"] path = libs/qvm url = ../qvm.git fetchRecurseSubmodules = on-demand branch = . [submodule "fiber"] path = libs/fiber url = ../fiber.git fetchRecurseSubmodules = on-demand branch = . [submodule "process"] path = libs/process url = ../process.git fetchRecurseSubmodules = on-demand branch = . [submodule "stacktrace"] path = libs/stacktrace url = ../stacktrace.git fetchRecurseSubmodules = on-demand branch = . [submodule "poly_collection"] path = libs/poly_collection url = ../poly_collection.git fetchRecurseSubmodules = on-demand branch = . [submodule "beast"] path = libs/beast url = ../beast.git fetchRecurseSubmodules = on-demand branch = . [submodule "mp11"] path = libs/mp11 url = ../mp11.git fetchRecurseSubmodules = on-demand branch = . [submodule "callable_traits"] path = libs/callable_traits url = ../callable_traits.git fetchRecurseSubmodules = on-demand branch = . [submodule "contract"] path = libs/contract url = ../contract.git fetchRecurseSubmodules = on-demand branch = . [submodule "check_build"] path = tools/check_build url = ../check_build.git fetchRecurseSubmodules = on-demand branch = . [submodule "container_hash"] path = libs/container_hash url = ../container_hash.git fetchRecurseSubmodules = on-demand branch = . [submodule "hof"] path = libs/hof url = ../hof.git fetchRecurseSubmodules = on-demand branch = . [submodule "yap"] path = libs/yap url = ../yap.git fetchRecurseSubmodules = on-demand branch = . [submodule "safe_numerics"] path = libs/safe_numerics url = ../safe_numerics.git fetchRecurseSubmodules = on-demand branch = . [submodule "parameter_python"] path = libs/parameter_python url = ../parameter_python.git fetchRecurseSubmodules = on-demand branch = . [submodule "headers"] path = libs/headers url = ../headers.git fetchRecurseSubmodules = on-demand branch = . [submodule "boost_install"] path = tools/boost_install url = ../boost_install.git fetchRecurseSubmodules = on-demand branch = . [submodule "outcome"] path = libs/outcome url = ../outcome.git fetchRecurseSubmodules = on-demand branch = . [submodule "histogram"] path = libs/histogram url = ../histogram.git fetchRecurseSubmodules = on-demand branch = . [submodule "variant2"] path = libs/variant2 url = ../variant2.git fetchRecurseSubmodules = on-demand branch = . [submodule "nowide"] path = libs/nowide url = ../nowide.git fetchRecurseSubmodules = on-demand branch = . [submodule "docca"] path = tools/docca url = ../docca.git fetchRecurseSubmodules = on-demand branch = . [submodule "cmake"] path = tools/cmake url = ../cmake.git fetchRecurseSubmodules = on-demand branch = . [submodule "static_string"] path = libs/static_string url = ../static_string.git fetchRecurseSubmodules = on-demand branch = . [submodule "stl_interfaces"] path = libs/stl_interfaces url = ../stl_interfaces.git fetchRecurseSubmodules = on-demand branch = . [submodule "more"] path = more url = ../more.git fetchRecurseSubmodules = on-demand branch = . [submodule "leaf"] path = libs/leaf url = ../leaf.git fetchRecurseSubmodules = on-demand branch = . [submodule "json"] path = libs/json url = ../json.git fetchRecurseSubmodules = on-demand branch = . [submodule "pfr"] path = libs/pfr url = ../pfr.git fetchRecurseSubmodules = on-demand branch = . [submodule "describe"] path = libs/describe url = ../describe.git fetchRecurseSubmodules = on-demand branch = . [submodule "lambda2"] path = libs/lambda2 url = ../lambda2.git fetchRecurseSubmodules = on-demand branch = . [submodule "property_map_parallel"] path = libs/property_map_parallel url = ../property_map_parallel.git fetchRecurseSubmodules = on-demand branch = . [submodule "url"] path = libs/url url = ../url.git fetchRecurseSubmodules = on-demand branch = . [submodule "mysql"] path = libs/mysql url = ../mysql.git fetchRecurseSubmodules = on-demand branch = . [submodule "compat"] path = libs/compat url = ../compat.git fetchRecurseSubmodules = on-demand branch = . [submodule "redis"] path = libs/redis url = ../redis.git fetchRecurseSubmodules = on-demand branch = . [submodule "cobalt"] path = libs/cobalt url = ../cobalt.git fetchRecurseSubmodules = on-demand branch = . [submodule "charconv"] path = libs/charconv url = ../charconv.git fetchRecurseSubmodules = on-demand branch = . [submodule "scope"] path = libs/scope url = ../scope.git fetchRecurseSubmodules = on-demand branch = . [submodule "boostlook"] path = tools/boostlook url = ../boostlook.git fetchRecurseSubmodules = on-demand branch = . [submodule "parser"] path = libs/parser url = ../parser.git fetchRecurseSubmodules = on-demand branch = . [submodule "mqtt5"] path = libs/mqtt5 url = ../mqtt5.git fetchRecurseSubmodules = on-demand branch = . [submodule "hash2"] path = libs/hash2 url = ../hash2.git fetchRecurseSubmodules = on-demand branch = . [submodule "bloom"] path = libs/bloom url = ../bloom.git fetchRecurseSubmodules = on-demand branch = . [submodule "openmethod"] path = libs/openmethod url = ../openmethod.git fetchRecurseSubmodules = on-demand branch = . [submodule "decimal"] path = libs/decimal url = ../decimal.git fetchRecurseSubmodules = on-demand branch = . ================================================ FILE: .travis.yml ================================================ # Use, modification, and distribution are # subject to 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) # # Copyright Rene Rivera 2015-2016. # Copyright Peter Dimov 2017-2021. branches: only: - master - develop - /feature\/.*/ dist: bionic language: cpp compiler: gcc git: submodules: false env: matrix: - TRAVIS_EMPTY_JOB_WORKAROUND=true matrix: exclude: - env: TRAVIS_EMPTY_JOB_WORKAROUND=true include: - env: SCRIPT=ci_boost_release MODE=check addons: apt: packages: - xsltproc # Simple integrated status tests check. - env: SCRIPT=ci_boost_status # Same, but using release layout - env: SCRIPT=ci_boost_status RELEASE=1 # Run 'quick' tests. - env: SCRIPT=ci_boost_status TARGET=quick TOOLSET=gcc CXXSTD=03,11,14 compiler: g++ - env: SCRIPT=ci_boost_status TARGET=quick TOOLSET=clang CXXSTD=03,11,14 compiler: clang++ # Build Boost - env: SCRIPT=ci_boost_build TOOLSET=gcc compiler: g++ # Build Boost with release layout - env: SCRIPT=ci_boost_build TOOLSET=gcc RELEASE=1 compiler: g++ # Build Boost with CMake - env: CMAKE_BUILD=1 dist: xenial compiler: g++ before_script: true before_install: true after_success: true after_failure: true after_script: true addons: apt: packages: - libzstd-dev install: - git submodule update --init --jobs 3 script: - mkdir __build && cd __build - cmake -DBOOST_INSTALL_LAYOUT=tagged -DBUILD_SHARED_LIBS=ON .. - cmake --build . # Install Boost with CMake - env: CMAKE_INSTALL=1 compiler: g++ before_script: true before_install: true after_success: true after_failure: true after_script: true install: - pip install --user cmake - git submodule update --init --jobs 3 script: - mkdir __build && cd __build - cmake -DBOOST_INSTALL_LAYOUT=tagged -DBUILD_SHARED_LIBS=ON -DCMAKE_INSTALL_PREFIX=~/.local .. - cmake --build . - cmake --build . --target install # Test Boost with CMake - env: CMAKE_TEST=1 dist: bionic compiler: g++ before_script: true before_install: true after_success: true after_failure: true after_script: true addons: apt: packages: - liblzma-dev - libzstd-dev install: - git submodule update --init --jobs 3 script: - mkdir __build && cd __build - cmake -DBUILD_TESTING=ON .. - cmake --build . -j 3 - cmake --build . --target tests -j 3 -- -k - ctest --output-on-failure -j 3 -R quick before_install: # Fetch the scripts to do the actual building/testing. - git submodule update --init --jobs 3 - | wget "https://raw.githubusercontent.com/boostorg/release-tools/develop/ci_boost_common.py" -P .. wget "https://raw.githubusercontent.com/boostorg/release-tools/develop/${SCRIPT}.py" -P .. install: python "${TRAVIS_BUILD_DIR}/../${SCRIPT}.py" install before_script: python "${TRAVIS_BUILD_DIR}/../${SCRIPT}.py" before_script script: python "${TRAVIS_BUILD_DIR}/../${SCRIPT}.py" script after_success: python "${TRAVIS_BUILD_DIR}/../${SCRIPT}.py" after_success after_failure: python "${TRAVIS_BUILD_DIR}/../${SCRIPT}.py" after_failure after_script: python "${TRAVIS_BUILD_DIR}/../${SCRIPT}.py" after_script ================================================ FILE: CMakeLists.txt ================================================ # Copyright 2019, 2021 Peter Dimov # 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 cmake_minimum_required(VERSION 3.8...3.16) # The default build type must be set before project() if(CMAKE_SOURCE_DIR STREQUAL CMAKE_CURRENT_SOURCE_DIR AND NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES) set(CMAKE_BUILD_TYPE Release CACHE STRING "Build type" FORCE) set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS "Debug" "Release" "MinSizeRel" "RelWithDebInfo") endif() project(Boost VERSION 1.91.0 LANGUAGES CXX) set(BOOST_SUPERPROJECT_VERSION ${PROJECT_VERSION}) set(BOOST_SUPERPROJECT_SOURCE_DIR ${PROJECT_SOURCE_DIR}) list(APPEND CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/tools/cmake/include) include(BoostRoot) ================================================ FILE: INSTALL ================================================ See ./index.html for information about this release. The "Getting Started" section is a useful starting place. --------------------------- Copyright Beman Dawes, 2008 Distributed under the Boost Software License, Version 1.0. See ./LICENSE_1_0.txt or http://www.boost.org/LICENSE_1_0.txt ================================================ FILE: Jamroot ================================================ # Copyright Vladimir Prus 2002-2006. # Copyright Dave Abrahams 2005-2006. # Copyright René Ferdinand Rivera Morell 2005-2024. # Copyright Douglas Gregor 2005. # # 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) # Usage: # # b2 [options] [properties] [install|stage] # # Builds and installs Boost. # # Targets and Related Options: # # install Install headers and compiled library files to the # ======= configured locations (below). # # --prefix= Install architecture independent files here. # Default: C:\Boost on Windows # Default: /usr/local on Unix, Linux, etc. # # --exec-prefix= Install architecture dependent files here. # Default: # # --libdir= Install library files here. # Default: /lib # # --includedir= Install header files here. # Default: /include # # --cmakedir= Install CMake configuration files here. # Default: /cmake # # --no-cmake-config Do not install CMake configuration files. # # stage Build and install only compiled library files to the # ===== stage directory. # # --stagedir= Install library files here # Default: ./stage # # Other Options: # # --build-type= Build the specified pre-defined set of variations of # the libraries. Note, that which variants get built # depends on what each library supports. # # -- minimal -- (default) Builds a minimal set of # variants. On Windows, these are static # multithreaded libraries in debug and release # modes, using shared runtime. On Linux, these are # static and shared multithreaded libraries in # release mode. # # -- complete -- Build all possible variations. # # --build-dir=DIR Build in this location instead of building within # the distribution tree. Recommended! # # --show-libraries Display the list of Boost libraries that require # build and installation steps, and then exit. # # --layout= Determine whether to choose library names and header # locations such that multiple versions of Boost or # multiple compilers can be used on the same system. # # -- versioned -- Names of boost binaries include # the Boost version number, name and version of # the compiler and encoded build properties. Boost # headers are installed in a subdirectory of # whose name contains the Boost version # number. # # -- tagged -- Names of boost binaries include the # encoded build properties such as variant and # threading, but do not including compiler name # and version, or Boost version. This option is # useful if you build several variants of Boost, # using the same compiler. # # -- system -- Binaries names do not include the # Boost version number or the name and version # number of the compiler. Boost headers are # installed directly into . This option is # intended for system integrators building # distribution packages. # # The default value is 'versioned' on Windows, and # 'system' on Unix. # # --buildid=ID Add the specified ID to the name of built libraries. # The default is to not add anything. # # --python-buildid=ID Add the specified ID to the name of built libraries # that depend on Python. The default is to not add # anything. This ID is added in addition to --buildid. # # --help This message. # # --with- Build and install the specified . If this # option is used, only libraries specified using this # option will be built. # # --without- Do not build, stage, or install the specified # . By default, all libraries are built. # # Properties: # # toolset=toolset Indicate the toolset to build with. # # variant=debug|release Select the build variant # # link=static|shared Whether to build static or shared libraries # # threading=single|multi Whether to build single or multithreaded binaries # # runtime-link=static|shared # Whether to link to static or shared C and C++ # runtime. # require-b2 5.1.0 ; # TODO: # - handle boost version # - handle python options such as pydebug import boostcpp ; import package ; import sequence ; import xsltproc ; import set ; import path ; import link ; import notfile ; import virtual-target ; import "class" : new ; import property-set ; import threadapi-feature ; import option ; import property ; import project ; # Backslash because of `bcp --namespace` import tools/boost\_install/boost-install ; path-constant BOOST_ROOT : . ; constant BOOST_VERSION : 1.91.0 ; constant BOOST_JAMROOT_MODULE : $(__name__) ; # Allow subprojects to simply `import config : requires ;` to get access to the requires rule import-search $(BOOST_ROOT)/libs/config/checks ; import-search $(BOOST_ROOT)/libs/predef/tools/check ; boostcpp.set-version $(BOOST_VERSION) ; use-project /boost/architecture : libs/config/checks/architecture ; local all-headers = [ MATCH .*libs/(.*)/include/boost : [ glob libs/*/include/boost libs/*/*/include/boost ] ] ; for dir in $(all-headers) { link-directory $(dir)-headers : libs/$(dir)/include/boost : . ; explicit $(dir)-headers ; } if $(all-headers) { constant BOOST_MODULARLAYOUT : $(all-headers) ; } project /boost : requirements . [ boostcpp.platform ] # Disable auto-linking for all targets here, primarily because it caused # troubles with V2. BOOST_ALL_NO_LIB=1 # Used to encode variant in target name. See the 'tag' rule below. @$(__name__).tag @handle-static-runtime @clang-darwin-cxxstd-11 # Comeau does not support shared lib como:static como-linux:_GNU_SOURCE=1 # When building docs within Boost, we want the standard Boost style boost.defaults=Boost @threadapi-feature.detect : usage-requirements . : default-build hidden multi : build-dir bin.v2 ; # General, top-level, modular project searching. Also include tools in the # project search. project-search /boost : libs tools ; # Temporary custom project searching to account for special library paths. project-search /boost : libs/numeric ; project-search /boost/numeric_conversion : libs/numeric/conversion ; # This rule is called by Boost.Build to determine the name of target. We use it # to encode the build variant, compiler name and boost version in the target # name. # rule tag ( name : type ? : property-set ) { return [ boostcpp.tag $(name) : $(type) : $(property-set) ] ; } rule python-tag ( name : type ? : property-set ) { return [ boostcpp.python-tag $(name) : $(type) : $(property-set) ] ; } rule handle-static-runtime ( properties * ) { # Using static runtime with shared libraries is impossible on Linux, and # dangerous on Windows. Therefore, we disallow it. This might be drastic, # but it was disabled for a while without anybody complaining. local argv = [ modules.peek : ARGV ] ; if shared in $(properties) && static in $(properties) # For CW, static runtime is needed so that std::locale works. && ! ( cw in $(properties) ) && ! --allow-shared-static in $(argv) { boostcpp.emit-shared-static-warning ; return no ; } } rule clang-darwin-cxxstd-11 ( properties * ) { # AppleClang defaults to C++03 local result = [ property.select : $(properties) ] ; if darwin in $(properties) { result ?= 11 ; } return $(result) ; } # All libraries. local all-libraries = [ MATCH .*libs/(.*)/meta/libraries.json : [ glob libs/*/meta/libraries.json ] ] ; # Find all the libraries that have something to build (the old way). local all-libraries-to-build = [ MATCH .*libs/(.*)/build/.* : [ glob libs/*/build/Jamfile.v2 ] [ glob libs/*/build/Jamfile ] ] ; all-libraries-to-build = [ sequence.unique $(all-libraries-to-build) ] ; # The function_types library has a Jamfile, but it's used for maintenance # purposes, there's no library to build and install. all-libraries-to-build = [ set.difference $(all-libraries-to-build) : function_types ] ; # Find all the libraries that have a library-root build declaration (modular way). local all-libraries-modular-build = [ MATCH .*libs/(.*)/build.jam : [ glob libs/*/build.jam ] ] ; # Modular and not are mutually exclusive as they have different lib targets. local all-libraries-old-build = [ set.difference $(all-libraries-to-build) : $(all-libraries-modular-build) ] ; # The header only libraries that are not of the new modular form. For which we # will create synthetic projects and targets to simulate the new modular form. local all-libraries-to-declare = [ set.difference $(all-libraries) : $(all-libraries-modular-build) $(all-libraries-old-build) ] ; if ! [ glob libs/numeric/conversion/build.jam ] { all-libraries-to-declare += numeric_conversion ; } if ! [ glob libs/numeric/interval/build.jam ] { all-libraries-to-declare += interval ; } if ! [ glob libs/numeric/odeint/build.jam ] { all-libraries-to-declare += odeint ; } if ! [ glob libs/numeric/ublas/build.jam ] { all-libraries-to-declare += ublas ; } all-libraries-to-declare = [ SORT $(all-libraries-to-declare) ] ; # ECHO "INFO: Build Libraries:" [ SORT $(all-libraries-old-build) ] ; # ECHO "INFO: Modular Libraries:" [ SORT $(all-libraries-modular-build) ] ; # ECHO "INFO: Declared Libraries:" [ SORT $(all-libraries-to-declare) ] ; # EXIT : 0 ; # Setup convenient aliases for all libraries. # First, the complicated libraries: where the target name in Jamfile is # different from its directory name. explicit [ alias prg_exec_monitor : libs/test/build//boost_prg_exec_monitor ] [ alias test_exec_monitor : libs/test/build//boost_test_exec_monitor ] [ alias unit_test_framework : libs/test/build//boost_unit_test_framework ] [ alias serialization : libs/serialization/build//boost_serialization ] [ alias wserialization : libs/serialization/build//boost_wserialization ] ; for local l in $(all-libraries-old-build) { if ! $(l) in test graph serialization headers { explicit [ alias $(l) : libs/$(l)/build//boost_$(l) ] ; } } for local l in $(all-libraries-modular-build) { if ! $(l) in test graph serialization headers { explicit [ alias $(l) : /boost/$(l)//boost_$(l) ] ; } } rule do-nothing { } rule generate-alias ( project name : property-set : sources * ) { local action-name = [ $(property-set).get ] ; local m = [ MATCH ^@(.*) : $(action-name) ] ; property-set = [ property-set.empty ] ; local action = [ new action $(sources) : $(m[1]) : $(property-set) ] ; local t = [ new notfile-target $(name) : $(project) : $(action) ] ; return [ virtual-target.register $(t) ] ; } generate headers : $(all-headers)-headers : @generate-alias @do-nothing : : . ; #alias headers : $(all-headers)-headers : : : . ; explicit headers ; # Make project ids of all libraries known. for local l in $(all-libraries-old-build) { use-project /boost/$(l) : libs/$(l)/build ; } if [ path.exists $(BOOST_ROOT)/tools/inspect/build ] { use-project /boost/tools/inspect : tools/inspect/build ; } if [ path.exists $(BOOST_ROOT)/libs/wave/tool/build ] { use-project /boost/libs/wave/tool : $(BOOST_ROOT)/libs/wave/tool/build ; } # Make the boost-install rule visible in subprojects # This rule should be called from libraries' Jamfiles and will create two # targets, "install" and "stage", that will install or stage that library. The # --prefix option is respected, but --with and --without options, naturally, are # ignored. # # - libraries -- list of library targets to install. rule boost-install ( libraries * ) { boost-install.boost-install $(libraries) ; } # Creates a library target, adding autolink support and also creates # stage and install targets via boost-install, above. rule boost-lib ( name : sources * : requirements * : default-build * : usage-requirements * ) { autolink = shared:BOOST_$(name:U)_DYN_LINK=1 ; name = boost_$(name) ; lib $(name) : $(sources) : $(requirements) $(autolink) : $(default-build) : $(usage-requirements) $(autolink) ; boost-install $(name) ; } # Declare special top-level targets that build and install the desired variants # of the libraries. boostcpp.declare-targets $(all-libraries-to-build) ; # Declare a Boost library and run related declaration rules. This should be # called from the libroot/build.jam to define the components of a Boost lib. # The first arg is the base ID of the library. Each subsequence arg is a # Boost (boost-x) declaration rule to call with arguments. # # For example: # # call-if : boost-library serialization # : install boost_serialization boost_wserialization ; # rule boost-library ( id ? : options * : * ) { # ECHO "INFO: Declare Boost library:" $(id) ; local called-boost-install ; for n in 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 { local option = $($(n)) ; if $(option) { call-if : boost-$(option[1]) $(option[2-]) ; if $(option[1]) = install { called-boost-install = true ; } } } if ! $(called-boost-install) { # If the library didn't indicate an install build target it's likely # header only. We should declare empty install targets to allow for # generic handling. boost-install.boost-install ; } } # Declare projects and targets for all placeholder, header only, not yet # modular libraries. # # NOTE: This has to be after the boost-* rule definitions to ensure that those # are available for import into the new projects. local location = [ project.attribute $(__name__) location ] ; for local lib in $(all-libraries-to-declare) { local lib-path = [ path.join $(location) libs $(lib) ] ; if $(lib) = numeric_conversion { lib-path = [ path.join $(location) libs/numeric/conversion ] ; } else if $(lib) in interval odeint ublas { lib-path = [ path.join $(location) libs/numeric/$(lib) ] ; } local lib-module = [ project.load $(lib-path) : synthesize ] ; modules.poke $(lib-module) : BOOST_LIB_PROJECT : /boost/$(lib) ; modules.poke $(lib-module) : BOOST_LIB_TARGET : boost_$(lib) ; project.push-current [ project.target $(lib-module) ] ; module $(lib-module) { project $(BOOST_LIB_PROJECT) : requirements /boost//headers ; alias $(BOOST_LIB_TARGET) ; } project.pop-current ; } # Backslash because of `bcp --namespace` if ! [ project.search /boost/tools/boost\_install ] { use-project /boost/tools/boost\_install : tools/boost\_install ; } # Ensure "modular" libraries' projects are loaded before build request is # calculated. This is necessary for subprojects that define custom features # to be set by users on command line. # This part should stay at the bottom of the file, because subprojects may rely # on rules or constants from it. for local l in $(all-libraries-modular-build) { # project.find returns the module for the project, which ensures that the # project is loaded. The convoluted way the rule is invoked is due to the # fact that project.find can only be called from a project target instance. modules.call-in [ project.target $(__name__) ] : project.find /boost/$(l) : $(location) ; } ================================================ FILE: LICENSE_1_0.txt ================================================ Boost Software License - Version 1.0 - August 17th, 2003 Permission is hereby granted, free of charge, to any person or organization obtaining a copy of the software and accompanying documentation covered by this license (the "Software") to use, reproduce, display, distribute, execute, and transmit the Software, and to prepare derivative works of the Software, and to permit third-parties to whom the Software is furnished to do so, all subject to the following: The copyright notices in the Software and this entire statement, including the above license grant, this restriction and the following disclaimer, must be included in all copies of the Software, in whole or in part, and all derivative works of the Software, unless such copies or derivative works are solely in the form of machine-executable object code generated by a source language processor. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ================================================ FILE: README.md ================================================ # Boost C++ Libraries The Boost project provides free peer-reviewed portable C++ source libraries. We emphasize libraries that work well with the C++ Standard Library. Boost libraries are intended to be widely useful, and usable across a broad spectrum of applications. The Boost license encourages both commercial and non-commercial use and does not require attribution for binary use. The project website is www.boost.org, where you can obtain more information and [download](https://www.boost.org/users/download/) the current release. ================================================ FILE: appveyor.yml ================================================ version: 1.0.{build}-{branch} branches: only: - develop - master environment: matrix: - APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2013 SCRIPT: ci_boost_test_library - APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2015 SCRIPT: ci_boost_test_library - APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2017 SCRIPT: ci_boost_test_library - APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2017 SCRIPT: ci_boost_status TARGET: quick init: - cd %APPVEYOR_BUILD_FOLDER%/.. - appveyor DownloadFile "https://raw.githubusercontent.com/boostorg/release-tools/develop/ci_boost_common.py" - appveyor DownloadFile "https://raw.githubusercontent.com/boostorg/release-tools/develop/%SCRIPT%.py" - cd %APPVEYOR_BUILD_FOLDER% install: python ../%SCRIPT%.py install before_build: python ../%SCRIPT%.py before_build build_script: python ../%SCRIPT%.py build_script after_build: python ../%SCRIPT%.py after_build before_test: python ../%SCRIPT%.py before_test test_script: python ../%SCRIPT%.py test_script after_test: python ../%SCRIPT%.py after_test on_success: python ../%SCRIPT%.py on_success on_failure: python ../%SCRIPT%.py on_failure on_finish: python ../%SCRIPT%.py on_finish ================================================ FILE: boost-build.jam ================================================ # Copyright (C) 2002-2003 David Abrahams. # Copyright (C) 2002-2003 Vladimir Prus. # Copyright (C) 2003,2007 Rene Rivera. # Use, modification and distribution are subject to 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) # This is the initial file loaded by Boost Jam when run from any Boost library # folder. It allows us to choose which Boost Build installation to use for # building Boost libraries. Unless explicitly selected using a command-line # option, the version included with the Boost library distribution is used (as # opposed to any other Boost Build version installed on the user's system). BOOST_ROOT = $(.boost-build-file:D) ; BOOST_BUILD = [ MATCH --boost-build=(.*) : $(ARGV) ] ; BOOST_BUILD ?= tools/build/src ; boost-build $(BOOST_BUILD) ; ================================================ FILE: boost.css ================================================ /*============================================================================= Copyright 2002 William E. Kempf Distributed under the Boost Software License, Version 1.0. (See accompany- ing file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) =============================================================================*/ H1 { FONT-SIZE: 200%; COLOR: #00008B; } H2 { FONT-SIZE: 150%; } H3 { FONT-SIZE: 125%; } H4 { FONT-SIZE: 108%; } BODY { FONT-SIZE: 100%; BACKGROUND-COLOR: #ffffff; COLOR: #000000; } PRE { MARGIN-LEFT: 2em; FONT-FAMILY: Courier, monospace; } CODE { FONT-FAMILY: Courier, monospace; } CODE.as_pre { white-space: pre; } .index { TEXT-ALIGN: left; } .page-index { TEXT-ALIGN: left; } .definition { TEXT-ALIGN: left; } .footnote { FONT-SIZE: 66%; VERTICAL-ALIGN: super; TEXT-DECORATION: none; } .function-semantics { CLEAR: left; } ================================================ FILE: boostcpp.jam ================================================ # Boost.Build support specific for the Boost C++ Libraries. # Copyright Vladimir Prus 2002-2010. # Copyright Dave Abrahams 2005-2006. # Copyright Rene Rivera 2005-2007. # Copyright Douglas Gregor 2005. # # 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 "class" : new ; import common ; import configure ; import build-system ; import generate ; import modules ; import option ; import os ; import package ; import path ; import project ; import regex ; import sequence ; import set ; import targets ; import feature ; import property ; import version : version-less ; ############################################################################## # # 0. General setup. Parse options, check them. # ############################################################################## BOOST_ROOT = [ modules.binding $(__name__) ] ; BOOST_ROOT = $(BOOST_ROOT:D) ; rule set-version ( version ) { BOOST_VERSION = $(version) ; local version-tag = [ MATCH "^([^.]+)[.]([^.]+)[.]([^.]+)" : $(BOOST_VERSION) ] ; if $(version-tag[3]) = 0 { version-tag = $(version-tag[1-2]) ; } BOOST_VERSION_TAG = $(version-tag:J=_) ; } # Option to choose how many variants to build. The default is "minimal". build-type = [ option.get build-type ] ; build-type ?= minimal ; if ! ( $(build-type) in complete minimal ) { EXIT The value of the --build-type option should be either 'complete' or 'minimal' ; } # What kind of layout are we doing? layout = [ option.get layout : "" ] ; layout = [ MATCH (versioned|tagged|system)(-(.+))? : $(layout) ] ; if $(layout[3]) { layout-version = $(layout[3]) ; layout = $(layout[1]) ; if [ version-less [ regex.split $(layout-version) "[.]" ] : 1 66 ] { layout-version = 1.40 ; } else if [ version-less [ regex.split $(layout-version) "[.]" ] : 1 69 ] { layout-version = 1.66 ; } } layout-version ?= 1.69 ; # On Windows, we used versioned layout by default in order to be compatible with # autolink. On other systems, we use system layout which is what every other # program uses. Note that the Windows check is static, and will not be affected # by specific build properties used. if ! $(layout) { if [ os.name ] = NT { layout = versioned ; } else { layout = system ; } } layout-$(layout) = true ; if $(layout) = system && $(build-type) = complete { ECHO error\: Cannot use --layout=system with --build-type complete. ; ECHO error\: Please use either --layout=versioned or --layout=tagged ; ECHO error\: if you wish to build multiple variants. ; if [ os.name ] != NT { ECHO error\: Note that --layout=system is used by default on Unix starting with Boost 1.40. ; } EXIT ; } # Possible stage only location. stage-locate = [ option.get stagedir ] ; if $(stage-locate) { stage-locate = [ path.root [ path.make $(stage-locate) ] [ path.pwd ] ] ; } else { stage-locate = $(BOOST_ROOT)/stage ; } BOOST_STAGE_LOCATE = $(stage-locate) ; # Custom build ID. build-id = [ option.get buildid ] ; if $(build-id) { BUILD_ID = [ regex.replace $(build-id) "[*\\/:.\"\' ]" _ ] ; } # Python build id (for Python libraries only). python-id = [ option.get "python-buildid" ] ; if $(python-id) { PYTHON_ID = [ regex.replace $(python-id) "[*\\/:.\"\']" _ ] ; } if $(layout) = versioned { switch $(layout-version) { case 1.40 : .format-name-args = ; case 1.66 : .format-name-args = ; case 1.69 : .format-name-args = ; } } else if $(layout) = tagged { switch $(layout-version) { case 1.40 : .format-name-args = ; case 1.66 : .format-name-args = ; case 1.69 : .format-name-args = ; } } else if $(layout) = system { .format-name-args = ; } else { .format-name-error = true ; } ################################################################################ # # 1. 'tag' function adding decorations suitable to the properties if versioned # or tagged layout is requested. Called from Jamroot. # ################################################################################ rule tag ( name : type ? : property-set ) { if $(type:E=x) in STATIC_LIB SHARED_LIB IMPORT_LIB { local args = $(.format-name-args) ; if $(layout) = versioned { args += -$(BOOST_VERSION_TAG) ; } local result = [ common.format-name $(args) -$(BUILD_ID) : $(name) : $(type) : $(property-set) ] ; if $(.format-name-error) { EXIT error\: invalid layout '$(layout:E=)' ; } # Optionally add version suffix. On NT, library with version suffix will # not be recognized by linkers. On CYGWIN, we get strage duplicate # symbol errors when library is generated with version suffix. On OSX, # version suffix is not needed -- the linker expects the # libFoo.1.2.3.dylib format. AIX linkers do not accept version suffixes # either. Pgi compilers can not accept a library with version suffix. # For android, if we link to libFoo.so, which is a soft link to libFoo.so.1.2.3, # the android studio will only pack the former into the final apk. if $(type) = SHARED_LIB && ! [ $(property-set).get ] in windows cygwin darwin aix android && ! [ $(property-set).get ] in pgi { result = $(result).$(BOOST_VERSION) ; } return $(result) ; } } # Specialized tag function to use for libraries linking to Python. # Appends value of --python-buildid if provided. rule python-tag ( name : type ? : property-set ) { local result = $(name) ; if $(type) in STATIC_LIB SHARED_LIB IMPORT_LIB { # Add Python version suffix local version = [ $(property-set).get ] ; local major-minor = [ MATCH "^([0-9]+)\.([0-9]+)" : $(version) ] ; local suffix = $(major-minor:J="") ; if $(suffix) { result = $(result)$(suffix) ; } # Add PYTHON_ID if supplied if $(PYTHON_ID) { result = $(result)-$(PYTHON_ID) ; } } # forward to the boost tagging rule return [ tag $(result) : $(type) : $(property-set) ] ; } ################################################################################ # # 2. Declare targets that build and install all libraries. Specifically: # # - 'stage-proper' that puts all libraries in stage/lib # - 'install-proper' that install libraries and headers to system location # ################################################################################ rule declare_install_and_stage_proper_targets ( libraries * ) { local p = [ project.current ] ; local install-targets ; local stage-targets ; for local library in $(libraries) { local mp = [ project.search /boost/$(library) ] ; if $(mp) { install-targets += /boost/$(library)//install ; stage-targets += /boost/$(library)//stage ; } else { install-targets += libs/$(library)/build//install ; stage-targets += libs/$(library)/build//stage ; } } alias install-proper : $(install-targets) ; $(p).mark-target-as-explicit install-proper ; alias stage-proper : $(stage-targets) ; $(p).mark-target-as-explicit stage-proper ; } ################################################################################ # # 3. Declare top-level targets 'stage' and 'install'. These examine the # --build-type option and, in case it is 'complete', build the 'install-proper' # and 'stage-proper' targets with a number of property sets. # ################################################################################ rule emit-shared-static-warning ( ) { if ! $(.shared-static-warning-emitted) { ECHO "" ; ECHO "warning: The configuration link=shared, runtime-link=static is disabled" ; ECHO "warning: by default as being too dangerous to use, and will not be built." ; ECHO "warning: To enable it, use --allow-shared-static." ; ECHO "" ; .shared-static-warning-emitted = 1 ; } } class top-level-target : alias-target-class { import modules ; import boostcpp ; rule __init__ ( name : project : sources * : requirements * : default-build * : usage-requirements * ) { alias-target-class.__init__ $(name) : $(project) : $(sources) : $(requirements) : $(default-build) : $(usage-requirements) ; self.build-type = [ modules.peek boostcpp : build-type ] ; # On Linux, we build the release variant by default, since few users # will ever want to debug C++ Boost libraries, and there is no ABI # incompatibility between debug and release variants. We build shared # and static libraries since that is what most packages seem to provide # (.so in libfoo and .a in libfoo-dev). self.minimal-properties = [ property-set.create release multi shared static shared ] ; # On Windows, new IDE projects use: # # runtime-link=dynamic, threading=multi, variant=(debug|release) # # and in addition, C++ Boost's autolink defaults to static linking. self.minimal-properties-win = [ property-set.create debug release multi static shared 32 64 ] ; self.complete-properties = [ property-set.create debug release multi shared static shared static ] ; self.complete-properties-win = [ property-set.create debug release multi shared static shared static 32 64 ] ; } rule generate ( property-set ) { modules.poke : top-level-targets : [ modules.peek : top-level-targets ] $(self.name) ; local os = [ $(property-set).get ] ; # Because we completely override the parent's 'generate' we need to # check for default feature values ourselves. if ! $(os) { os = [ feature.defaults ] ; os = $(os:G=) ; } local build-type-set ; if $(self.build-type) = minimal { if $(os) = windows { build-type-set = $(self.minimal-properties-win) ; } else { build-type-set = $(self.minimal-properties) ; } } else if $(self.build-type) = complete { if $(os) = windows { build-type-set = $(self.complete-properties-win) ; } else { build-type-set = $(self.complete-properties) ; } } else { import errors ; errors.error "Unknown build type" ; } if $(build-type-set) { local expanded = [ targets.apply-default-build $(property-set) : $(build-type-set) ] ; # Filter inappropriate combinations. local filtered ; local skipped ; local argv = [ modules.peek : ARGV ] ; for local p in $(expanded) { # See comment in handle-static-runtime regarding this logic. if [ $(p).get ] = shared && [ $(p).get ] = static && [ $(p).get ] != cw && ! --allow-shared-static in $(argv) { # Skip this. skipped += $(p) ; } else { filtered += $(p) ; } } if $(expanded) = $(skipped) { boostcpp.emit-shared-static-warning ; } return [ build-multiple $(filtered) ] ; } } rule build-multiple ( property-sets * ) { local usage-requirements = [ property-set.empty ] ; local result ; for local p in $(property-sets) { local r = [ alias-target-class.generate $(p) ] ; if $(r) { usage-requirements = [ $(usage-requirements).add $(r[1]) ] ; result += $(r[2-]) ; } } return $(usage-requirements) [ sequence.unique $(result) ] ; } } rule declare_top_level_targets ( libraries * ) { declare_install_and_stage_proper_targets $(libraries) ; targets.create-metatarget top-level-target : [ project.current ] : install : install-proper ; targets.create-metatarget top-level-target : [ project.current ] : stage : stage-proper headers ; p = [ project.current ] ; $(p).mark-target-as-explicit install stage ; # This target is built by default, and will forward to 'stage' after # producing some explanations. targets.create-metatarget top-level-target : [ project.current ] : forward : explain stage ; } ################################################################################ # # 4. Add hook to report configuration before the build, and confirmation with # setup instructions after the build. # ################################################################################ message explain : "\nBuilding the Boost C++ Libraries.\n\n" ; local p = [ project.current ] ; $(p).mark-target-as-explicit explain ; rule pre-build ( ) { local tl = [ modules.peek : top-level-targets ] ; if stage in $(tl) || install in $(tl) { # FIXME: Remove 'if' when Boost regression tests start using trunk bjam. if PAD in [ RULENAMES ] { configure.print-component-configuration ; } } } IMPORT $(__name__) : pre-build : : $(__name__).pre-build ; build-system.set-pre-build-hook $(__name__).pre-build ; rule post-build ( ok ? ) { if forward in [ modules.peek : top-level-targets ] { if $(ok) { local include-path = [ path.native $(BOOST_ROOT) ] ; local stage-abs = [ path.native $(stage-locate)/lib ] ; ECHO " The Boost C++ Libraries were successfully built! The following directory should be added to compiler include paths: $(include-path) The following directory should be added to linker library paths: $(stage-abs) " ; } } } IMPORT $(__name__) : post-build : : $(__name__).post-build ; build-system.set-post-build-hook $(__name__).post-build ; ################################################################################ # # 5. Top-level setup. # ################################################################################ # Decides which libraries are to be installed by looking at --with- # --without- arguments. Returns the list of directories under "libs" # which must be built and installed. # rule libraries-to-install ( existing-libs * ) { local argv = [ modules.peek : ARGV ] ; local with-parameter = [ MATCH ^--with-(.*) : $(argv) ] ; local without-parameter = [ MATCH ^--without-(.*) : $(argv) ] ; if ! $(with-parameter) && ! $(without-parameter) { # Nothing is specified on command line. See if maybe project-config.jam # has some choices. local libs = [ modules.peek project-config : libraries ] ; with-parameter = [ MATCH ^--with-(.*) : $(libs) ] ; without-parameter = [ MATCH ^--without-(.*) : $(libs) ] ; } # Do some checks. if $(with-parameter) && $(without-parameter) { EXIT error\: both --with- and --without- specified ; } local wrong = [ set.difference $(with-parameter) : $(existing-libs) ] ; if $(wrong) { EXIT error\: wrong library name '$(wrong[1])' in the --with- option. ; } local wrong = [ set.difference $(without-parameter) : $(existing-libs) ] ; if $(wrong) { EXIT error\: wrong library name '$(wrong[1])' in the --without- option. ; } if $(with-parameter) { return [ set.intersection $(existing-libs) : $(with-parameter) ] ; } else { return [ set.difference $(existing-libs) : $(without-parameter) ] ; } } rule declare-targets ( all-libraries * ) { configure.register-components $(all-libraries) ; # Select the libraries to install. libraries = [ libraries-to-install $(all-libraries) ] ; configure.components-building $(libraries) ; if [ option.get "show-libraries" : : true ] { ECHO The following libraries require building\: ; for local l in $(libraries) { if $(l) = function_types { continue ; } if [ path.glob $(BOOST_ROOT)/libs/$(l)/build : Jamfile Jamfile.v2 ] { echo " - $(l)" ; } } EXIT ; } declare_top_level_targets $(libraries) ; } # Returns the properties identifying the toolset. We'll use them # below to configure checks. These are essentially same as in # configure.builds, except we don't use address-model and # architecture - as we're trying to detect them here. # rule toolset-properties ( properties * ) { local toolset = [ property.select : $(properties) ] ; local toolset-version-property = "" ; return [ property.select $(toolset-version-property) : $(properties) ] ; } .deducible-architectures = arm loongarch mips power riscv s390x sparc x86 combined ; feature.feature x-deduced-platform : $(.deducible-architectures)_32 $(.deducible-architectures)_64 : composite implicit optional propagated ; for a in $(.deducible-architectures) { feature.compose $(a)_32 : $(a) 32 ; feature.compose $(a)_64 : $(a) 64 ; } rule deduce-architecture ( properties * ) { local deduced-pl = [ property.select : $(properties) ] ; if $(deduced-pl) { return $(deduced-pl) ; } local filtered = [ toolset-properties $(properties) ] ; local names = 32 64 ; local idx = [ configure.find-builds "default address-model" : $(filtered) : /boost/architecture//32 "32-bit" : /boost/architecture//64 "64-bit" ] ; local deduced-am = $(names[$(idx)]) ; if ! $(deduced-am) { return ; } names = $(.deducible-architectures) ; idx = [ configure.find-builds "default architecture" : $(filtered) : /boost/architecture//arm : /boost/architecture//loongarch : /boost/architecture//mips : /boost/architecture//power : /boost/architecture//riscv : /boost/architecture//s390x : /boost/architecture//sparc : /boost/architecture//x86 : /boost/architecture//combined ] ; local deduced-arch = $(names[$(idx)]) ; if ! $(deduced-arch) { return ; } local requested-am = [ property.select : $(properties) ] ; requested-am ?= $(deduced-am) ; local requested-arch = [ property.select : $(properties) ] ; requested-arch ?= $(deduced-arch) ; deduced-pl = $(requested-arch:G=)_$(requested-am:G=) ; if ! $(deduced-pl:G=) in [ feature.values ] { deduced-pl = ; } return $(deduced-pl) ; } rule deduce-address-model ( properties * ) { # this rule is a noop and exists for legacy reasons } rule platform ( ) { return @boostcpp.deduce-architecture @boostcpp.deduce-address-model ; } ================================================ FILE: bootstrap.bat ================================================ @ECHO OFF SETLOCAL REM Copyright 2019-2020 Rene Rivera REM Copyright (C) 2009 Vladimir Prus REM REM Distributed under the Boost Software License, Version 1.0. REM (See accompanying file LICENSE_1_0.txt or http://www.boost.org/LICENSE_1_0.txt) ECHO Building Boost.Build engine if exist ".\tools\build\src\engine\b2.exe" del tools\build\src\engine\b2.exe pushd tools\build\src\engine call .\build.bat %* @ECHO OFF popd if exist ".\tools\build\src\engine\b2.exe" ( copy .\tools\build\src\engine\b2.exe . > nul goto :bjam_built) goto :bjam_failure :bjam_built REM Ideally, we should obtain the toolset that build.bat has REM guessed. However, it uses setlocal at the start and does not REM export BOOST_JAM_TOOLSET, and I don't know how to do that REM properly. Default to msvc if not specified. SET TOOLSET=msvc IF "%1"=="gcc" SET TOOLSET=gcc IF "%1"=="clang" SET TOOLSET=clang IF "%1"=="borland" SET TOOLSET=embarcadero IF "%1"=="vc71" SET TOOLSET=msvc : 7.1 IF "%1"=="vc8" SET TOOLSET=msvc : 8.0 IF "%1"=="vc9" SET TOOLSET=msvc : 9.0 IF "%1"=="vc10" SET TOOLSET=msvc : 10.0 IF "%1"=="vc11" SET TOOLSET=msvc : 11.0 IF "%1"=="vc12" SET TOOLSET=msvc : 12.0 IF "%1"=="vc14" SET TOOLSET=msvc : 14.0 IF "%1"=="vc141" SET TOOLSET=msvc : 14.1 IF "%1"=="vc142" SET TOOLSET=msvc : 14.2 IF "%1"=="vc143" SET TOOLSET=msvc : 14.3 IF "%1"=="vc145" SET TOOLSET=msvc : 14.5 ECHO. ECHO Generating Boost.Build configuration in project-config.jam for %TOOLSET%... ECHO # Boost.Build Configuration > project-config.jam ECHO # Automatically generated by bootstrap.bat >> project-config.jam ECHO. >> project-config.jam ECHO import option ; >> project-config.jam ECHO. >> project-config.jam ECHO using %TOOLSET% ; >> project-config.jam ECHO. >> project-config.jam ECHO option.set keep-going : false ; >> project-config.jam ECHO. >> project-config.jam ECHO. ECHO Bootstrapping is done. To build, run: ECHO. ECHO .\b2 ECHO. IF EXIST libs\config\include ( ECHO. To generate header files, run: ECHO. ECHO. .\b2 headers ECHO. ) ECHO To adjust configuration, edit 'project-config.jam'. ECHO Further information: ECHO. ECHO - Command line help: ECHO .\b2 --help ECHO. ECHO - Getting started guide: ECHO http://boost.org/more/getting_started/windows.html ECHO. ECHO - Boost.Build documentation: ECHO http://www.boost.org/build/ ECHO. goto :end :bjam_failure ECHO. ECHO Failed to build Boost.Build engine. ECHO. REM Set an error code to allow `bootstrap && b2` cmd /c exit /b 1 > nul :end ================================================ FILE: bootstrap.sh ================================================ #!/bin/sh # Copyright 2019-2021 René Ferdinand Rivera Morell # Copyright (C) 2005, 2006 Douglas Gregor. # Copyright (C) 2006 The Trustees of Indiana University # # Distributed under the Boost Software License, Version 1.0. # (See accompanying file LICENSE_1_0.txt or http://www.boost.org/LICENSE_1_0.txt) # boostinspect:notab - Tabs are required for the Makefile. BJAM="" TOOLSET="" BJAM_CONFIG="" BUILD="" PREFIX=/usr/local EPREFIX= LIBDIR= INCLUDEDIR= LIBS="" PYTHON=python PYTHON_VERSION= PYTHON_ROOT= ICU_ROOT= # Handle case where builtin shell version of echo command doesn't # support -n. Use the installed echo executable if there is one # rather than builtin version to ensure -n is supported. ECHO=`which echo` if test "x$ECHO" = x; then ECHO=echo fi # Internal flags flag_no_python= flag_icu= flag_show_libraries= for option do case $option in -help | --help | -h) want_help=yes ;; -prefix=* | --prefix=*) PREFIX=`expr "x$option" : "x-*prefix=\(.*\)"` ;; -exec-prefix=* | --exec-prefix=*) EPREFIX=`expr "x$option" : "x-*exec-prefix=\(.*\)"` ;; -libdir=* | --libdir=*) LIBDIR=`expr "x$option" : "x-*libdir=\(.*\)"` ;; -includedir=* | --includedir=*) INCLUDEDIR=`expr "x$option" : "x-*includedir=\(.*\)"` ;; -show-libraries | --show-libraries ) flag_show_libraries=yes ;; -with-bjam=* | --with-bjam=* ) BJAM=`expr "x$option" : "x-*with-bjam=\(.*\)"` ;; -with-icu | --with-icu ) flag_icu=yes ;; -with-icu=* | --with-icu=* ) flag_icu=yes ICU_ROOT=`expr "x$option" : "x-*with-icu=\(.*\)"` ;; -without-icu | --without-icu ) flag_icu=no ;; -with-libraries=* | --with-libraries=* ) library_list=`expr "x$option" : "x-*with-libraries=\(.*\)"` if test "$library_list" != "all"; then old_IFS=$IFS IFS=, for library in $library_list do LIBS="$LIBS --with-$library" if test $library = python; then requested_python=yes fi done IFS=$old_IFS if test "x$requested_python" != xyes; then flag_no_python=yes fi fi ;; -without-libraries=* | --without-libraries=* ) library_list=`expr "x$option" : "x-*without-libraries=\(.*\)"` old_IFS=$IFS IFS=, for library in $library_list do LIBS="$LIBS --without-$library" if test $library = python; then flag_no_python=yes fi done IFS=$old_IFS ;; -with-python=* | --with-python=* ) PYTHON=`expr "x$option" : "x-*with-python=\(.*\)"` ;; -with-python-root=* | --with-python-root=* ) PYTHON_ROOT=`expr "x$option" : "x-*with-python-root=\(.*\)"` ;; -with-python-version=* | --with-python-version=* ) PYTHON_VERSION=`expr "x$option" : "x-*with-python-version=\(.*\)"` ;; -with-toolset=* | --with-toolset=* ) TOOLSET=`expr "x$option" : "x-*with-toolset=\(.*\)"` ;; -*) { echo "error: unrecognized option: $option Try \`$0 --help' for more information." >&2 { (exit 1); exit 1; }; } ;; esac done if test "x$want_help" = xyes; then cat < /dev/null 2>&1` if [ "$?" -ne "0" ]; then flag_no_python=yes fi fi if test "x$flag_no_python" = x; then if test "x$PYTHON_VERSION" = x; then $ECHO -n "Detecting Python version... " PYTHON_VERSION=`$PYTHON -c "import sys; print (\"%d.%d\" % (sys.version_info[0], sys.version_info[1]))"` echo $PYTHON_VERSION fi if test "x$PYTHON_ROOT" = x; then $ECHO -n "Detecting Python root... " PYTHON_ROOT=`$PYTHON -c "import sys; print(sys.prefix)"` echo $PYTHON_ROOT fi fi # Configure ICU $ECHO -n "Unicode/ICU support for Boost.Regex?... " if test "x$flag_icu" != xno; then if test "x$ICU_ROOT" = x; then if command -v pkg-config > /dev/null && pkg-config icu-uc ; then ICU_ROOT=`pkg-config --variable=prefix icu-uc` fi fi if test "x$ICU_ROOT" = x; then COMMON_ICU_PATHS="/usr /usr/local /sw" for p in $COMMON_ICU_PATHS; do if test -r $p/include/unicode/utypes.h; then ICU_ROOT=$p fi done if test "x$ICU_ROOT" = x; then echo "not found." else BJAM_CONFIG="$BJAM_CONFIG -sICU_PATH=$ICU_ROOT" echo "$ICU_ROOT" fi else BJAM_CONFIG="$BJAM_CONFIG -sICU_PATH=$ICU_ROOT" echo "$ICU_ROOT" fi else echo "disabled." fi # Backup the user's existing project-config.jam JAM_CONFIG_OUT="project-config.jam" if test -r "project-config.jam"; then counter=1 while test -r "project-config.jam.$counter"; do counter=`expr $counter + 1` done echo "Backing up existing B2 configuration in project-config.jam.$counter" mv "project-config.jam" "project-config.jam.$counter" fi # Generate user-config.jam echo "Generating B2 configuration in project-config.jam for $TOOLSET..." cat > project-config.jam < ] { using $TOOLSET ; } project : default-build $TOOLSET ; EOF # - Python configuration if test "x$flag_no_python" = x; then cat >> project-config.jam <> project-config.jam << EOF path-constant ICU_PATH : $ICU_ROOT ; EOF fi cat >> project-config.jam << EOF # List of --with- and --without- # options. If left empty, all libraries will be built. # Options specified on the command line completely # override this variable. libraries = $LIBS ; # These settings are equivalent to corresponding command-line # options. option.set prefix : $PREFIX ; option.set exec-prefix : $EPREFIX ; option.set libdir : $LIBDIR ; option.set includedir : $INCLUDEDIR ; # Stop on first error option.set keep-going : false ; EOF cat << EOF Bootstrapping is done. To build, run: ./b2 To generate header files, run: ./b2 headers The configuration generated uses ${TOOLSET} to build by default. If that is unintended either use the --with-toolset option or adjust configuration, by editing 'project-config.jam'. Further information: - Command line help: ./b2 --help - Getting started guide: http://www.boost.org/more/getting_started/unix-variants.html - B2 documentation: http://www.boost.org/build/ EOF ================================================ FILE: doc/Jamfile.v2 ================================================ # Copyright (c) 2002 Douglas Gregor # Copyright (c) 2016-2018 Rene Rivera # # 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) project boost/doc : requirements boost.libraries=../../libs/libraries.htm html:chunker.output.doctype-public="-//W3C//DTD HTML 4.01 Transitional//EN" html:chunker.output.doctype-system="http://www.w3.org/TR/html4/loose.dtd" ; import boostbook : boostbook ; import project ; import targets ; import print ; import type ; import generators ; import sequence ; import path ; import "class" : is-a ; import regex ; path-constant BOOST_DOC : . ; local lib-docs = [ path.glob [ path.glob $(BOOST_DOC)/../libs $(BOOST_DOC)/../tools : */doc ] : [ modules.peek project : JAMFILE ] ] ; local rule find-target-of-class-or-type ( root-target : klass ? : type ? ) { local result ; if ! $(result) && $(klass) && [ is-a $(root-target) : $(klass) ] { result ?= $(root-target) $(klass) ; } if ! $(result) && $(type) && $(type:U) = [ modules.peek $(root-target) : self.type ] { result ?= $(root-target) $(type:U) ; } local alternatives = [ modules.peek $(root-target) : self.alternatives ] ; if ! $(result) { for local alternative in $(alternatives) { if $(result) { break ; } result ?= [ find-target-of-class-or-type $(alternative) : $(klass) : $(type) ] ; } } if ! $(result) { for local alternative in $(alternatives) { if $(result) { break ; } local sources = [ modules.peek $(alternative) : self.sources ] ; for local source in [ $(alternative).sources ] { if $(result) { break ; } result ?= [ find-target-of-class-or-type $(source) : $(klass) : $(type) ] ; } } } return $(result) ; } local rule docbook-target-spec ( main-target ) { local spec ; local doc-sub-target = [ find-target-of-class-or-type $(main-target) : boostbook-target-class : XML ] ; if $(doc-sub-target) { #ECHO *** $(main-target) ; #ECHO " ::" [ $(main-target).full-name ] ; #ECHO " ::" $(doc-sub-target) :: [ $(doc-sub-target[0]).full-name ] ; local full-name = [ $(doc-sub-target[0]).full-name ] ; local target-path = $(full-name:D) ; local target-name = $(full-name:B) ; local this-path = [ path.root [ project.attribute $(__name__) location ] [ path.pwd ] ] ; target-path = [ path.relative-to $(this-path) $(target-path) ] ; #ECHO " ::" $(target-path) :: $(target-name) ; spec = $(target-path)//$(target-name) ; } return $(spec) ; } local exclude-libs = [ MATCH "^--exclude-libraries=(.*)" : [ modules.peek : ARGV ] ] ; exclude-libs = [ regex.split-list $(exclude-libs) : "," ] ; #ECHO "=== --exclude-libraries:" $(exclude-libs) ; local lib-doc-boostdoc-refs ; local lib-doc-boostrelease-refs ; local this-path = [ path.root [ project.attribute $(__name__) location ] [ path.pwd ] ] ; for local lib-doc in $(lib-docs) { #ECHO === $(lib-doc) ... ; local doc-project = $(lib-doc:D) ; local lib-dir = $(doc-project:D) ; local lib-name = $(lib-dir:BS) ; #ECHO "=== lib-name:" $(lib-name) ... ; if $(lib-name) in $(exclude-libs) { ECHO "-- Excluded library" '$(lib-name)' ; } else { local doc-module = [ project.find $(doc-project) : [ project.attribute $(__name__) location ] ] ; local doc-target = [ project.target $(doc-module) ] ; $(doc-target).build-main-targets ; local boostrelease-target = [ $(doc-target).main-target boostrelease ] ; if $(boostrelease-target) { local full-name = [ $(boostrelease-target).full-name ] ; local target-path = [ path.relative-to $(this-path) $(full-name:D) ] ; lib-doc-boostrelease-refs += $(target-path)//boostrelease ; #ECHO " ::" $(target-path)//boostrelease ; } local boostdoc-target = [ $(doc-target).main-target boostdoc ] ; if $(boostdoc-target) { local full-name = [ $(boostdoc-target).full-name ] ; local target-path = [ path.relative-to $(this-path) $(full-name:D) ] ; lib-doc-boostdoc-refs += $(target-path)//boostdoc ; #ECHO " ::" $(target-path)//boostdoc ; } } } # Build non-integrated library docs for release. if "--release-build" in [ modules.peek : ARGV ] { alias release-build : $(lib-doc-boostrelease-refs) ; } local rule component-order ( x y ) { local a = [ MATCH "(/libs/[^/]+)" "(/tools/[^/]+)" : $(x:G) $(x:G=) ] ; local b = [ MATCH "(/libs/[^/]+)" "(/tools/[^/]+)" : $(y:G) $(y:G=) ] ; if $(a[1]) < $(b[1]) { return true ; } else if $(a[1]) = $(b[1]) && $(x) < $(y) { return true ; } } rule xinclude-generator ( target : sources * : properties * ) { print.output $(target) ; local includes ; sources = [ sequence.insertion-sort $(sources) : component-order ] ; locate = [ path.root [ on $(target) return $(LOCATE) ] [ path.pwd ] ] ; for local xml in $(sources) { local dir ; dir ?= [ on $(xml) return $(LOCATE) ] ; dir ?= [ on $(xml) return $(SEARCH) ] ; dir ?= "" ; dir = [ path.root $(dir[1]) [ path.pwd ] ] ; dir = [ path.relative-to $(locate) $(dir) ] ; includes += "" ; } print.text "" "" $(includes) "" : overwrite ; } type.register XINCLUDE_XML : xinclude : XML ; generators.register-composing $(__name__).xinclude-generator : XML : XINCLUDE_XML ; rule xinclude ( name : sources * : requirements * : default-build * : usage-requirements * ) { targets.create-typed-target XINCLUDE_XML : [ project.current ] : $(name) : $(sources) : $(requirements) : $(default-build) : $(usage-requirements) ; } xinclude libraries : $(lib-doc-boostdoc-refs) ; explicit libraries ; xinclude tools : ../tools/quickbook/doc//quickbook ../tools/boostbook/doc//boostbook ; explicit tools ; boostbook doc : src/boost.xml : generate.consistent.ids=1 $(lib-doc-boostdoc-refs) libraries libraries tools tools images callouts $(BOOST_DOC) ; install images : [ glob src/images/*.png ] : html/images ; explicit images ; install callouts : [ glob src/images/callouts/*.png ] : html/images/callouts ; explicit callouts ; ================================================ FILE: doc/html/Assignable.html ================================================ Redirect to generated documentation Automatic redirection failed, please go to http://www.boost.org/doc/libs/master/doc/html/Assignable.html ================================================ FILE: doc/html/CopyConstructible.html ================================================ Redirect to generated documentation Automatic redirection failed, please go to http://www.boost.org/doc/libs/master/doc/html/CopyConstructible.html ================================================ FILE: doc/html/accumulators.html ================================================ Redirect to generated documentation Automatic redirection failed, please go to http://www.boost.org/doc/libs/master/doc/html/accumulators.html ================================================ FILE: doc/html/any.html ================================================ Redirect to generated documentation Automatic redirection failed, please go to http://www.boost.org/doc/libs/master/doc/html/any.html ================================================ FILE: doc/html/array.html ================================================ Redirect to generated documentation Automatic redirection failed, please go to http://www.boost.org/doc/libs/master/doc/html/array.html ================================================ FILE: doc/html/atomic.html ================================================ Redirect to generated documentation Automatic redirection failed, please go to http://www.boost.org/doc/libs/master/doc/html/atomic.html ================================================ FILE: doc/html/bbv2/installation.html ================================================ Redirect to new location Automatic redirection failed, please go to ../bbv2.html#bbv2.installation ================================================ FILE: doc/html/bbv2.html ================================================ Redirect to generated documentation Automatic redirection failed, please go to ../../tools/build/doc/html/index.html ================================================ FILE: doc/html/boost_asio.html ================================================ Redirect to generated documentation Automatic redirection failed, please go to http://www.boost.org/doc/libs/master/doc/html/boost_asio.html ================================================ FILE: doc/html/boost_lexical_cast.html ================================================ Redirect to generated documentation Automatic redirection failed, please go to http://www.boost.org/doc/libs/master/doc/html/boost_lexical_cast.html ================================================ FILE: doc/html/boost_random.html ================================================ Redirect to generated documentation Automatic redirection failed, please go to http://www.boost.org/doc/libs/master/doc/html/boost_random.html ================================================ FILE: doc/html/boost_staticassert.html ================================================ Redirect to generated documentation Automatic redirection failed, please go to http://www.boost.org/doc/libs/master/doc/html/boost_staticassert.html ================================================ FILE: doc/html/boost_typeerasure.html ================================================ Redirect to generated documentation Automatic redirection failed, please go to http://www.boost.org/doc/libs/master/doc/html/boost_typeerasure.html ================================================ FILE: doc/html/boostbook.html ================================================ Redirect to generated documentation Automatic redirection failed, please go to ../../tools/boostbook/index.html ================================================ FILE: doc/html/chrono.html ================================================ Redirect to generated documentation Automatic redirection failed, please go to http://www.boost.org/doc/libs/master/doc/html/chrono.html ================================================ FILE: doc/html/circular_buffer.html ================================================ Redirect to generated documentation Automatic redirection failed, please go to http://www.boost.org/doc/libs/master/doc/html/circular_buffer.html ================================================ FILE: doc/html/container.html ================================================ Redirect to generated documentation Automatic redirection failed, please go to http://www.boost.org/doc/libs/master/doc/html/container.html ================================================ FILE: doc/html/date_time/date_time_io.html ================================================ Redirect to generated documentation Automatic redirection failed, please go to http://www.boost.org/doc/libs/master/doc/html/date_time/date_time_io.html ================================================ FILE: doc/html/date_time/details.html ================================================ Redirect to generated documentation Automatic redirection failed, please go to http://www.boost.org/doc/libs/master/doc/html/date_time/details.html ================================================ FILE: doc/html/date_time/local_time.html ================================================ Redirect to generated documentation Automatic redirection failed, please go to http://www.boost.org/doc/libs/master/doc/html/date_time/local_time.html ================================================ FILE: doc/html/date_time.html ================================================ Redirect to generated documentation Automatic redirection failed, please go to http://www.boost.org/doc/libs/master/doc/html/date_time.html ================================================ FILE: doc/html/foreach.html ================================================ Redirect to generated documentation Automatic redirection failed, please go to http://www.boost.org/doc/libs/master/doc/html/foreach.html ================================================ FILE: doc/html/function.html ================================================ Redirect to generated documentation Automatic redirection failed, please go to http://www.boost.org/doc/libs/master/doc/html/function.html ================================================ FILE: doc/html/hash/custom.html ================================================ Redirect to generated documentation Automatic redirection failed, please go to http://www.boost.org/doc/libs/master/doc/html/hash/custom.html ================================================ FILE: doc/html/hash.html ================================================ Redirect to generated documentation Automatic redirection failed, please go to http://www.boost.org/doc/libs/master/doc/html/hash.html ================================================ FILE: doc/html/heap.html ================================================ Redirect to generated documentation Automatic redirection failed, please go to http://www.boost.org/doc/libs/master/doc/html/heap.html ================================================ FILE: doc/html/interprocess.html ================================================ Redirect to generated documentation Automatic redirection failed, please go to http://www.boost.org/doc/libs/master/doc/html/interprocess.html ================================================ FILE: doc/html/intrusive.html ================================================ Redirect to generated documentation Automatic redirection failed, please go to http://www.boost.org/doc/libs/master/doc/html/intrusive.html ================================================ FILE: doc/html/lambda.html ================================================ Redirect to generated documentation Automatic redirection failed, please go to http://www.boost.org/doc/libs/master/doc/html/lambda.html ================================================ FILE: doc/html/lockfree.html ================================================ Redirect to generated documentation Automatic redirection failed, please go to http://www.boost.org/doc/libs/master/doc/html/lockfree.html ================================================ FILE: doc/html/move.html ================================================ Redirect to generated documentation Automatic redirection failed, please go to http://www.boost.org/doc/libs/master/doc/html/move.html ================================================ FILE: doc/html/mpi.html ================================================ Redirect to generated documentation Automatic redirection failed, please go to http://www.boost.org/doc/libs/master/doc/html/mpi.html ================================================ FILE: doc/html/program_options.html ================================================ Redirect to generated documentation Automatic redirection failed, please go to http://www.boost.org/doc/libs/master/doc/html/program_options.html ================================================ FILE: doc/html/property_tree.html ================================================ Redirect to generated documentation Automatic redirection failed, please go to http://www.boost.org/doc/libs/master/doc/html/property_tree.html ================================================ FILE: doc/html/proto.html ================================================ Redirect to generated documentation Automatic redirection failed, please go to http://www.boost.org/doc/libs/master/doc/html/proto.html ================================================ FILE: doc/html/quickbook.html ================================================ Redirect to generated documentation Automatic redirection failed, please go to http://www.boost.org/doc/libs/master/doc/html/quickbook.html ================================================ FILE: doc/html/ratio.html ================================================ Redirect to generated documentation Automatic redirection failed, please go to http://www.boost.org/doc/libs/master/doc/html/ratio.html ================================================ FILE: doc/html/ref.html ================================================ Redirect to generated documentation Automatic redirection failed, please go to ../../libs/core/doc/html/core/ref.html ================================================ FILE: doc/html/signals.html ================================================ Redirect to generated documentation Automatic redirection failed, please go to http://www.boost.org/doc/libs/master/doc/html/signals.html ================================================ FILE: doc/html/signals2.html ================================================ Redirect to generated documentation Automatic redirection failed, please go to http://www.boost.org/doc/libs/master/doc/html/signals2.html ================================================ FILE: doc/html/string_algo.html ================================================ Redirect to generated documentation Automatic redirection failed, please go to http://www.boost.org/doc/libs/master/doc/html/string_algo.html ================================================ FILE: doc/html/thread.html ================================================ Redirect to generated documentation Automatic redirection failed, please go to http://www.boost.org/doc/libs/master/doc/html/thread.html ================================================ FILE: doc/html/tribool.html ================================================ Redirect to generated documentation Automatic redirection failed, please go to http://www.boost.org/doc/libs/master/doc/html/tribool.html ================================================ FILE: doc/html/typeof.html ================================================ Redirect to generated documentation Automatic redirection failed, please go to http://www.boost.org/doc/libs/master/doc/html/typeof.html ================================================ FILE: doc/html/unordered.html ================================================ Redirect to generated documentation Automatic redirection failed, please go to http://www.boost.org/doc/libs/master/doc/html/unordered.html ================================================ FILE: doc/html/variant.html ================================================ Redirect to generated documentation Automatic redirection failed, please go to http://www.boost.org/doc/libs/master/doc/html/variant.html ================================================ FILE: doc/html/xpressive.html ================================================ Redirect to generated documentation Automatic redirection failed, please go to http://www.boost.org/doc/libs/master/doc/html/xpressive.html ================================================ FILE: doc/pdf/Jamfile.v2 ================================================ # Copyright (c) 2008 John Maddock # # 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 boostbook ; import os ; import common ; import doxygen ; import quickbook ; project : requirements ../../libs/geometry/doc ; boostbook array_docs : ../../libs/array/doc/array.xml : pdf:boost.url.prefix=http://www.boost.org/doc/libs/release/doc/html pdf ; boostbook any_docs : ../../libs/any/doc/any.xml : pdf:boost.url.prefix=http://www.boost.org/doc/libs/release/doc/html pdf ; install pdf-install : array_docs any_docs ../../libs/align/doc//standalone ../../libs/atomic/doc//standalone ../../libs/accumulators/doc//standalone ../../libs/algorithm/string/doc//string_algo ../../libs/algorithm/doc//standalone ../../libs/bimap/doc//standalone ../../libs/bind/doc//ref-doc ../../libs/chrono/doc//standalone ../../libs/concept_check/doc//concepts ../../libs/config/doc//standalone ../../libs/context/doc//context ../../libs/core/doc//standalone ../../libs/date_time/xmldoc//date_time ../../libs/dll/doc//dll-doc ../../libs/foreach/doc//standalone ../../libs/function/doc//function-doc # ../../libs/functional/overloaded_function/doc//doc ../../libs/fusion/doc//quickbook #../../libs/geometry/doc//geometry ../../libs/heap/doc//standalone ../../libs/icl/doc//standalone ../../libs/integer/doc//standalone ../../libs/iterator/doc//standalone ../../libs/lambda/doc//lambda-doc ../../libs/lockfree/doc//standalone ../../libs/lexical_cast/doc//standalone # ../../libs/local_function/doc//doc ../../libs/logic/doc//tribool ../../libs/move/doc//standalone ../../libs/mpi/doc//standalone ../../libs/numeric/conversion/doc//standalone # ../../libs/numeric/odeint/doc//standalone ../../libs/optional/doc//standalone ../../libs/phoenix/doc//phoenix-doc ../../libs/program_options/doc//program_option ../../libs/property_tree/doc//standalone ../../libs/proto/doc//standalone # Invalid Jamfile, doesn't use Boostbook anyway?? #../../libs/ptr_container/doc//standalone ../../libs/ratio/doc//standalone ../../libs/random/doc//standalone ../../libs/regex/doc//standalone ../../libs/spirit/repository/doc//spirit2_repository ../../libs/static_assert/doc//standalone ../../libs/thread/doc//standalone ../../libs/tr1/doc//standalone ../../libs/type_index/doc//standalone ../../libs/type_traits/doc//pdfinstall ../../libs/typeof/doc//standalone ../../libs/units/doc//standalone # ../../libs/utility/identity_type/doc//doc ../../libs/unordered/doc//standalone ../../libs/variant/doc//variant-doc ../../libs/xpressive/doc//standalone ../../libs/utility/doc//standalone_base_from_member ../../libs/utility/doc//standalone_compressed_pair ../../libs/utility/doc//standalone_declval ../../libs/utility/doc//standalone_string_ref ../../tools/boostbook/doc//boostbook ../../tools/build/doc//jam_docs ../../tools/quickbook/doc//standalone ../../tools/bcp/doc//standalone : . PDF pdf ; install python-tutorial-install : ../../libs/python/doc/tutorial/doc//tutorial : . PDF pdf python_tutorial.pdf ; install asio-install : ../../libs/asio/doc//asio : . PDF pdf asio.pdf ; install boost-build-install : ../../tools/build/doc//userman : . PDF pdf boost_build.pdf ; install signals2-install : ../../libs/signals2/doc//standalone : . PDF pdf signals2.pdf ../../libs/signals2/doc//hello_world_def_code_snippet.xml ; install range-install : ../../libs/range/doc//quickbook : . PDF pdf range.pdf ; # Just copy the MSM PDF over: install msm_install : ../../libs/msm/doc/pdf/msm.pdf : . ; install spirit-install : ../../libs/spirit/doc//spirit2 : . PDF pdf spirit2.pdf ; install scope_exit_install : ../../libs/scope_exit/doc//doc : . PDF pdf scope_exit.pdf ; install math_install : ../../libs/math/doc//standalone : . PDF pdf math.pdf ; install multiprecision_install : ../../libs/multiprecision/doc//standalone : . PDF pdf multiprecision.pdf ; install tti_install : ../../libs/tti/doc//standalone : . PDF pdf TypeTraitsIntrospection.pdf ; install circular_buffer_install : ../../libs/circular_buffer/doc//standalone : . PDF pdf circular_buffer.pdf ; install coroutine_install : ../../libs/coroutine/doc//coro : . PDF pdf coroutine.pdf ; install pool_install : ../../libs/pool/doc//standalone : . PDF pdf pool.pdf ; install multi_array_install : ../../libs/multi_array/doc/xml//multi_array-doc : . PDF pdf multi_array.pdf ; install factory_install : ../../libs/functional/factory/doc//standalone : . PDF pdf functional_factory.pdf ; install forward_install : ../../libs/functional/forward/doc//standalone : . PDF pdf functional_forward.pdf ; install hash_install : ../../libs/functional/hash/doc//standalone : . PDF pdf functional_hash.pdf ; install log_install : ../../libs/log/doc//log : . PDF pdf log.pdf ; ================================================ FILE: doc/pdf/build ================================================ #!/usr/bin/env bash boost_version=$(grep 'define.*BOOST_LIB_VERSION' ../../boost/version.hpp | sed 's/.*"\([^"]*\)".*/\1/') echo Boost version tag = $boost_version (cd ../../libs/accumulators/doc && bjam -a --hash) 2>&1 | tee build.log (cd ../../libs/container/doc && rm -rf *.pdf && bjam -a --hash pdfinstall xsl:param=fop1.extensions=1 && cp *.pdf ../../../doc/pdf) 2>&1 | tee -a build.log (cd ../../libs/interprocess/doc && rm -rf *.pdf && bjam -a --hash pdf pdfinstall xsl:param=fop1.extensions=1 && cp *.pdf ../../../doc/pdf) 2>&1 | tee -a build.log (cd ../../libs/intrusive/doc && rm -rf *.pdf && bjam -a --hash pdf pdfinstall xsl:param=fop1.extensions=1 && cp *.pdf ../../../doc/pdf) 2>&1 | tee -a build.log (cd ../../libs/functional/overloaded_function/doc && rm -rf *.pdf && bjam -a --hash pdf pdfinstall && cp *.pdf ../../../../doc/pdf) 2>&1 | tee -a build.log (cd ../../libs/local_function/doc && rm -rf *.pdf && bjam -a --hash pdf pdfinstall && cp *.pdf ../../../doc/pdf) 2>&1 | tee -a build.log (cd ../../libs/utility/identity_type/doc && rm -rf *.pdf && bjam -a --hash pdf pdf_doc_install && cp *.pdf ../../../../doc/pdf) 2>&1 | tee -a build.log (cd ../../libs/numeric/odeint/doc && rm -rf *.pdf && bjam -a --hash --enable-index pdf pdfinstall && cp *.pdf ../../../../doc/pdf) 2>&1 | tee -a build.log (cd ../../libs/geometry/doc/src/docutils/tools/doxygen_xml2qbk && bjam release) 2>&1 | tee -a build.log cp ../../dist/bin/doxygen_xml2qbk* /usr/bin chmod +wrx /usr/bin/doxygen_xml2qbk* (cd ../../libs/geometry/doc && rm -rf *.pdf && ./make_qbk.py && bjam pdfinstall -a --hash xsl:param=fop1.extensions=1 xsl:param=xep.extensions=0 && cp *.pdf ../../../doc/pdf) 2>&1 | tee -a build.log bjam -a --hash --enable-index pdf -d2 xsl:param=fop1.extensions=0 xsl:param=xep.extensions=1 2>&1 | tee -a build.log rm -rf boost_${boost_version}_pdf mkdir boost_${boost_version}_pdf mv *.pdf boost_${boost_version}_pdf ================================================ FILE: doc/src/boost.xml ================================================ The Boost C++ Libraries BoostBook Documentation Subset What's Included in This Document This document represents only a subset of the full Boost documentation: that part which is generated from BoostBook or QuickBook sources. Eventually all Boost libraries may use these formats, but in the meantime, much of Boost's documentation is not available here. Please see http://www.boost.org/libs for complete documentation. Documentation for some of the libraries described in this document is available in alternative formats: HTML PDF The Boost C++ Libraries (BoostBook Subset) Jeremy Siek Tools for generic programming Boost.Concept_Check Boost Tools Boost developers, testers, and maintainers have developed various programs to help with the administration of the Boost Libraries. Like everything else about Boost, these tools are available in source form, and are part of the regular Boost distribution. Users may find these tools useful when porting Boost libraries to a new platform, or for use with their own applications. ================================================ FILE: doc/src/boostbook.css ================================================ /*============================================================================= Copyright (c) 2004 Joel de Guzman http://spirit.sourceforge.net/ Copyright 2013 Niall Douglas additions for colors and alignment. Copyright 2013 Paul A. Bristow additions for more colors and alignments. Copyright 2017 Tom Westerhout font fixes to support Sphinx Distributed under the Boost Software License, Version 1.0. (See accompany- ing file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) =============================================================================*/ /*============================================================================= Body defaults =============================================================================*/ body { margin: 1em; font-size: 16px; font-family: sans-serif; } /*============================================================================= Paragraphs =============================================================================*/ p, div.document, div.footer { text-align: left; font-size: 10pt; line-height: 1.15; } /*============================================================================= Program listings =============================================================================*/ /* Code on paragraphs */ p tt.computeroutput { font-size: 9pt; } pre.synopsis { font-size: 9pt; margin: 1pc 4% 0pc 4%; padding: 0.5pc 0.5pc 0.5pc 0.5pc; } div.highlight, .programlisting, .screen { font-size: 9pt; display: block; margin: 1pc 4% 0pc 4%; padding: 0.5pc 0.5pc 0.5pc 0.5pc; } /* Program listings in tables don't get borders */ td .programlisting, td .screen { margin: 0pc 0pc 0pc 0pc; padding: 0pc 0pc 0pc 0pc; } /*============================================================================= Headings =============================================================================*/ h1, h2, h3, h4, h5, h6 { text-align: left; margin: 1em 0em 0.5em 0em; font-weight: bold; } h1 { font-size: 140%; } h2 { font-weight: bold; font-size: 140%; } h3 { font-weight: bold; font-size: 130%; } h4 { font-weight: bold; font-size: 120%; } h5 { font-weight: normal; font-style: italic; font-size: 110%; } h6 { font-weight: normal; font-style: italic; font-size: 100%; } /* Top page titles */ title, h1.title, h2.title h3.title, h4.title, h5.title, h6.title, .refentrytitle { font-weight: bold; margin-bottom: 1pc; } h1.title { font-size: 140% } h2.title { font-size: 140% } h3.title { font-size: 130% } h4.title { font-size: 120% } h5.title { font-size: 110% } h6.title { font-size: 100% } .section h1 { margin: 0em 0em 0.5em 0em; font-size: 140%; } .section h2 { font-size: 140% } .section h3 { font-size: 130% } .section h4 { font-size: 120% } .section h5 { font-size: 110% } .section h6 { font-size: 100% } /* Code on titles */ h1 tt.computeroutput { font-size: 140% } h2 tt.computeroutput { font-size: 140% } h3 tt.computeroutput { font-size: 130% } h4 tt.computeroutput { font-size: 130% } h5 tt.computeroutput { font-size: 130% } h6 tt.computeroutput { font-size: 130% } /*============================================================================= Author =============================================================================*/ h3.author { font-size: 100% } /*============================================================================= Lists =============================================================================*/ li { font-size: 10pt; line-height: 1.3; } /* Unordered lists */ ul { text-align: left; } /* Ordered lists */ ol { text-align: left; } /*============================================================================= Links =============================================================================*/ a { text-decoration: none; /* no underline */ } a:hover { text-decoration: underline; } /*============================================================================= Spirit style navigation =============================================================================*/ .spirit-nav { text-align: right; } .spirit-nav a { color: white; padding-left: 0.5em; } .spirit-nav img { border-width: 0px; } /*============================================================================= Copyright footer =============================================================================*/ .copyright-footer { text-align: right; font-size: 70%; } .copyright-footer p { text-align: right; font-size: 80%; } /*============================================================================= Table of contents =============================================================================*/ div.toc { margin: 1pc 4% 0pc 4%; padding: 0.1pc 1pc 0.1pc 1pc; font-size: 80%; line-height: 1.15; } .boost-toc { float: right; padding: 0.5pc; } /* Code on toc */ .toc .computeroutput { font-size: 120% } /* No margin on nested menus */ .toc dl dl { margin: 0; } /*============================================================================= Tables =============================================================================*/ .table-title, div.table p.title { margin-left: 4%; padding-right: 0.5em; padding-left: 0.5em; } .informaltable table, .table table { width: 92%; margin-left: 4%; margin-right: 4%; } div.informaltable table, div.table table { padding: 4px; } /* Table Cells */ div.informaltable table tr td, div.table table tr td { padding: 0.5em; text-align: left; font-size: 9pt; } div.informaltable table tr th, div.table table tr th { padding: 0.5em 0.5em 0.5em 0.5em; border: 1pt solid white; font-size: 80%; } table.simplelist { width: auto !important; margin: 0em !important; padding: 0em !important; border: none !important; } table.simplelist td { margin: 0em !important; padding: 0em !important; text-align: left !important; font-size: 9pt !important; border: none !important; } /*============================================================================= Suppress margins in tables =============================================================================*/ table th > *:first-child, table td > *:first-child { margin-top: 0; } table th > *:last-child, table td > *:last-child { margin-bottom: 0; } /*============================================================================= Blurbs =============================================================================*/ div.note, div.tip, div.important, div.caution, div.warning, div.blurb, p.blurb { font-size: 9pt; /* A little bit smaller than the main text */ line-height: 1.2; display: block; margin: 1pc 4% 0pc 4%; padding: 0.5pc 0.5pc 0.5pc 0.5pc; } div.blurb img, p.blurb img { padding: 1pt; } /*============================================================================= Variable Lists =============================================================================*/ div.variablelist { margin: 1em 0; } /* Make the terms in definition lists bold */ div.variablelist dl dt, span.term { font-weight: bold; font-size: 10pt; } div.variablelist table tbody tr td { text-align: left; vertical-align: top; padding: 0em 2em 0em 0em; font-size: 10pt; margin: 0em 0em 0.5em 0em; line-height: 1; } div.variablelist dl dt { margin-bottom: 0.2em; } div.variablelist dl dd { margin: 0em 0em 0.5em 2em; font-size: 10pt; } div.variablelist table tbody tr td p, div.variablelist dl dd p { margin: 0em 0em 0.5em 0em; line-height: 1; } /*============================================================================= Misc =============================================================================*/ /* Title of books and articles in bibliographies */ span.title { font-style: italic; } span.underline { text-decoration: underline; } span.strikethrough { text-decoration: line-through; } /* Copyright, Legal Notice */ div div.legalnotice p { text-align: left } /*============================================================================= Colors =============================================================================*/ @media screen { body { background-color: #FFFFFF; color: #000000; } /* Syntax Highlighting */ .property, .highlight .k, .highlight .kc, .highlight .kd, .highlight .kn, .highlight .kp, .highlight .kr, .highlight .kt, .keyword { color: #0000AA; } .highlight .n, .highlight .na, .highlight .nb, .highlight .bp, .highlight .nc, .highlight .no, .highlight .nd, .highlight .ni, .highlight .ne, .highlight .nf, .highlight .py, .highlight .nl, .highlight .nn, .highlight .nx, .highlight .nt, .highlight .nv, .highlight .vc, .highlight .vg, .highlight .vi, .identifier { color: #000000; } .special { color: #707070; } .highlight .cp, .preprocessor { color: #402080; } .highlight .sc .char { color: teal; } .highlight .c, .highlight .ch, .highlight .cm, .highlight .cp, .highlight .cpf, .highlight .c1, .highlight .cs, .highlight .sd, .highlight .sh, .comment { color: #800000; } .highlight .s, .highlight .sa, .highlight .sb, .highlight .dl, .highlight .s2, .highlight .se, .highlight .si, .highlight .sx, .highlight .sr, .highlight .s1, .highlight .ss, .string { color: teal; } .highlight .m, .highlight .mf, .highlight .mh, .highlight .mi, .highlight .mo, .number { color: teal; } .highlight, .white_bkd { background-color: #FFFFFF; } .highlight .hll, .dk_grey_bkd { background-color: #999999; } /* Links */ a, a .keyword, a .identifier, a .special, a .preprocessor a .char, a .comment, a .string, a .number { color: #005a9c; } a:visited, a:visited .keyword, a:visited .identifier, a:visited .special, a:visited .preprocessor a:visited .char, a:visited .comment, a:visited .string, a:visited .number { color: #9c5a9c; } h1 a, h2 a, h3 a, h4 a, h5 a, h6 a, h1 a:hover, h2 a:hover, h3 a:hover, h4 a:hover, h5 a:hover, h6 a:hover, h1 a:visited, h2 a:visited, h3 a:visited, h4 a:visited, h5 a:visited, h6 a:visited { text-decoration: none; /* no underline */ color: #000000; } /* Copyright, Legal Notice */ .copyright { color: #666666; font-size: small; } div div.legalnotice p { color: #666666; } /* Program listing */ pre.synopsis { border: 1px solid #DCDCDC; } div.highlight, .programlisting, .screen { border: 1px solid #DCDCDC; } td .programlisting, td .screen { border: 0px solid #DCDCDC; } /* Blurbs */ div.note, div.tip, div.important, div.caution, div.warning, div.blurb, p.blurb { border: 1px solid #DCDCDC; } /* Table of contents */ div.toc { border: 1px solid #DCDCDC; } /* Tables */ div.informaltable table tr td, div.table table tr td { border: 1px solid #DCDCDC; } div.informaltable table tr th, div.table table tr th { background-color: #F0F0F0; border: 1px solid #DCDCDC; } .copyright-footer { color: #8F8F8F; } /* Misc */ span.highlight { color: #00A000; } } @media print { /* Links */ a { color: black; } a:visited { color: black; } .spirit-nav { display: none; } /* Program listing */ pre.synopsis { border: 1px solid gray; } div.highlight, .programlisting, .screen { border: 1px solid gray; } td .programlisting, td .screen { border: 0px solid #DCDCDC; } /* Table of contents */ div.toc { border: 1px solid gray; } .informaltable table, .table table { border: 1px solid gray; border-collapse: collapse; } /* Tables */ div.informaltable table tr td, div.table table tr td { border: 1px solid gray; } div.informaltable table tr th, div.table table tr th { border: 1px solid gray; } table.simplelist tr td { border: none !important; } /* Misc */ span.highlight { font-weight: bold; } } /*============================================================================= Images =============================================================================*/ span.inlinemediaobject img { vertical-align: middle; } /*============================================================================== Super and Subscript: style so that line spacing isn't effected, see http://www.adobe.com/cfusion/communityengine/index.cfm?event=showdetails&productId=1&postId=5341 ==============================================================================*/ sup, sub { height: 0; line-height: 1; vertical-align: baseline; position: relative; } /* For internet explorer: */ * html sup, * html sub { vertical-align: bottom; } sup { bottom: 1ex; } sub { top: .5ex; } /*============================================================================== Indexes: pretty much the same as the TOC. ==============================================================================*/ .index { font-size: 80%; padding-top: 0px; padding-bottom: 0px; margin-top: 0px; margin-bottom: 0px; margin-left: 0px; } .index ul { padding-left: 3em; } .index p { padding: 2px; margin: 2px; } .index-entry-level-0 { font-weight: bold; } .index em { font-weight: bold; } /*============================================================================== Alignment and coloring use 'role' feature, available from Quickbook 1.6 up. Added from Niall Douglas for role color and alignment. http://article.gmane.org/gmane.comp.lib.boost.devel/243318 */ /* Add text alignment (see http://www.w3schools.com/cssref/pr_text_text-align.asp) */ span.aligncenter { display: inline-block; width: 100%; text-align: center; } span.alignright { display: inline-block; width: 100%; text-align: right; } /* alignleft is the default. */ span.alignleft { display: inline-block; width: 100%; text-align: left; } /* alignjustify stretches the word spacing so that each line has equal width within a chosen fraction of page width (here arbitrarily 20%). *Not* useful inside table items as the column width remains the total string width. Nor very useful, except to temporarily restrict the width. */ span.alignjustify { display: inline-block; width: 20%; text-align: justify; } /* Text colors. Names at http://www.w3.org/TR/2002/WD-css3-color-20020219/ 4.3. X11 color keywords. Quickbook Usage: [role red Some red text] */ span.red { inline-block; color: red; } span.green { color: green; } span.lime { color: #00FF00; } span.blue { color: blue; } span.navy { color: navy; } span.yellow { color: yellow; } span.magenta { color: magenta; } span.indigo { color: #4B0082; } span.cyan { color: cyan; } span.purple { color: purple; } span.gold { color: gold; } span.silver { color: silver; } /* lighter gray */ span.gray { color: #808080; } /* light gray */ ================================================ FILE: doc/src/docutils.css ================================================ /* :Author: David Goodger :Contact: goodger@python.org :Date: $Date$ :Revision: $Revision$ :Copyright: This stylesheet has been placed in the public domain. Default cascading style sheet for the HTML output of Docutils. See http://docutils.sf.net/docs/howto/html-stylesheets.html for how to customize this style sheet. */ /* used to remove borders from tables and images */ .borderless, table.borderless td, table.borderless th { border: 0 } table.borderless td, table.borderless th { /* Override padding for "table.docutils td" with "! important". The right padding separates the table cells. */ padding: 0 0.5em 0 0 ! important } .first { /* Override more specific margin styles with "! important". */ margin-top: 0 ! important } .last, .with-subtitle { margin-bottom: 0 ! important } .hidden { display: none } a.toc-backref { text-decoration: none ; color: black } blockquote.epigraph { margin: 2em 5em ; } dl.docutils dd { margin-bottom: 0.5em } /* Uncomment (and remove this text!) to get bold-faced definition list terms dl.docutils dt { font-weight: bold } */ div.abstract { margin: 2em 5em } div.abstract p.topic-title { font-weight: bold ; text-align: center } div.admonition, div.attention, div.caution, div.danger, div.error, div.hint, div.important, div.note, div.tip, div.warning { margin: 2em ; border: medium outset ; padding: 1em } div.admonition p.admonition-title, div.hint p.admonition-title, div.important p.admonition-title, div.note p.admonition-title, div.tip p.admonition-title { font-weight: bold ; font-family: sans-serif } div.attention p.admonition-title, div.caution p.admonition-title, div.danger p.admonition-title, div.error p.admonition-title, div.warning p.admonition-title { color: red ; font-weight: bold ; font-family: sans-serif } /* Uncomment (and remove this text!) to get reduced vertical space in compound paragraphs. div.compound .compound-first, div.compound .compound-middle { margin-bottom: 0.5em } div.compound .compound-last, div.compound .compound-middle { margin-top: 0.5em } */ div.dedication { margin: 2em 5em ; text-align: center ; font-style: italic } div.dedication p.topic-title { font-weight: bold ; font-style: normal } div.figure { margin-left: 2em ; margin-right: 2em } div.footer, div.header { clear: both; font-size: smaller } div.line-block { display: block ; margin-top: 1em ; margin-bottom: 1em } div.line-block div.line-block { margin-top: 0 ; margin-bottom: 0 ; margin-left: 1.5em } div.sidebar { margin-left: 1em ; border: medium outset ; padding: 1em ; background-color: #ffffee ; width: 40% ; float: right ; clear: right } div.sidebar p.rubric { font-family: sans-serif ; font-size: medium } div.system-messages { margin: 5em } div.system-messages h1 { color: red } div.system-message { border: medium outset ; padding: 1em } div.system-message p.system-message-title { color: red ; font-weight: bold } div.topic { margin: 2em } h1.section-subtitle, h2.section-subtitle, h3.section-subtitle, h4.section-subtitle, h5.section-subtitle, h6.section-subtitle { margin-top: 0.4em } h1.title { text-align: center } h2.subtitle { text-align: center } hr.docutils { width: 75% } img.align-left { clear: left } img.align-right { clear: right } ol.simple, ul.simple { margin-bottom: 1em } ol.arabic { list-style: decimal } ol.loweralpha { list-style: lower-alpha } ol.upperalpha { list-style: upper-alpha } ol.lowerroman { list-style: lower-roman } ol.upperroman { list-style: upper-roman } p.attribution { text-align: right ; margin-left: 50% } p.caption { font-style: italic } p.credits { font-style: italic ; font-size: smaller } p.label { white-space: nowrap } p.rubric { font-weight: bold ; font-size: larger ; color: maroon ; text-align: center } p.sidebar-title { font-family: sans-serif ; font-weight: bold ; font-size: larger } p.sidebar-subtitle { font-family: sans-serif ; font-weight: bold } p.topic-title { font-weight: bold } pre.address { margin-bottom: 0 ; margin-top: 0 ; font-family: serif ; font-size: 100% } pre.literal-block, pre.doctest-block { margin-left: 2em ; margin-right: 2em } span.classifier { font-family: sans-serif ; font-style: oblique } span.classifier-delimiter { font-family: sans-serif ; font-weight: bold } span.interpreted { font-family: sans-serif } span.option { white-space: nowrap } span.pre { white-space: pre } span.problematic { color: red } span.section-subtitle { /* font-size relative to parent (h1..h6 element) */ font-size: 80% } table.citation { border-left: solid 1px gray; margin-left: 1px } table.docinfo { margin: 2em 4em } table.docutils { margin-top: 0.5em ; margin-bottom: 0.5em } table.footnote { border-left: solid 1px black; margin-left: 1px } table.docutils td, table.docutils th, table.docinfo td, table.docinfo th { padding-left: 0.5em ; padding-right: 0.5em ; vertical-align: top } table.docutils th.field-name, table.docinfo th.docinfo-name { font-weight: bold ; text-align: left ; white-space: nowrap ; padding-left: 0 } h1 tt.docutils, h2 tt.docutils, h3 tt.docutils, h4 tt.docutils, h5 tt.docutils, h6 tt.docutils { font-size: 100% } ul.auto-toc { list-style-type: none } ================================================ FILE: doc/src/minimal.css ================================================ /* Copyright (c) 2007 Beman Dawes Distributed under the Boost Software License, Version 1.0. See www.boost.org/LICENSE_1_0.txt */ body { font-family: sans-serif; margin: 1em; max-width : 8.5in; } table { margin: 0.5em; } pre { background-color:#D7EEFF } ins { background-color:#A0FFA0 } del { background-color:#FFA0A0 } /*** end ***/ ================================================ FILE: doc/src/reference.css ================================================ /*============================================================================ Copyright 2003-2004 Douglas Gregor Distributed under the Boost Software License, Version 1.0. (See accompany- ing file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) ============================================================================*/ PRE.synopsis { background-color: #e0ffff; border: thin solid blue; padding: 1em } ================================================ FILE: doc/test/HTML4_symbols.qbk ================================================ [/ File Latin1_symbols.qbk Copyright 2006-2007 Paul A. Bristow. 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). ] [/ Symbols and Greek letters (about 120) from HTML4 ] [/ File HTML4_symbols.qbk] [/ See http://www.htmlhelp.com/reference/html40/entities/symbols.html] [/ All (except 2 angle brackets) show OK on Firefox 2.0] [/ Also some miscellaneous math characters added to this list - see the end.] [/ To use, enclose the template name in square brackets.] [template fnof[]'''ƒ'''] [/ � Latin small f with hook = function = florin] [template Alpha[]'''Α'''] [/ ? Greek capital letter alpha] [template Beta[]'''Β'''] [/ ? Greek capital letter beta] [template Gamma[]'''Γ'''] [/ G Greek capital letter gamma] [template Delta[]'''Δ'''] [/ ? Greek capital letter delta] [template Epsilon[]'''Ε'''] [/ ? Greek capital letter epsilon] [template Zeta[]'''Ζ'''] [/ ? Greek capital letter zeta] [template Eta[]'''Η'''] [/ ? Greek capital letter eta] [template Theta[]'''Θ'''] [/ T Greek capital letter theta] [template Iota[]'''Ι'''] [/ ? Greek capital letter iota] [template Kappa[]'''Κ'''] [/ ? Greek capital letter kappa] [template Lambda[]'''Λ'''] [/ ? Greek capital letter lambda] [template Mu[]'''Μ'''] [/ ? Greek capital letter mu] [template Nu[]'''Ν'''] [/ ? Greek capital letter nu] [template Xi[]'''Ξ'''] [/ ? Greek capital letter xi] [template Omicron[]'''Ο'''] [/ ? Greek capital letter omicron] [template Pi[]'''Π'''] [/ ? Greek capital letter pi] [template Rho[]'''Ρ'''] [/ ? Greek capital letter rho] [template Sigma[]'''Σ'''] [/ S Greek capital letter sigma] [template Tau[]'''Τ'''] [/ ? Greek capital letter tau] [template Upsilon[]'''Υ'''] [/ ? Greek capital letter upsilon] [template Phi[]'''Φ'''] [/ F Greek capital letter phi] [template Chi[]'''Χ'''] [/ ? Greek capital letter chi] [template Psi[]'''Ψ'''] [/ ? Greek capital letter psi] [template Omega[]'''Ω'''] [/ O Greek capital letter omega] [template alpha[]'''α'''] [/ a Greek small letter alpha] [template beta[]'''β'''] [/ � Greek small letter beta] [template gamma[]'''γ'''] [/ ? Greek small letter gamma] [template delta[]'''δ'''] [/ d Greek small letter delta] [template epsilon[]'''ε'''] [/ e Greek small letter epsilon] [template zeta[]'''ζ'''] [/ ? Greek small letter zeta] [template eta[]'''η'''] [/ ? Greek small letter eta] [template theta[]'''θ'''] [/ ? Greek small letter theta] [template iota[]'''ι'''] [/ ? Greek small letter iota] [template kappa[]'''κ'''] [/ ? Greek small letter kappa] [template lambda[]'''λ'''] [/ ? Greek small letter lambda] [template mu[]'''μ'''] [/ � Greek small letter mu] [template nu[]'''ν'''] [/ ? Greek small letter nu] [template xi[]'''ξ'''] [/ ? Greek small letter xi] [template omicron[]'''ο'''] [/ ? Greek small letter omicron] [template pi[]'''π'''] [/ p Greek small letter pi] [template rho[]'''ρ'''] [/ ? Greek small letter rho] [template sigmaf[]'''ς'''] [/ ? Greek small letter final sigma] [template sigma[]'''σ'''] [/ s Greek small letter sigma] [template tau[]'''τ'''] [/ t Greek small letter tau] [template upsilon[]'''υ'''] [/ ? Greek small letter upsilon] [template phi[]'''φ'''] [/ f Greek small letter phi] [template chi[]'''χ'''] [/ ? Greek small letter chi] [template psi[]'''ψ'''] [/ ? Greek small letter psi] [template omega[]'''ω'''] [/ ? Greek small letter omega] [template thetasym[]'''ϑ'''] [/ ? Greek small letter theta symbol] [template upsih[]'''ϒ'''] [/ ? Greek upsilon with hook symbol] [template piv[]'''ϖ'''] [/ ? Greek pi symbol] [template bull[]'''•'''] [/ � bullet = black small circle] [template hellip[]'''…'''] [/ � horizontal ellipsis = three dot leader] [template prime[]'''′'''] [/ ' prime = minutes = feet] [template Prime[]'''″'''] [/ ? double prime = seconds = inches] [template oline[]'''‾'''] [/ ? overline = spacing overscore] [template frasl[]'''⁄'''] [/ / fraction slash] [template weierp[]'''℘'''] [/ P script capital P = power set = Weierstrass p] [template image[]'''ℑ'''] [/ I blackletter capital I = imaginary part] [template real[]'''ℜ'''] [/ R blackletter capital R = real part symbol] [template trade[]'''™'''] [/ � trade mark sign] [template alefsym[]'''ℵ'''] [/ ? alef symbol = first transfinite cardinal] [template larr[]'''←'''] [/ ? leftwards arrow] [template uarr[]'''↑'''] [/ ? upwards arrow] [template rarr[]'''→'''] [/ ? rightwards arrow] [template darr[]'''↓'''] [/ ? downwards arrow] [template harr[]'''↔'''] [/ ? left right arrow] [template crarr[]'''↵'''] [/ ? downwards arrow with corner leftwards = CR] [template lArr[]'''⇐'''] [/ ? leftwards double arrow] [template uArr[]'''⇑'''] [/ ? upwards double arrow] [template rArr[]'''⇒'''] [/ ? rightwards double arrow] [template dArr[]'''⇓'''] [/ ? downwards double arrow] [template hArr[]'''⇔'''] [/ ? left right double arrow] [template forall[]'''∀'''] [/ ? for all] [template part[]'''∂'''] [/ ? partial differential] [template exist[]'''∃'''] [/ ? there exists] [template empty[]'''∅'''] [/ � empty set = null set = diameter] [template nabla[]'''∇'''] [/ ? nabla = backward difference] [template isin[]'''∈'''] [/ ? element of] [template notin[]'''∉'''] [/ ? not an element of] [template ni[]'''∋'''] [/ ? contains as member] [template prod[]'''∏'''] [/ ? n-ary product = product sign] [template sum[]'''∑'''] [/ ? n-ary summation] [template minus[]'''−'''] [/ - minus sign] [template lowast[]'''∗'''] [/ * asterisk operator] [template radic[]'''√'''] [/ v square root = radical sign] [template prop[]'''∝'''] [/ ? proportional to] [template infin[]'''∞'''] [/ 8 infinity] [template ang[]'''∠'''] [/ ? angle] [template and[]'''∧'''] [/ ? logical and = wedge] [template or[]'''∨'''] [/ ? logical or = vee] [template cap[]'''∩'''] [/ n intersection = cap] [template cup[]'''∪'''] [/ ? union = cup] [template int[]'''∫'''] [/ ? integral] [template there4[]'''∴'''] [/ ? therefore] [template sim[]'''∼'''] [/ ~ tilde operator = varies with = similar to] [template cong[]'''≅'''] [/ ? approximately equal to] [template asymp[]'''≈'''] [/ � almost equal to = asymptotic to] [template ne[]'''≠'''] [/ ? not equal to] [template equiv[]'''≡'''] [/ = identical to] [template le[]'''≤'''] [/ = less-than or equal to] [template ge[]'''≥'''] [/ = greater-than or equal to] [template subset[]'''⊂'''] [/ ? subset of] [template superset[]'''⊃'''] [/ ? superset of] [template nsubset[]'''⊄'''] [/ ? not a subset of] [template sube[]'''⊆'''] [/ ? subset of or equal to] [template supe[]'''⊇'''] [/ ? superset of or equal to] [template oplus[]'''⊕'''] [/ ? circled plus = direct sum] [template otimes[]'''⊗'''] [/ ? circled times = vector product] [template perp[]'''⊥'''] [/ ? up tack = orthogonal to = perpendicular] [template sdot[]'''⋅'''] [/ � dot operator] [template lceil[]'''⌈'''] [/ ? left ceiling = APL upstile] [template rceil[]'''⌉'''] [/ ? right ceiling] [template lfloor[]'''⌊'''] [/ ? left floor = APL downstile] [template rfloor[]'''⌋'''] [/ ? right floor] [template lang[]'''〈'''] [/ < left-pointing angle bracket = bra (Firefox shows ?)] [template rang[]'''〉'''] [/ > right-pointing angle bracket = ket (Firefox shows ?)] [template loz[]'''◊'''] [/ ? lozenge] [template spades[]'''♠'''] [/ ? black spade suit] [template clubs[]'''♣'''] [/ ? black club suit = shamrock] [template hearts[]'''♥'''] [/ ? black heart suit = valentine] [template diams[]'''♦'''] [/ ? black diamond suit] [/ Other symbols, not in the HTML4 list:] [template space[]''' '''] [template plusminus[]'''±'''] [/ ? plus or minus sign] [/ Symbols and accented letters from Latin-1] [/ File Latin1_symbols.qbk] [/ http://www.htmlhelp.com/reference/html40/entities/latin1.html ] [/ based on table Copyright 1998-2006 Liam Quinn.] [/ Glyphs of the characters ] [/ are available at the Unicode Consortium . ] [template nbsp[]''' '''] [/ no-break space = non-breaking space] [template iexcl[]'''¡'''] [/ inverted exclamation mark ] [template cent[]'''¢'''] [/ cent sign ] [template pound[]'''£'''] [/ pound sign ] [template curren[]'''¤'''] [/ currency sign ] [template yen[]'''¥'''] [/ yen sign = yuan sign ] [template brvbar[]'''¦'''] [/ broken vertical bar ] [template sectsign[]'''§'''] [/ section sign ] [template uml[]'''¨'''] [/ diaeresis ] [template copy[]'''©'''] [/ copyright ] [template ordf[]'''ª'''] [/ feminine ordinal indicator ] [template laquo[]'''«'''] [/ left-pointing double angle quotation mark = left pointing guillemet ] [template not[]'''¬'''] [/ not sign ] [template shy[]'''­'''] [/ soft hyphen = discretionary hyphen ] [template reg[]'''®'''] [/ registered sign = registered trade mark sign ] [template macron[]'''¯'''] [/ macron = spacing macron = overline = APL overbar ] [template deg[]'''°'''] [/ degree sign ] [template plusmn[]'''±'''] [/ plus-minus sign = plus-or-minus sign ] [template sup2[]'''²'''] [/ superscript two = superscript digit two = squared ] [template cubed[]'''³'''] [/ superscript three = superscript digit three = cubed ] [template acute[]'''´'''] [/ acute accent = spacing acute ] [template micro[]'''µ'''] [/ micro sign ] [template para[]'''¶'''] [/ pilcrow sign = paragraph sign ] [template middot[]'''·'''] [/ middle dot = Georgian comma = Greek middle dot ] [template cedil[]'''¸'''] [/ cedilla = spacing cedilla ] [template sup1[]'''¹'''] [/ superscript one = superscript digit one ] [template ordm[]'''º'''] [/ masculine ordinal indicator ] [template raquo[]'''»'''] [/ right-pointing double angle quotation mark = right pointing guillemet ] [template frac14[]'''¼'''] [/ vulgar fraction one quarter = fraction one quarter ] [template frac12[]'''½'''] [/ vulgar fraction one half = fraction one half ] [template frac34[]'''¾'''] [/vulgar fraction three quarters = fraction three quarters ] [template iquest[]'''¿'''] [/ inverted question mark = turned question mark ] [template Agrave[]'''À'''] [/ Latin capital letter A with grave = Latin capital letter A grave ] [template Aacute[]'''Á'''] [/ Latin capital letter A with acute = Latin capital letter A acute ] [template Acirc[]'''Â'''] [/ Latin capital letter A with circumflex ] [template Atilde[]'''Ã'''] [/Latin capital letter A with tilde ] [template Auml[]'''Ä'''] [/ Latin capital letter A with diaeresis ] [template Aring[]'''Å'''] [/ Latin capital letter A with ring above = Latin capital letter A ring ] [template AElig[]'''Æ'''] [/ Latin capital letter AE = Latin capital ligature AE ] [template Ccedil[]'''Ç'''] [/ Latin capital letter C with cedilla ] [template Egrave[]'''È'''] [/ Latin capital letter E with grave ] [template Eacute[]'''É'''] [/ Latin capital letter E with acute ] [template Ecirc[]'''Ê'''] [/ Latin capital letter E with circumflex ] [template Euml[]'''Ë'''] [/ Latin capital letter E with diaeresis ] [template Igrave[]'''Ì'''] [/ Latin capital letter I with grave ] [template Iacute[]'''Í'''] [/ Latin capital letter I with acute ] [template Icirc[]'''Î'''] [/ Latin capital letter I with circumflex ] [template Iuml[]'''Ï'''] [/ Latin capital letter I with diaeresis ] [template ETH[]'''Ð'''] [/ Latin capital letter ETH ] [template Ntilde[]'''Ñ'''] [/ Latin capital letter N with tilde ] [template Ograve[]'''Ò'''] [/ Latin capital letter O with grave] [template Oacute[]'''Ó'''] [/ Latin capital letter O with acute ] [template Ocirc[]'''Ô'''] [/ Latin capital letter O with circumflex ] [template Otilde[]'''Õ'''] [/ Latin capital letter O with tilde ] [template Ouml[]'''Ö'''] [/ Latin capital letter O with diaeresis ] [template times[]'''×'''] [/ multiplication sign ] [template Oslash[]'''Ø'''] [/ Latin capital letter O with stroke = Latin capital letter O slash ] [template Ugrave[]'''Ù'''] [/ Latin capital letter U with grave ] [template Uacute[]'''Ú'''] [/ Latin capital letter U with acute ] [template Ucirc[]'''Û'''] [/ Latin capital letter U with circumflex ] [template Uuml[]'''Ü'''] [/ Latin capital letter U with diaeresis ] [template Yacute[]'''Ý'''] [/ Latin capital letter Y with acute ] [template THORN[]'''Þ'''] [/ Latin capital letter THORN ] [template szlig[]'''ß'''] [/ Latin small letter sharp s = ess-zed ] [template agrave[]'''à'''] [/ Latin small letter a with grave = Latin small letter a grave ] [template aacute[]'''á'''] [/ Latin small letter a with acute ] [template acirc[]'''â'''] [/ Latin small letter a with circumflex ] [template atilde[]'''ã'''] [/ Latin small letter a with tilde ] [template auml[]'''ä'''] [/ Latin small letter a with diaeresis ] [template aring[]'''å'''] [/ Latin small letter a with ring above = Latin small letter a ring ] [template aelig[]'''æ'''] [/ Latin small letter ae = Latin small ligature ae ] [template ccedil[]'''ç'''] [/ Latin small letter c with cedilla ] [template egrave[]'''è'''] [/ Latin small letter e with grave ] [template eacute[]'''é'''] [/ Latin small letter e with acute ] [template ecirc[]'''ê'''] [/ Latin small letter e with circumflex ] [template euml[]'''ë'''] [/ Latin small letter e with diaeresis ] [template igrave[]'''ì'''] [/ Latin small letter i with grave ] [template iacute[]'''í'''] [/ Latin small letter i with acute ] [template icirc[]'''î'''] [/ Latin small letter i with circumflex ] [template iuml[]'''ï'''] [/ Latin small letter i with diaeresis ] [template eth[]'''ð'''] [/ Latin small letter eth ] [template ntilde[]'''ñ'''] [/ Latin small letter n with tilde ] [template ograve[]'''ò'''] [/Latin small letter o with grave ] [template oacute[]'''ó'''] [/ Latin small letter o with acute ] [template ocirc[]'''ô'''] [/ Latin small letter o with circumflex ] [template otilde[]'''õ'''] [/ Latin small letter o with tilde ] [template ouml[]'''ö'''] [/ Latin small letter o with diaeresis ] [template divide[]'''÷'''] [/ division sign ] [template oslash[]'''ø'''] [/ Latin small letter o with stroke = Latin small letter o slash ] [template ugrave[]'''ù'''] [/ Latin small letter u with grave ] [template uacute[]'''ú'''] [/ Latin small letter u with acute ] [template ucirc[]'''û'''] [/ Latin small letter u with circumflex ] [template uuml[]'''ü'''] [/ Latin small letter u with diaeresis ] [template yacute[]'''ý'''] [/ Latin small letter y with acute ] [template thorn[]'''þ'''] [/ Latin small letter thorn ] [template yuml[]'''ÿ'''] [/ Latin small letter y with diaeresis ] ================================================ FILE: doc/test/Jamfile.v2 ================================================ # Copyright John Maddock 2008. Use, modification, and distribution are # subject to 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 os ; import common ; import doxygen ; using quickbook ; import modules ; path-constant images_location : html ; # # Accumulators docs are dependent upon # latex dvips and ps being in your PATH. # This is true for most Unix installs, but # not on Win32, where you will need to install # MkTex and Ghostscript and add these tools # to your path. # make latex.check : : @check-latex ; actions check-latex { latex -version > latex.version } make dvips.check : : @check-dvips ; actions check-dvips { dvips -version > dvips.version } make gs.check : : @check-gs ; import os ; if [ os.name ] = "NT" { actions check-gs { gswin32c -version > gs.version } } else { actions check-gs { gs -version > gs.version } } # Use Doxygen to emit a tagfile with the definition of depends_on<>. That # tagfile will be used by Doxygen below when generating the Statistics Library # Reference. This is all so that the Doxygen-generated documentation for the # features shows the dependency relationships between them. doxygen tagfile : ../../boost/accumulators/framework/depends_on.hpp ../../boost/accumulators/framework/extractor.hpp : MACRO_EXPANSION=YES EXPAND_ONLY_PREDEF=YES GENERATE_TAGFILE=accumulators.tag "PREDEFINED=\"BOOST_ACCUMULATORS_DOXYGEN_INVOKED=1\" \\ \"BOOST_PP_REPEAT_FROM_TO(a,b,c,d)=\" \\ \"BOOST_PP_ENUM_PARAMS(a,b)=b ## 1, b ## 2, ...\"" latex.check dvips.check gs.check ; # Generate the HTML form of the stats documentation, as this causes Doxygen to # generate .png images for the LaTeX formulas embedded in the doc comments. doxygen statsdoc.html : weighted_tail_quantile.hpp : latex.check dvips.check gs.check ; if [ os.name ] = NT { CP = copy /y ; MKDIR = mkdir ; FROM = \\..\\..\\..\\html\\statsdoc\\*.png ; TOHTML = .\\html\\images\\accumulators ; TOPDF = \\images\\accumulators ; } else { CP = cp ; MKDIR = mkdir -p ; FROM = /../../html/statsdoc/*.png ; TOHTML = ./html/images/accumulators ; TOPDF = /images/accumulators ; } actions copy-latex-pngs { $(MKDIR) $(TOHTML) $(MKDIR) $(<:D)$(TOPDF) $(CP) $(<:D)$(FROM) $(TOHTML) $(CP) $(<:D)$(FROM) $(<:D)$(TOPDF) echo "Stamped" > "$(<)" } # This causes the png files built above to be copied into the # html/images/accumulators directory. make statsdoclatex.tag : statsdoc.html : @copy-latex-pngs ; doxygen statsdoc : weighted_tail_quantile.hpp : EXTRACT_ALL=YES "PREDEFINED=\"BOOST_ACCUMULATORS_DOXYGEN_INVOKED=1\" \\ \"BOOST_PP_REPEAT_FROM_TO(a,b,c,d)=\" \\ \"BOOST_PP_REPEAT(a,b,c)=\" \\ \"BOOST_PARAMETER_KEYWORD(a,b)=\\ namespace a { struct b {}; } \\ boost::parameter::keyword const b;\" \\ \"BOOST_PP_ENUM_PARAMS(a,b)=b ## 1, b ## 2, ...\"" HIDE_UNDOC_MEMBERS=NO EXTRACT_PRIVATE=NO ENABLE_PREPROCESSING=YES MACRO_EXPANSION=YES EXPAND_ONLY_PREDEF=YES SEARCH_INCLUDES=NO TAGFILES=accumulators.tag boost.doxygen.header.prefix=doc boost.doxygen.formuladir=images/accumulators/ "Statistics Library Reference" tagfile statsdoclatex.tag latex.check dvips.check gs.check ; if htmlhelp in [ modules.peek : ARGV ] { # # Start with a rule to convert htmlhelp project into # compiled help file: # make htmlhelp/htmlhelp.chm : standalone : @hhc ; actions ignore hhc { hhc htmlhelp/htmlhelp.hhp } # # These install rules copy our images into a subdirectory of the created # htmlhelp project directory: unfortunately hhc.exe will only embed # images in a subdirectory of the project root. # install htmlhelp1 : [ glob html/images/*.png ] : htmlhelp/images ; install htmlhelp1a : [ glob html/images/*.svg ] : htmlhelp/images ; install htmlhelp2 : [ glob html/images/accumulators/*.png ] : statsdoc htmlhelp/images/accumulators ; install htmlhelp3 : [ glob ../src/images/*.png ] : statsdoc htmlhelp/images ; install htmlhelp4 : [ glob ../src/images/callouts/*.png ] : statsdoc htmlhelp/images/callouts ; } xml test : test.qbk ; boostbook standalone : test : statsdoc htmlhelp:htmlhelp1 htmlhelp:htmlhelp1a htmlhelp:htmlhelp2 htmlhelp:htmlhelp3 htmlhelp:htmlhelp4 # HTML options first: #====================================================================== toc.max.depth=2 toc.section.depth=2 chunk.section.depth=1 boost.root=../../.. navig.graphics=1 boost.mathjax=1 $(images_location)/.. # PDF Options: #====================================================================== pdf:img.src.path=$(images_location)/ pdf:boost.url.prefix=http://www.boost.org/doc/libs/release/doc/test/html # HTML Help Options: #====================================================================== #htmlhelp:img.src.path=../html htmlhelp:boost.url.prefix=http://www.boost.org/doc/libs/release/doc/test/html htmlhelp:htmlhelp.chm=test.chm ; install pdfinstall : standalone/pdf : . PDF ; explicit pdfinstall ; ================================================ FILE: doc/test/array.xml ================================================
Introduction The C++ Standard Template Library STL as part of the C++ Standard Library provides a framework for processing algorithms on different kind of containers. However, ordinary arrays don't provide the interface of STL containers (although, they provide the iterator interface of STL containers). As replacement for ordinary arrays, the STL provides class std::vector. However, std::vector<> provides the semantics of dynamic arrays. Thus, it manages data to be able to change the number of elements. This results in some overhead in case only arrays with static size are needed. In his book, Generic Programming and the STL, Matthew H. Austern introduces a useful wrapper class for ordinary arrays with static size, called block. It is safer and has no worse performance than ordinary arrays. In The C++ Programming Language, 3rd edition, Bjarne Stroustrup introduces a similar class, called c_array, which I (Nicolai Josuttis) present slightly modified in my book The C++ Standard Library - A Tutorial and Reference, called carray. This is the essence of these approaches spiced with many feedback from boost. After considering different names, we decided to name this class simply array. Note that this class is suggested to be part of the next Technical Report, which will extend the C++ Standard (see http://std.dkuug.dk/jtc1/sc22/wg21/docs/papers/2003/n1548.htm). Class array fulfills most but not all of the requirements of "reversible containers" (see Section 23.1, [lib.container.requirements] of the C++ Standard). The reasons array is not an reversible STL container is because: No constructors are provided. Elements may have an undetermined initial value (see ). swap() has no constant complexity. size() is always constant, based on the second template argument of the type. The container provides no allocator support. It doesn't fulfill the requirements of a "sequence" (see Section 23.1.1, [lib.sequence.reqmts] of the C++ Standard), except that: front() and back() are provided. operator[] and at() are provided.
================================================ FILE: doc/test/array1.xml ================================================
STL compliant container wrapper for arrays of constant size T T* const T* std::reverse_iterator<iterator> std::reverse_iterator<const_iterator> T& const T& std::size_t std::ptrdiff_t size_type N const array<U, N>& std::copy(rhs.begin(),rhs.end(), begin()) iterator const_iterator iterator for the first element will not throw iterator const_iterator iterator for position after the last element will not throw reverse_iterator const_reverse_iterator reverse iterator for the first element of reverse iteration reverse_iterator const_reverse_iterator reverse iterator for position after the last element in reverse iteration size_type N bool N==0 will not throw size_type N will not throw reference size_type const_reference size_type i < N element with index i will not throw. reference size_type const_reference size_type element with index i std::range_error if i >= N reference const_reference N > 0 the first element will not throw reference const_reference N > 0 the last element will not throw const T* elems will not throw T* elems will not throw void array<T, N>& std::swap_ranges(begin(), end(), other.begin()) linear in N void const T& std::fill_n(begin(), N, value) T void array<T, N>& array<T, N>& x.swap(y) will not throw. bool const array<T, N>& const array<T, N>& std::equal(x.begin(), x.end(), y.begin()) bool const array<T, N>& const array<T, N>& !(x == y) bool const array<T, N>& const array<T, N>& std::lexicographical_compare(x.begin(), x.end(), y.begin(), y.end()) bool const array<T, N>& const array<T, N>& y < x bool const array<T, N>& const array<T, N>& !(y < x) bool const array<T, N>& const array<T, N>& !(x < y)
================================================ FILE: doc/test/array2.xml ================================================
Design Rationale There was an important design tradeoff regarding the constructors: We could implement array as an "aggregate" (see Section 8.5.1, [dcl.init.aggr], of the C++ Standard). This would mean: An array can be initialized with a brace-enclosing, comma-separated list of initializers for the elements of the container, written in increasing subscript order: boost::array<int,4> a = { { 1, 2, 3 } }; Note that if there are fewer elements in the initializer list, then each remaining element gets default-initialized (thus, it has a defined value). However, this approach has its drawbacks: passing no initializer list means that the elements have an indetermined initial value , because the rule says that aggregates may have: No user-declared constructors. No private or protected non-static data members. No base classes. No virtual functions. Nevertheless, The current implementation uses this approach. Note that for standard conforming compilers it is possible to use fewer braces (according to 8.5.1 (11) of the Standard). That is, you can initialize an array as follows: boost::array<int,4> a = { 1, 2, 3 }; I'd appreciate any constructive feedback. Please note: I don't have time to read all boost mails. Thus, to make sure that feedback arrives to me, please send me a copy of each mail regarding this class. The code is provided "as is" without expressed or implied warranty.
================================================ FILE: doc/test/array3.xml ================================================
For more information... To find more details about using ordinary arrays in C++ and the framework of the STL, see e.g. The C++ Standard Library - A Tutorial and Reference by Nicolai M. Josuttis Addison Wesley Longman, 1999 ISBN 0-201-37926-0 Home Page of Nicolai Josuttis
================================================ FILE: doc/test/array4.xml ================================================
Acknowledgements Doug Gregor ported the documentation to the BoostBook format.
================================================ FILE: doc/test/gold/boost/accumulators/extract/weighted_tail_quantile.html ================================================ Global weighted_tail_quantile
Boost C++ Libraries Home Libraries People FAQ More

PrevUpHomeNext

Global weighted_tail_quantile

boost::accumulators::extract::weighted_tail_quantile

Synopsis

// In header: <doc/test/weighted_tail_quantile.hpp>

extractor< tag::quantile > const weighted_tail_quantile;

PrevUpHomeNext
================================================ FILE: doc/test/gold/boost/accumulators/impl/weighted_tail_quantile__id330053.html ================================================ Struct template weighted_tail_quantile_impl
Boost C++ Libraries Home Libraries People FAQ More

PrevUpHomeNext

Struct template weighted_tail_quantile_impl

boost::accumulators::impl::weighted_tail_quantile_impl — Tail quantile estimation based on order statistics of weighted samples (for both left and right tails).

Synopsis

// In header: <doc/test/weighted_tail_quantile.hpp>

template<typename Sample, typename Weight, typename LeftRight> 
struct weighted_tail_quantile_impl {
  // types
  typedef numeric::functional::average< Weight, std::size_t >::result_type float_type; 
  typedef Sample                                                           result_type;

  // construct/copy/destruct
  weighted_tail_quantile_impl(dont_care);

  // public member functions
  template<typename Args> result_type result(Args const &) const;
};

Description

An estimator of tail quantiles with level based on order statistics of weighted samples are given by (left tail) and (right tail), where

Equation 1. 


and

Equation 2. 


being the number of samples and the sum of all weights.

weighted_tail_quantile_impl public construct/copy/destruct

  1. weighted_tail_quantile_impl(dont_care);

weighted_tail_quantile_impl public member functions

  1. template<typename Args> result_type result(Args const & args) const;

PrevUpHomeNext
================================================ FILE: doc/test/gold/boost/accumulators/tag/weighted_tail_quantile.html ================================================ Struct template weighted_tail_quantile
Boost C++ Libraries Home Libraries People FAQ More

PrevUpHome

Struct template weighted_tail_quantile

boost::accumulators::tag::weighted_tail_quantile

Synopsis

// In header: <doc/test/weighted_tail_quantile.hpp>

template<typename LeftRight> 
struct weighted_tail_quantile : public boost::accumulators::depends_on< sum_of_weights, tail_weights< LeftRight > >
{
};

PrevUpHome
================================================ FILE: doc/test/gold/boost/array.html ================================================ Class template array
Boost C++ Libraries Home Libraries People FAQ More

PrevUpHomeNext

Class template array

boost::array — STL compliant container wrapper for arrays of constant size

Synopsis

// In header: <boost/array.hpp>

template<typename T, std::size_t N> 
class array {
public:
  // types
  typedef T                                                                        value_type;            
  typedef T*                                                                       iterator;              
  typedef const T*                                                                 const_iterator;        
  typedef 
                  std::reverse_iterator<iterator>
                      reverse_iterator;      
  typedef 
                  std::reverse_iterator<const_iterator>
                const_reverse_iterator;
  typedef T&                                                                       reference;             
  typedef const T&                                                                 const_reference;       
  typedef std::size_t                                                              size_type;             
  typedef std::ptrdiff_t                                                           difference_type;       

  // static constants
  static const size_type static_size = N;

  // construct/copy/destruct
  template<typename U> array& operator=(const array<U, N>&);

  // iterator support
  iterator begin();
  const_iterator begin() const;
  iterator end();
  const_iterator end() const;

  // reverse iterator support
  reverse_iterator rbegin();
  const_reverse_iterator rbegin() const;
  reverse_iterator rend();
  const_reverse_iterator rend() const;

  // capacity
  size_type size();
  bool empty();
  size_type max_size();

  // element access
  reference operator[](size_type);
  const_reference operator[](size_type) const;
  reference at(size_type);
  const_reference at(size_type) const;
  reference front();
  const_reference front() const;
  reference back();
  const_reference back() const;
  const T* data() const;
  T* c_array();

  // modifiers
  void swap(array<T, N>&);
  void assign(const T&);
  T elems[N];
};

// specialized algorithms
template<typename T, std::size_t N> void swap(array<T, N>&, array<T, N>&);

// comparisons
template<typename T, std::size_t N> 
  bool operator==(const array<T, N>&, const array<T, N>&);
template<typename T, std::size_t N> 
  bool operator!=(const array<T, N>&, const array<T, N>&);
template<typename T, std::size_t N> 
  bool operator<(const array<T, N>&, const array<T, N>&);
template<typename T, std::size_t N> 
  bool operator>(const array<T, N>&, const array<T, N>&);
template<typename T, std::size_t N> 
  bool operator<=(const array<T, N>&, const array<T, N>&);
template<typename T, std::size_t N> 
  bool operator>=(const array<T, N>&, const array<T, N>&);

Description

array public construct/copy/destruct

  1. template<typename U> array& operator=(const array<U, N>& other);

    Effects:

    std::copy(rhs.begin(),rhs.end(), begin())

array iterator support

  1. iterator begin();
    const_iterator begin() const;

    Returns:

    iterator for the first element

    Throws:

    will not throw
  2. iterator end();
    const_iterator end() const;

    Returns:

    iterator for position after the last element

    Throws:

    will not throw

array reverse iterator support

  1. reverse_iterator rbegin();
    const_reverse_iterator rbegin() const;

    Returns:

    reverse iterator for the first element of reverse iteration
  2. reverse_iterator rend();
    const_reverse_iterator rend() const;

    Returns:

    reverse iterator for position after the last element in reverse iteration

array capacity

  1. size_type size();

    Returns:

    N
  2. bool empty();

    Returns:

    N==0

    Throws:

    will not throw
  3. size_type max_size();

    Returns:

    N

    Throws:

    will not throw

array element access

  1. reference operator[](size_type i);
    const_reference operator[](size_type i) const;

    Requires:

    i < N

    Returns:

    element with index i

    Throws:

    will not throw.
  2. reference at(size_type i);
    const_reference at(size_type i) const;

    Returns:

    element with index i

    Throws:

    std::range_error if i >= N
  3. reference front();
    const_reference front() const;

    Requires:

    N > 0

    Returns:

    the first element

    Throws:

    will not throw
  4. reference back();
    const_reference back() const;

    Requires:

    N > 0

    Returns:

    the last element

    Throws:

    will not throw
  5. const T* data() const;

    Returns:

    elems

    Throws:

    will not throw
  6. T* c_array();

    Returns:

    elems

    Throws:

    will not throw

array modifiers

  1. void swap(array<T, N>& other);

    Effects:

    std::swap_ranges(begin(), end(), other.begin())

    Complexity:

    linear in N
  2. void assign(const T& value);

    Effects:

    std::fill_n(begin(), N, value)

array specialized algorithms

  1. template<typename T, std::size_t N> void swap(array<T, N>& x, array<T, N>& y);

    Effects:

    x.swap(y)

    Throws:

    will not throw.

array comparisons

  1. template<typename T, std::size_t N> 
      bool operator==(const array<T, N>& x, const array<T, N>& y);

    Returns:

    std::equal(x.begin(), x.end(), y.begin())
  2. template<typename T, std::size_t N> 
      bool operator!=(const array<T, N>& x, const array<T, N>& y);

    Returns:

    !(x == y)
  3. template<typename T, std::size_t N> 
      bool operator<(const array<T, N>& x, const array<T, N>& y);

    Returns:

    std::lexicographical_compare(x.begin(), x.end(), y.begin(), y.end())
  4. template<typename T, std::size_t N> 
      bool operator>(const array<T, N>& x, const array<T, N>& y);

    Returns:

    y < x
  5. template<typename T, std::size_t N> 
      bool operator<=(const array<T, N>& x, const array<T, N>& y);

    Returns:

    !(y < x)
  6. template<typename T, std::size_t N> 
      bool operator>=(const array<T, N>& x, const array<T, N>& y);

    Returns:

    !(x < y)

PrevUpHomeNext
================================================ FILE: doc/test/gold/document_to_test_formatting/accumulators.html ================================================ Accumulators Example Doxygen Documentation
Boost C++ Libraries Home Libraries People FAQ More

PrevUpHomeNext

Statistics Library Reference

namespace boost {
  namespace accumulators {
    namespace extract {
      extractor< tag::quantile > const weighted_tail_quantile;
    }
    namespace impl {
      template<typename Sample, typename Weight, typename LeftRight> 
        struct weighted_tail_quantile_impl;
    }
    namespace tag {
      template<typename LeftRight> struct weighted_tail_quantile;
    }
  }
}

PrevUpHomeNext
================================================ FILE: doc/test/gold/document_to_test_formatting/array.html ================================================ Array Example Boostbook XML Documentation
Boost C++ Libraries Home Libraries People FAQ More

PrevUpHomeNext

Introduction

The C++ Standard Template Library STL as part of the C++ Standard Library provides a framework for processing algorithms on different kind of containers. However, ordinary arrays don't provide the interface of STL containers (although, they provide the iterator interface of STL containers).

As replacement for ordinary arrays, the STL provides class std::vector. However, std::vector<> provides the semantics of dynamic arrays. Thus, it manages data to be able to change the number of elements. This results in some overhead in case only arrays with static size are needed.

In his book, Generic Programming and the STL, Matthew H. Austern introduces a useful wrapper class for ordinary arrays with static size, called block. It is safer and has no worse performance than ordinary arrays. In The C++ Programming Language, 3rd edition, Bjarne Stroustrup introduces a similar class, called c_array, which I (Nicolai Josuttis) present slightly modified in my book The C++ Standard Library - A Tutorial and Reference, called carray. This is the essence of these approaches spiced with many feedback from boost.

After considering different names, we decided to name this class simply array.

Note that this class is suggested to be part of the next Technical Report, which will extend the C++ Standard (see http://std.dkuug.dk/jtc1/sc22/wg21/docs/papers/2003/n1548.htm).

Class array fulfills most but not all of the requirements of "reversible containers" (see Section 23.1, [lib.container.requirements] of the C++ Standard). The reasons array is not an reversible STL container is because:

  • No constructors are provided.
  • Elements may have an undetermined initial value (see the section called “Design Rationale”).
  • swap() has no constant complexity.
  • size() is always constant, based on the second template argument of the type.
  • The container provides no allocator support.

It doesn't fulfill the requirements of a "sequence" (see Section 23.1.1, [lib.sequence.reqmts] of the C++ Standard), except that:

Reference

Header <boost/array.hpp>

namespace boost {
  template<typename T, std::size_t N> class array;
  template<typename T, std::size_t N> void swap(array<T, N>&, array<T, N>&);
  template<typename T, std::size_t N> 
    bool operator==(const array<T, N>&, const array<T, N>&);
  template<typename T, std::size_t N> 
    bool operator!=(const array<T, N>&, const array<T, N>&);
  template<typename T, std::size_t N> 
    bool operator<(const array<T, N>&, const array<T, N>&);
  template<typename T, std::size_t N> 
    bool operator>(const array<T, N>&, const array<T, N>&);
  template<typename T, std::size_t N> 
    bool operator<=(const array<T, N>&, const array<T, N>&);
  template<typename T, std::size_t N> 
    bool operator>=(const array<T, N>&, const array<T, N>&);
}

Design Rationale

There was an important design tradeoff regarding the constructors: We could implement array as an "aggregate" (see Section 8.5.1, [dcl.init.aggr], of the C++ Standard). This would mean:

  • An array can be initialized with a brace-enclosing, comma-separated list of initializers for the elements of the container, written in increasing subscript order:

                   boost::array<int,4> a = { { 1, 2, 3 } };
                

    Note that if there are fewer elements in the initializer list, then each remaining element gets default-initialized (thus, it has a defined value).

However, this approach has its drawbacks: passing no initializer list means that the elements have an indetermined initial value , because the rule says that aggregates may have:

  • No user-declared constructors.
  • No private or protected non-static data members.
  • No base classes.
  • No virtual functions.

Nevertheless, The current implementation uses this approach.

Note that for standard conforming compilers it is possible to use fewer braces (according to 8.5.1 (11) of the Standard). That is, you can initialize an array as follows:

      boost::array<int,4> a = { 1, 2, 3 };
   

I'd appreciate any constructive feedback. Please note: I don't have time to read all boost mails. Thus, to make sure that feedback arrives to me, please send me a copy of each mail regarding this class.

The code is provided "as is" without expressed or implied warranty.

For more information...

To find more details about using ordinary arrays in C++ and the framework of the STL, see e.g.


         The C++ Standard Library - A Tutorial and Reference
         by Nicolai M. Josuttis
         Addison Wesley Longman, 1999
         ISBN 0-201-37926-0
      

Home Page of Nicolai Josuttis

Acknowledgements

Doug Gregor ported the documentation to the BoostBook format.


PrevUpHomeNext
================================================ FILE: doc/test/gold/document_to_test_formatting/basic_formatting.html ================================================ Basic Formatting
Boost C++ Libraries Home Libraries People FAQ More

PrevUpHomeNext

Here we go with some inline formatting: italic, bold, underline, teletype, strikethrough, we can combine styles as well: bold italic, teletype with underline.

Text that is intended to be user-replaceable is rendered like this.

Here we go: A question that sometimes drives me hazy: am I or are the others crazy?--Einstein

Note the proper left and right quote marks. Also, while you can simply use ordinary quote marks like "quoted", our quotation, above, will generate correct DocBook quotations (e.g. <quote>quoted</quote>).

Like all phrase elements, quotations may be nested. Example:

Here's the rule for bargains: Do other men, for they would do you. That's the true business precept.

This text has inlined code int main() { return 0; } in it. The code should be syntax highlighted.

Try this: this is boost's website.... it should be visible as a link.

This is a link to a header file (boost/math/distributions.hpp), it should be rewritable and point to the website when built as a PDF.

This is a link to another library's documentation (Boost.Regex), using the boost: protocol, it should be rewritten to point to the website when building a PDF.

This is a link to another library's documentation (Boost.Regex), using the boost:/ protocol, it should be rewritten to point to the website when building a PDF.

This is a relative link to a header file within the test source, it should be rewritten to point to the website when building a PDF. Although it might be on the website yet.

Here's one [1].

And here's another [2].

Lets indent the next paragraph:

Here we go!!!

Now try rendering some heading styles:

Heading 1

Heading 2

Heading 3

Heading 4
Heading 5

Heading 6



[1] A sample footnote

[2] Another sample footnote


PrevUpHomeNext
================================================ FILE: doc/test/gold/document_to_test_formatting/blurbs.html ================================================ Blurbs
Boost C++ Libraries Home Libraries People FAQ More

PrevUpHomeNext

Here's some sample program output:

F test for equal standard deviations
____________________________________

Sample 1:
Number of Observations                                 =  240
Sample Standard Deviation                              =  65.549

Sample 2:
Number of Observations                                 =  240
Sample Standard Deviation                              =  61.854

Test Statistic                                         =  1.123

CDF of test statistic:                                 =  8.148e-001
Upper Critical Value at alpha:                         =  1.238e+000
Upper Critical Value at alpha/2:                       =  1.289e+000
Lower Critical Value at alpha:                         =  8.080e-001
Lower Critical Value at alpha/2:                       =  7.756e-001

Results for Alternative Hypothesis and alpha           =  0.0500

Alternative Hypothesis                                    Conclusion
Standard deviations are unequal (two sided test)          REJECTED
Standard deviation 1 is less than standard deviation 2    REJECTED
Standard deviation 1 is greater than standard deviation 2 REJECTED

There are four admonishments supported by Docbook XML:

[Note] Note

This is a note

[Tip] Tip

This is a tip

[Important] Important

This is important

[Caution] Caution

This is a caution

[Warning] Warning

This is a warning

They can contain more than one paragraph.


PrevUpHomeNext
================================================ FILE: doc/test/gold/document_to_test_formatting/code_blocks.html ================================================ Code Blocks
Boost C++ Libraries Home Libraries People FAQ More

PrevUpHomeNext

These should be syntax highlighted:

#include <iostream>

int main()
{
    // Sample code
    std::cout << "Hello, World\n";
    return 0;
}
template <class RealType> RealType inline foo(const RealType& a, const RealType& b, const RealType& c, const RealType& d, const RealType& e, const RealType& f, const RealType& g, const RealType& h){ return 0; }

Here's some code with left-placed callouts:

class x
{
public:

    1x() : n(0)
    {
    }

    2~x()
    {
    }

    3int get() const
    {
        return n; 
    }

    4void set(int n_)
    {
        n = n_;
    }
};

1

Constructor

2

Destructor

3

Get the n member variable

4

Set the n member variable

And again with callouts placed exactly where we put them:

std::string foo_bar() 1
{
    return "foo-bar"; 2
}

1

The Mythical FooBar. See Foobar for details

2

return 'em, foo-bar man!

Now let's include a larger example, this may span several pages and should not be chopped off half way through... some FO processors get this wrong!

namespace boost{

template <class BidirectionalIterator>
class sub_match;

typedef sub_match<const char*>                    csub_match;
typedef sub_match<const wchar_t*>                 wcsub_match;
typedef sub_match<std::string::const_iterator>    ssub_match;
typedef sub_match<std::wstring::const_iterator>   wssub_match;

template <class BidirectionalIterator>
class sub_match : public std::pair<BidirectionalIterator, BidirectionalIterator>
{
public:
   typedef typename iterator_traits<BidirectionalIterator>::value_type value_type;
   typedef typename iterator_traits<BidirectionalIterator>::difference_type   difference_type;
   typedef          BidirectionalIterator                                    iterator;

   bool  matched;

   difference_type length()const;
   operator basic_string<value_type>()const;
   basic_string<value_type> str()const;

   int compare(const sub_match& s)const;
   int compare(const basic_string<value_type>& s)const;
   int compare(const value_type* s)const;
#ifdef BOOST_REGEX_MATCH_EXTRA
   typedef implementation-private capture_sequence_type;
   const capture_sequence_type& captures()const;
#endif
};
//
// comparisons to another sub_match:
//
template <class BidirectionalIterator>
bool operator == (const sub_match<BidirectionalIterator>& lhs,
                  const sub_match<BidirectionalIterator>& rhs);
template <class BidirectionalIterator>
bool operator != (const sub_match<BidirectionalIterator>& lhs,
                  const sub_match<BidirectionalIterator>& rhs);
template <class BidirectionalIterator>
bool operator < (const sub_match<BidirectionalIterator>& lhs,
               const sub_match<BidirectionalIterator>& rhs);
template <class BidirectionalIterator>
bool operator <= (const sub_match<BidirectionalIterator>& lhs,
                  const sub_match<BidirectionalIterator>& rhs);
template <class BidirectionalIterator>
bool operator >= (const sub_match<BidirectionalIterator>& lhs,
                  const sub_match<BidirectionalIterator>& rhs);
template <class BidirectionalIterator>
bool operator > (const sub_match<BidirectionalIterator>& lhs,
               const sub_match<BidirectionalIterator>& rhs);


//
// comparisons to a basic_string:
//
template <class BidirectionalIterator, class traits, class Allocator> 
bool operator == (const std::basic_string<iterator_traits<BidirectionalIterator>::value_type,
                                          traits, 
                                          Allocator>& lhs,
                  const sub_match<BidirectionalIterator>& rhs);
template <class BidirectionalIterator, class traits, class Allocator> 
bool operator != (const std::basic_string<iterator_traits<BidirectionalIterator>::value_type,
                                          traits, 
                                          Allocator>& lhs,
                  const sub_match<BidirectionalIterator>& rhs);
template <class BidirectionalIterator, class traits, class Allocator> 
bool operator < (const std::basic_string<iterator_traits<BidirectionalIterator>::value_type,
                                          traits, 
                                          Allocator>& lhs,
                  const sub_match<BidirectionalIterator>& rhs);
template <class BidirectionalIterator, class traits, class Allocator> 
bool operator > (const std::basic_string<iterator_traits<BidirectionalIterator>::value_type,
                                          traits, 
                                          Allocator>& lhs,
                  const sub_match<BidirectionalIterator>& rhs);
template <class BidirectionalIterator, class traits, class Allocator> 
bool operator >= (const std::basic_string<iterator_traits<BidirectionalIterator>::value_type,
                                          traits, 
                                          Allocator>& lhs,
                  const sub_match<BidirectionalIterator>& rhs);
template <class BidirectionalIterator, class traits, class Allocator> 
bool operator <= (const std::basic_string<iterator_traits<BidirectionalIterator>::value_type,
                                          traits, 
                                          Allocator>& lhs,
                  const sub_match<BidirectionalIterator>& rhs);

template <class BidirectionalIterator, class traits, class Allocator> 
bool operator == (const sub_match<BidirectionalIterator>& lhs,
                  const std::basic_string<iterator_traits<BidirectionalIterator>::value_type, 
                                          traits, 
                                          Allocator>& rhs);
template <class BidirectionalIterator, class traits, class Allocator> 
bool operator != (const sub_match<BidirectionalIterator>& lhs,
                  const std::basic_string<iterator_traits<BidirectionalIterator>::value_type, 
                                          traits, 
                                          Allocator>& rhs);
template <class BidirectionalIterator, class traits, class Allocator> 
bool operator < (const sub_match<BidirectionalIterator>& lhs,
               const std::basic_string<iterator_traits<BidirectionalIterator>::value_type, 
                                       traits, 
                                       Allocator>& rhs);
template <class BidirectionalIterator, class traits, class Allocator> 
bool operator > (const sub_match<BidirectionalIterator>& lhs,
               const std::basic_string<iterator_traits<BidirectionalIterator>::value_type, 
                                       traits, 
                                       Allocator>& rhs);
template <class BidirectionalIterator, class traits, class Allocator> 
bool operator >= (const sub_match<BidirectionalIterator>& lhs,
                  const std::basic_string<iterator_traits<BidirectionalIterator>::value_type, 
                                       traits, 
                                       Allocator>& rhs);
template <class BidirectionalIterator, class traits, class Allocator> 
bool operator <= (const sub_match<BidirectionalIterator>& lhs,
                  const std::basic_string<iterator_traits<BidirectionalIterator>::value_type, 
                                          traits, 
                                          Allocator>& rhs);

//
// comparisons to a pointer to a character array:
//
template <class BidirectionalIterator> 
bool operator == (typename iterator_traits<BidirectionalIterator>::value_type const* lhs,
                  const sub_match<BidirectionalIterator>& rhs); 
template <class BidirectionalIterator> 
bool operator != (typename iterator_traits<BidirectionalIterator>::value_type const* lhs,
                  const sub_match<BidirectionalIterator>& rhs); 
template <class BidirectionalIterator> 
bool operator < (typename iterator_traits<BidirectionalIterator>::value_type const* lhs,
               const sub_match<BidirectionalIterator>& rhs); 
template <class BidirectionalIterator> 
bool operator > (typename iterator_traits<BidirectionalIterator>::value_type const* lhs,
               const sub_match<BidirectionalIterator>& rhs); 
template <class BidirectionalIterator> 
bool operator >= (typename iterator_traits<BidirectionalIterator>::value_type const* lhs,
                  const sub_match<BidirectionalIterator>& rhs); 
template <class BidirectionalIterator> 
bool operator <= (typename iterator_traits<BidirectionalIterator>::value_type const* lhs,
                  const sub_match<BidirectionalIterator>& rhs); 

template <class BidirectionalIterator> 
bool operator == (const sub_match<BidirectionalIterator>& lhs,
                  typename iterator_traits<BidirectionalIterator>::value_type const* rhs); 
template <class BidirectionalIterator> 
bool operator != (const sub_match<BidirectionalIterator>& lhs,
                  typename iterator_traits<BidirectionalIterator>::value_type const* rhs); 
template <class BidirectionalIterator> 
bool operator < (const sub_match<BidirectionalIterator>& lhs,
               typename iterator_traits<BidirectionalIterator>::value_type const* rhs); 
template <class BidirectionalIterator> 
bool operator > (const sub_match<BidirectionalIterator>& lhs,
               typename iterator_traits<BidirectionalIterator>::value_type const* rhs); 
template <class BidirectionalIterator> 
bool operator >= (const sub_match<BidirectionalIterator>& lhs,
                  typename iterator_traits<BidirectionalIterator>::value_type const* rhs); 
template <class BidirectionalIterator> 
bool operator <= (const sub_match<BidirectionalIterator>& lhs,
                  typename iterator_traits<BidirectionalIterator>::value_type const* rhs); 

//
// comparisons to a single character:
//
template <class BidirectionalIterator> 
bool operator == (typename iterator_traits<BidirectionalIterator>::value_type const& lhs,
                  const sub_match<BidirectionalIterator>& rhs); 
template <class BidirectionalIterator> 
bool operator != (typename iterator_traits<BidirectionalIterator>::value_type const& lhs,
                  const sub_match<BidirectionalIterator>& rhs); 
template <class BidirectionalIterator> 
bool operator < (typename iterator_traits<BidirectionalIterator>::value_type const& lhs,
               const sub_match<BidirectionalIterator>& rhs); 
template <class BidirectionalIterator> 
bool operator > (typename iterator_traits<BidirectionalIterator>::value_type const& lhs,
               const sub_match<BidirectionalIterator>& rhs); 
template <class BidirectionalIterator> 
bool operator >= (typename iterator_traits<BidirectionalIterator>::value_type const& lhs,
                  const sub_match<BidirectionalIterator>& rhs); 
template <class BidirectionalIterator> 
bool operator <= (typename iterator_traits<BidirectionalIterator>::value_type const& lhs,
                  const sub_match<BidirectionalIterator>& rhs); 

template <class BidirectionalIterator> 
bool operator == (const sub_match<BidirectionalIterator>& lhs,
                  typename iterator_traits<BidirectionalIterator>::value_type const& rhs); 
template <class BidirectionalIterator> 
bool operator != (const sub_match<BidirectionalIterator>& lhs,
                  typename iterator_traits<BidirectionalIterator>::value_type const& rhs); 
template <class BidirectionalIterator> 
bool operator < (const sub_match<BidirectionalIterator>& lhs,
               typename iterator_traits<BidirectionalIterator>::value_type const& rhs); 
template <class BidirectionalIterator> 
bool operator > (const sub_match<BidirectionalIterator>& lhs,
               typename iterator_traits<BidirectionalIterator>::value_type const& rhs); 
template <class BidirectionalIterator> 
bool operator >= (const sub_match<BidirectionalIterator>& lhs,
                  typename iterator_traits<BidirectionalIterator>::value_type const& rhs); 
template <class BidirectionalIterator> 
bool operator <= (const sub_match<BidirectionalIterator>& lhs,
                  typename iterator_traits<BidirectionalIterator>::value_type const& rhs); 
// 
// addition operators: 
//
template <class BidirectionalIterator, class traits, class Allocator> 
std::basic_string<typename iterator_traits<BidirectionalIterator>::value_type, traits, Allocator> 
   operator + (const std::basic_string<typename iterator_traits<BidirectionalIterator>::value_type,
                                       traits, 
                                       Allocator>& s, 
               const sub_match<BidirectionalIterator>& m); 
template <class BidirectionalIterator, class traits, class Allocator> 
std::basic_string<typename iterator_traits<BidirectionalIterator>::value_type, traits, Allocator>
   operator + (const sub_match<BidirectionalIterator>& m,
               const std::basic_string<typename iterator_traits<BidirectionalIterator>::value_type, 
                                       traits, 
                                       Allocator>& s); 
template <class BidirectionalIterator> 
std::basic_string<typename iterator_traits<BidirectionalIterator>::value_type> 
   operator + (typename iterator_traits<BidirectionalIterator>::value_type const* s,
               const sub_match<BidirectionalIterator>& m); 
template <class BidirectionalIterator> 
std::basic_string<typename iterator_traits<BidirectionalIterator>::value_type> 
   operator + (const sub_match<BidirectionalIterator>& m,
               typename iterator_traits<BidirectionalIterator>::value_type const * s);
template <class BidirectionalIterator> 
std::basic_string<typename iterator_traits<BidirectionalIterator>::value_type> 
   operator + (typename iterator_traits<BidirectionalIterator>::value_type const& s,
               const sub_match<BidirectionalIterator>& m); 
template <class BidirectionalIterator> 
std::basic_string<typename iterator_traits<BidirectionalIterator>::value_type> 
   operator + (const sub_match<BidirectionalIterator>& m,
               typename iterator_traits<BidirectionalIterator>::value_type const& s); 
template <class BidirectionalIterator> 
std::basic_string<typename iterator_traits<BidirectionalIterator>::value_type> 
   operator + (const sub_match<BidirectionalIterator>& m1,
               const sub_match<BidirectionalIterator>& m2);

//
// stream inserter:
//
template <class charT, class traits, class BidirectionalIterator>
basic_ostream<charT, traits>&
   operator << (basic_ostream<charT, traits>& os,
               const sub_match<BidirectionalIterator>& m);

} // namespace boost

PrevUpHomeNext
================================================ FILE: doc/test/gold/document_to_test_formatting/images.html ================================================ Images
Boost C++ Libraries Home Libraries People FAQ More

PrevUpHomeNext

These are tricky enough that they warrant their own section.

Let's start with a PNG file that's set to 120dpi, it should render at a sensible size in both html and PDF forms. It should print OK too!

digamma3

Now try again with a sample SVG image:


PrevUpHomeNext
================================================ FILE: doc/test/gold/document_to_test_formatting/lists_and_tables.html ================================================ Lists and Tables
Boost C++ Libraries Home Libraries People FAQ More

PrevUpHomeNext

A numbered list:

  1. One
  2. Two
  3. Three
    1. Three.a
    2. Three.b
    3. Three.c
  4. Four
    1. Four.a
      1. Four.a.i
      2. Four.a.ii
  5. Five

An unordered list:

  • First
  • Second
  • Third

A mixture of the two:

  1. 1
    • 1.a
      1. 1.a.1
      2. 1.a.2
    • 1.b
  2. 2
    • 2.a
    • 2.b
      1. 2.b.1
      2. 2.b.2
        • 2.b.2.a
        • 2.b.2.b

A Variable List

term 1

The definition of term 1

term 2

The definition of term 2

term 3

The definition of term 3

Here's a big table with code and other tricky things:

Table 1. Notes on the Implementation of the Beta Distribution

Function

Implementation Notes

pdf

f(x;α,β) = xα - 1 (1 - x)β -1 / B(α, β)

Implemented using ibeta_derivative(a, b, x).

cdf

Using the incomplete beta function ibeta(a, b, x)

cdf complement

ibetac(a, b, x)

quantile

Using the inverse incomplete beta function ibeta_inv(a, b, p)

quantile from the complement

ibetac_inv(a, b, q)

mean

a/(a+b)

variance

a * b / (a+b)^2 * (a + b + 1)

mode

(a-1) / (a + b + 2)

skewness

2 (b-a) sqrt(a+b+1)/(a+b+2) * sqrt(a * b)

kurtosis excess

beta_dist_kurtosis

kurtosis

kurtosis + 3

parameter estimation

alpha

from mean and variance

mean * (( (mean * (1 - mean)) / variance)- 1)

beta

from mean and variance

(1 - mean) * (((mean * (1 - mean)) /variance)-1)

The member functions estimate_alpha and estimate_beta

from cdf and probability x

and either alpha or beta

Implemented in terms of the inverse incomplete beta functions

ibeta_inva, and ibeta_invb respectively.

estimate_alpha

ibeta_inva(beta, x, probability)

estimate_beta

ibeta_invb(alpha, x, probability)



PrevUpHomeNext
================================================ FILE: doc/test/gold/document_to_test_formatting/remez.html ================================================ Sample Article (The Remez Method)
Boost C++ Libraries Home Libraries People FAQ More

PrevUpHomeNext

The Remez algorithm is a methodology for locating the minimax rational approximation to a function. This short article gives a brief overview of the method, but it should not be regarded as a thorough theoretical treatment, for that you should consult your favorite textbook.

Imagine that you want to approximate some function f(x) by way of a rational function R(x), where R(x) may be either a polynomial P(x) or a ratio of two polynomials P(x)/Q(x) (a rational function). Initially we'll concentrate on the polynomial case, as it's by far the easier to deal with, later we'll extend to the full rational function case.

We want to find the "best" rational approximation, where "best" is defined to be the approximation that has the least deviation from f(x). We can measure the deviation by way of an error function:

Eabs(x) = f(x) - R(x)

which is expressed in terms of absolute error, but we can equally use relative error:

Erel(x) = (f(x) - R(x)) / |f(x)|

And indeed in general we can scale the error function in any way we want, it makes no difference to the maths, although the two forms above cover almost every practical case that you're likely to encounter.

The minimax rational function R(x) is then defined to be the function that yields the smallest maximal value of the error function. Chebyshev showed that there is a unique minimax solution for R(x) that has the following properties:

  • If R(x) is a polynomial of degree N, then there are N+2 unknowns: the N+1 coefficients of the polynomial, and maximal value of the error function.
  • The error function has N+1 roots, and N+2 extrema (minima and maxima).
  • The extrema alternate in sign, and all have the same magnitude.

That means that if we know the location of the extrema of the error function then we can write N+2 simultaneous equations:

R(xi) + (-1)iE = f(xi)

where E is the maximal error term, and xi are the abscissa values of the N+2 extrema of the error function. It is then trivial to solve the simultaneous equations to obtain the polynomial coefficients and the error term.

Unfortunately we don't know where the extrema of the error function are located!

The Remez Method

The Remez method is an iterative technique which, given a broad range of assumptions, will converge on the extrema of the error function, and therefore the minimax solution.

In the following discussion we'll use a concrete example to illustrate the Remez method: an approximation to the function ex over the range [-1, 1].

Before we can begin the Remez method, we must obtain an initial value for the location of the extrema of the error function. We could "guess" these, but a much closer first approximation can be obtained by first constructing an interpolated polynomial approximation to f(x).

In order to obtain the N+1 coefficients of the interpolated polynomial we need N+1 points (x0...xN): with our interpolated form passing through each of those points that yields N+1 simultaneous equations:

f(xi) = P(xi) = c0 + c1xi ... + cNxiN

Which can be solved for the coefficients c0...cN in P(x).

Obviously this is not a minimax solution, indeed our only guarantee is that f(x) and P(x) touch at N+1 locations, away from those points the error may be arbitrarily large. However, we would clearly like this initial approximation to be as close to f(x) as possible, and it turns out that using the zeros of an orthogonal polynomial as the initial interpolation points is a good choice. In our example we'll use the zeros of a Chebyshev polynomial as these are particularly easy to calculate, interpolating for a polynomial of degree 4, and measuring relative error we get the following error function:

remez-2

Which has a peak relative error of 1.2x10-3.

While this is a pretty good approximation already, judging by the shape of the error function we can clearly do better. Before starting on the Remez method propper, we have one more step to perform: locate all the extrema of the error function, and store these locations as our initial Chebyshev control points.

[Note] Note

In the simple case of a polynomial approximation, by interpolating through the roots of a Chebyshev polynomial we have in fact created a Chebyshev approximation to the function: in terms of absolute error this is the best a priori choice for the interpolated form we can achieve, and typically is very close to the minimax solution.

However, if we want to optimise for relative error, or if the approximation is a rational function, then the initial Chebyshev solution can be quite far from the ideal minimax solution.

A more technical discussion of the theory involved can be found in this online course.

Remez Step 1

The first step in the Remez method, given our current set of N+2 Chebyshev control points xi, is to solve the N+2 simultaneous equations:

P(xi) + (-1)iE = f(xi)

To obtain the error term E, and the coefficients of the polynomial P(x).

This gives us a new approximation to f(x) that has the same error E at each of the control points, and whose error function alternates in sign at the control points. This is still not necessarily the minimax solution though: since the control points may not be at the extrema of the error function. After this first step here's what our approximation's error function looks like:

remez-3

Clearly this is still not the minimax solution since the control points are not located at the extrema, but the maximum relative error has now dropped to 5.6x10-4.

Remez Step 2

The second step is to locate the extrema of the new approximation, which we do in two stages: first, since the error function changes sign at each control point, we must have N+1 roots of the error function located between each pair of N+2 control points. Once these roots are found by standard root finding techniques, we know that N extrema are bracketed between each pair of roots, plus two more between the endpoints of the range and the first and last roots. The N+2 extrema can then be found using standard function minimisation techniques.

We now have a choice: multi-point exchange, or single point exchange.

In single point exchange, we move the control point nearest to the largest extrema to the abscissa value of the extrema.

In multi-point exchange we swap all the current control points, for the locations of the extrema.

In our example we perform multi-point exchange.

Iteration

The Remez method then performs steps 1 and 2 above iteratively until the control points are located at the extrema of the error function: this is then the minimax solution.

For our current example, two more iterations converges on a minimax solution with a peak relative error of 5x10-4 and an error function that looks like:

remez-4

Rational Approximations

If we wish to extend the Remez method to a rational approximation of the form

f(x) = R(x) = P(x) / Q(x)

where P(x) and Q(x) are polynomials, then we proceed as before, except that now we have N+M+2 unknowns if P(x) is of order N and Q(x) is of order M. This assumes that Q(x) is normalised so that it's leading coefficient is 1, giving N+M+1 polynomial coefficients in total, plus the error term E.

The simultaneous equations to be solved are now:

P(xi) / Q(xi) + (-1)iE = f(xi)

Evaluated at the N+M+2 control points xi.

Unfortunately these equations are non-linear in the error term E: we can only solve them if we know E, and yet E is one of the unknowns!

The method usually adopted to solve these equations is an iterative one: we guess the value of E, solve the equations to obtain a new value for E (as well as the polynomial coefficients), then use the new value of E as the next guess. The method is repeated until E converges on a stable value.

These complications extend the running time required for the development of rational approximations quite considerably. It is often desirable to obtain a rational rather than polynomial approximation none the less: rational approximations will often match more difficult to approximate functions, to greater accuracy, and with greater efficiency, than their polynomial alternatives. For example, if we takes our previous example of an approximation to ex, we obtained 5x10-4 accuracy with an order 4 polynomial. If we move two of the unknowns into the denominator to give a pair of order 2 polynomials, and re-minimise, then the peak relative error drops to 8.7x10-5. That's a 5 fold increase in accuracy, for the same number of terms overall.

Practical Considerations

Most treatises on approximation theory stop at this point. However, from a practical point of view, most of the work involves finding the right approximating form, and then persuading the Remez method to converge on a solution.

So far we have used a direct approximation:

f(x) = R(x)

But this will converge to a useful approximation only if f(x) is smooth. In addition round-off errors when evaluating the rational form mean that this will never get closer than within a few epsilon of machine precision. Therefore this form of direct approximation is often reserved for situations where we want efficiency, rather than accuracy.

The first step in improving the situation is generally to split f(x) into a dominant part that we can compute accurately by another method, and a slowly changing remainder which can be approximated by a rational approximation. We might be tempted to write:

f(x) = g(x) + R(x)

where g(x) is the dominant part of f(x), but if f(x)/g(x) is approximately constant over the interval of interest then:

f(x) = g(x)(c + R(x))

Will yield a much better solution: here c is a constant that is the approximate value of f(x)/g(x) and R(x) is typically tiny compared to c. In this situation if R(x) is optimised for absolute error, then as long as its error is small compared to the constant c, that error will effectively get wiped out when R(x) is added to c.

The difficult part is obviously finding the right g(x) to extract from your function: often the asymptotic behaviour of the function will give a clue, so for example the function __erfc becomes proportional to e-x2/x as x becomes large. Therefore using:

erfc(z) = (C + R(x)) e-x2/x

as the approximating form seems like an obvious thing to try, and does indeed yield a useful approximation.

However, the difficulty then becomes one of converging the minimax solution. Unfortunately, it is known that for some functions the Remez method can lead to divergent behaviour, even when the initial starting approximation is quite good. Furthermore, it is not uncommon for the solution obtained in the first Remez step above to be a bad one: the equations to be solved are generally "stiff", often very close to being singular, and assuming a solution is found at all, round-off errors and a rapidly changing error function, can lead to a situation where the error function does not in fact change sign at each control point as required. If this occurs, it is fatal to the Remez method. It is also possible to obtain solutions that are perfectly valid mathematically, but which are quite useless computationally: either because there is an unavoidable amount of roundoff error in the computation of the rational function, or because the denominator has one or more roots over the interval of the approximation. In the latter case while the approximation may have the correct limiting value at the roots, the approximation is nonetheless useless.

Assuming that the approximation does not have any fatal errors, and that the only issue is converging adequately on the minimax solution, the aim is to get as close as possible to the minimax solution before beginning the Remez method. Using the zeros of a Chebyshev polynomial for the initial interpolation is a good start, but may not be ideal when dealing with relative errors and/or rational (rather than polynomial) approximations. One approach is to skew the initial interpolation points to one end: for example if we raise the roots of the Chebyshev polynomial to a positive power greater than 1 then the roots will be skewed towards the middle of the [-1,1] interval, while a positive power less than one will skew them towards either end. More usefully, if we initially rescale the points over [0,1] and then raise to a positive power, we can skew them to the left or right. Returning to our example of ex over [-1,1], the initial interpolated form was some way from the minimax solution:

remez-2

However, if we first skew the interpolation points to the left (rescale them to [0, 1], raise to the power 1.3, and then rescale back to [-1,1]) we reduce the error from 1.3x10-3to 6x10-4:

remez-5

It's clearly still not ideal, but it is only a few percent away from our desired minimax solution (5x10-4).

Remez Method Checklist

The following lists some of the things to check if the Remez method goes wrong, it is by no means an exhaustive list, but is provided in the hopes that it will prove useful.

  • Is the function smooth enough? Can it be better separated into a rapidly changing part, and an asymptotic part?
  • Does the function being approximated have any "blips" in it? Check for problems as the function changes computation method, or if a root, or an infinity has been divided out. The telltale sign is if there is a narrow region where the Remez method will not converge.
  • Check you have enough accuracy in your calculations: remember that the Remez method works on the difference between the approximation and the function being approximated: so you must have more digits of precision available than the precision of the approximation being constructed. So for example at double precision, you shouldn't expect to be able to get better than a float precision approximation.
  • Try skewing the initial interpolated approximation to minimise the error before you begin the Remez steps.
  • If the approximation won't converge or is ill-conditioned from one starting location, try starting from a different location.
  • If a rational function won't converge, one can minimise a polynomial (which presents no problems), then rotate one term from the numerator to the denominator and minimise again. In theory one can continue moving terms one at a time from numerator to denominator, and then re-minimising, retaining the last set of control points at each stage.
  • Try using a smaller interval. It may also be possible to optimise over one (small) interval, rescale the control points over a larger interval, and then re-minimise.
  • Keep abscissa values small: use a change of variable to keep the abscissa over, say [0, b], for some smallish value b.
References

The original references for the Remez Method and it's extension to rational functions are unfortunately in Russian:

Remez, E.Ya., Fundamentals of numerical methods for Chebyshev approximations, "Naukova Dumka", Kiev, 1969.

Remez, E.Ya., Gavrilyuk, V.T., Computer development of certain approaches to the approximate construction of solutions of Chebyshev problems nonlinearly depending on parameters, Ukr. Mat. Zh. 12 (1960), 324-338.

Gavrilyuk, V.T., Generalization of the first polynomial algorithm of E.Ya.Remez for the problem of constructing rational-fractional Chebyshev approximations, Ukr. Mat. Zh. 16 (1961), 575-585.

Some English language sources include:

Fraser, W., Hart, J.F., On the computation of rational approximations to continuous functions, Comm. of the ACM 5 (1962), 401-403, 414.

Ralston, A., Rational Chebyshev approximation by Remes' algorithms, Numer.Math. 7 (1965), no. 4, 322-330.

A. Ralston, Rational Chebyshev approximation, Mathematical Methods for Digital Computers v. 2 (Ralston A., Wilf H., eds.), Wiley, New York, 1967, pp. 264-284.

Hart, J.F. e.a., Computer approximations, Wiley, New York a.o., 1968.

Cody, W.J., Fraser, W., Hart, J.F., Rational Chebyshev approximation using linear equations, Numer.Math. 12 (1968), 242-251.

Cody, W.J., A survey of practical rational and polynomial approximation of functions, SIAM Review 12 (1970), no. 3, 400-423.

Barrar, R.B., Loeb, H.J., On the Remez algorithm for non-linear families, Numer.Math. 15 (1970), 382-391.

Dunham, Ch.B., Convergence of the Fraser-Hart algorithm for rational Chebyshev approximation, Math. Comp. 29 (1975), no. 132, 1078-1082.

G. L. Litvinov, Approximate construction of rational approximations and the effect of error autocorrection, Russian Journal of Mathematical Physics, vol.1, No. 3, 1994.


PrevUpHomeNext
================================================ FILE: doc/test/gold/document_to_test_formatting/test.html ================================================ test HTML4 symbols
Boost C++ Libraries Home Libraries People FAQ More

PrevUpHomeNext

ƒ, Α, Β, Γ, Δ, Ε, Ζ, Η, Θ, Ι, Κ, Λ, Μ, Ν, Ξ, Ο, Π, Ρ, Σ, Τ, Υ, Φ, Χ, Ψ, Ω, α, β, γ, δ, ε, ζ, η, θ, ι, κ, λ, μ, ν, ξ, ο, π, ρ, ς, σ, τ, υ, φ, χ, ψ, ω, ϑ, ϒ, ϖ, •, …, ′, ″, ‾, ⁄, ℘, ℑ, ℜ, ™, ℵ, ←, ↑, →, ↓, ↔, ↵, ⇐, ⇑, ⇒, ⇓, ⇔, ∀, ∂, ∃, ∅, ∇, ∈, ∉, ∋, ∏, ∑, −, ∗, √, ∝, ∞, ∠, ∧, ∨, ∩, ∪, ∫, ∴, ∼, ≅, ≈, ≠, ≡, ≤, ≥, ⊂, ⊃, ⊄, ⊆, ⊇, ⊕, ⊗, ⊥, ⋅, ⌈, ⌉, ⌊, ⌋, 〈, 〉, ◊, ♠, ♣, ♥, ♦

 , ¡, ¢, £, ¤, ¥, ¦, §, ¨, ©, ª, «, ¬, ­, ®, ¯, °, ±, ², ³, ´, µ, ¶, ·, ¸, ¹, º, », ¼, ½, ¾, ¿, À, Á, Â, Ã, Ä, Å, Æ, Ç, È, É, Ê, Ë, Ì, Í, Î, Ï, Ð, Ñ, Ò, Ó, Ô, Õ, Ö, ×, Ø, Ù, Ú, Û, Ü, Ý, Þ, ß, à, á, â, ã, ä, å, æ, ç, è, é, ê, ë, ì, í, î, ï, ð, ñ, ò, ó, ô, õ, ö, ÷, ø, ù, ú, û, ü, ý, þ, ÿ,


PrevUpHomeNext
================================================ FILE: doc/test/gold/index.html ================================================ Document To Test Formatting
Boost C++ Libraries Home Libraries People FAQ More

Next

Document To Test Formatting

John Maddock

Joel de Guzman

Eric Niebler

Matias Capeletto

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)


This document is purely a test case to test out HTML and PDF generation and style.

This is some body text.

int main()
{
    double d = 2.345;
    return d;
}

We can count in Greek too: α, β, γ.

Try some superscripts and subscripts: x2, xi3, α2, βα, ⌊x⌋, ⌊α⌋, ⌈a⌉.

Last revised: July 22, 2010 at 21:58:58 GMT


Next
================================================ FILE: doc/test/remez.qbk ================================================ [section:remez Sample Article (The Remez Method)] The [@http://en.wikipedia.org/wiki/Remez_algorithm Remez algorithm] is a methodology for locating the minimax rational approximation to a function. This short article gives a brief overview of the method, but it should not be regarded as a thorough theoretical treatment, for that you should consult your favorite textbook. Imagine that you want to approximate some function f(x) by way of a rational function R(x), where R(x) may be either a polynomial P(x) or a ratio of two polynomials P(x)/Q(x) (a rational function). Initially we'll concentrate on the polynomial case, as it's by far the easier to deal with, later we'll extend to the full rational function case. We want to find the "best" rational approximation, where "best" is defined to be the approximation that has the least deviation from f(x). We can measure the deviation by way of an error function: E[sub abs](x) = f(x) - R(x) which is expressed in terms of absolute error, but we can equally use relative error: E[sub rel](x) = (f(x) - R(x)) / |f(x)| And indeed in general we can scale the error function in any way we want, it makes no difference to the maths, although the two forms above cover almost every practical case that you're likely to encounter. The minimax rational function R(x) is then defined to be the function that yields the smallest maximal value of the error function. Chebyshev showed that there is a unique minimax solution for R(x) that has the following properties: * If R(x) is a polynomial of degree N, then there are N+2 unknowns: the N+1 coefficients of the polynomial, and maximal value of the error function. * The error function has N+1 roots, and N+2 extrema (minima and maxima). * The extrema alternate in sign, and all have the same magnitude. That means that if we know the location of the extrema of the error function then we can write N+2 simultaneous equations: R(x[sub i]) + (-1)[super i]E = f(x[sub i]) where E is the maximal error term, and x[sub i] are the abscissa values of the N+2 extrema of the error function. It is then trivial to solve the simultaneous equations to obtain the polynomial coefficients and the error term. ['Unfortunately we don't know where the extrema of the error function are located!] [h4 The Remez Method] The Remez method is an iterative technique which, given a broad range of assumptions, will converge on the extrema of the error function, and therefore the minimax solution. In the following discussion we'll use a concrete example to illustrate the Remez method: an approximation to the function e[super x][space] over the range \[-1, 1\]. Before we can begin the Remez method, we must obtain an initial value for the location of the extrema of the error function. We could "guess" these, but a much closer first approximation can be obtained by first constructing an interpolated polynomial approximation to f(x). In order to obtain the N+1 coefficients of the interpolated polynomial we need N+1 points (x[sub 0]...x[sub N]): with our interpolated form passing through each of those points that yields N+1 simultaneous equations: f(x[sub i]) = P(x[sub i]) = c[sub 0] + c[sub 1]x[sub i] ... + c[sub N]x[sub i][super N] Which can be solved for the coefficients c[sub 0]...c[sub N] in P(x). Obviously this is not a minimax solution, indeed our only guarantee is that f(x) and P(x) touch at N+1 locations, away from those points the error may be arbitrarily large. However, we would clearly like this initial approximation to be as close to f(x) as possible, and it turns out that using the zeros of an orthogonal polynomial as the initial interpolation points is a good choice. In our example we'll use the zeros of a Chebyshev polynomial as these are particularly easy to calculate, interpolating for a polynomial of degree 4, and measuring /relative error/ we get the following error function: [$images/remez-2.png] Which has a peak relative error of 1.2x10[super -3]. While this is a pretty good approximation already, judging by the shape of the error function we can clearly do better. Before starting on the Remez method propper, we have one more step to perform: locate all the extrema of the error function, and store these locations as our initial ['Chebyshev control points]. [note In the simple case of a polynomial approximation, by interpolating through the roots of a Chebyshev polynomial we have in fact created a ['Chebyshev approximation] to the function: in terms of /absolute error/ this is the best a priori choice for the interpolated form we can achieve, and typically is very close to the minimax solution. However, if we want to optimise for /relative error/, or if the approximation is a rational function, then the initial Chebyshev solution can be quite far from the ideal minimax solution. A more technical discussion of the theory involved can be found in this [@http://math.fullerton.edu/mathews/n2003/ChebyshevPolyMod.html online course].] [h4 Remez Step 1] The first step in the Remez method, given our current set of N+2 Chebyshev control points x[sub i], is to solve the N+2 simultaneous equations: P(x[sub i]) + (-1)[super i]E = f(x[sub i]) To obtain the error term E, and the coefficients of the polynomial P(x). This gives us a new approximation to f(x) that has the same error /E/ at each of the control points, and whose error function ['alternates in sign] at the control points. This is still not necessarily the minimax solution though: since the control points may not be at the extrema of the error function. After this first step here's what our approximation's error function looks like: [$images/remez-3.png] Clearly this is still not the minimax solution since the control points are not located at the extrema, but the maximum relative error has now dropped to 5.6x10[super -4]. [h4 Remez Step 2] The second step is to locate the extrema of the new approximation, which we do in two stages: first, since the error function changes sign at each control point, we must have N+1 roots of the error function located between each pair of N+2 control points. Once these roots are found by standard root finding techniques, we know that N extrema are bracketed between each pair of roots, plus two more between the endpoints of the range and the first and last roots. The N+2 extrema can then be found using standard function minimisation techniques. We now have a choice: multi-point exchange, or single point exchange. In single point exchange, we move the control point nearest to the largest extrema to the abscissa value of the extrema. In multi-point exchange we swap all the current control points, for the locations of the extrema. In our example we perform multi-point exchange. [h4 Iteration] The Remez method then performs steps 1 and 2 above iteratively until the control points are located at the extrema of the error function: this is then the minimax solution. For our current example, two more iterations converges on a minimax solution with a peak relative error of 5x10[super -4] and an error function that looks like: [$images/remez-4.png] [h4 Rational Approximations] If we wish to extend the Remez method to a rational approximation of the form f(x) = R(x) = P(x) / Q(x) where P(x) and Q(x) are polynomials, then we proceed as before, except that now we have N+M+2 unknowns if P(x) is of order N and Q(x) is of order M. This assumes that Q(x) is normalised so that it's leading coefficient is 1, giving N+M+1 polynomial coefficients in total, plus the error term E. The simultaneous equations to be solved are now: P(x[sub i]) / Q(x[sub i]) + (-1)[super i]E = f(x[sub i]) Evaluated at the N+M+2 control points x[sub i]. Unfortunately these equations are non-linear in the error term E: we can only solve them if we know E, and yet E is one of the unknowns! The method usually adopted to solve these equations is an iterative one: we guess the value of E, solve the equations to obtain a new value for E (as well as the polynomial coefficients), then use the new value of E as the next guess. The method is repeated until E converges on a stable value. These complications extend the running time required for the development of rational approximations quite considerably. It is often desirable to obtain a rational rather than polynomial approximation none the less: rational approximations will often match more difficult to approximate functions, to greater accuracy, and with greater efficiency, than their polynomial alternatives. For example, if we takes our previous example of an approximation to e[super x], we obtained 5x10[super -4] accuracy with an order 4 polynomial. If we move two of the unknowns into the denominator to give a pair of order 2 polynomials, and re-minimise, then the peak relative error drops to 8.7x10[super -5]. That's a 5 fold increase in accuracy, for the same number of terms overall. [h4 Practical Considerations] Most treatises on approximation theory stop at this point. However, from a practical point of view, most of the work involves finding the right approximating form, and then persuading the Remez method to converge on a solution. So far we have used a direct approximation: f(x) = R(x) But this will converge to a useful approximation only if f(x) is smooth. In addition round-off errors when evaluating the rational form mean that this will never get closer than within a few epsilon of machine precision. Therefore this form of direct approximation is often reserved for situations where we want efficiency, rather than accuracy. The first step in improving the situation is generally to split f(x) into a dominant part that we can compute accurately by another method, and a slowly changing remainder which can be approximated by a rational approximation. We might be tempted to write: f(x) = g(x) + R(x) where g(x) is the dominant part of f(x), but if f(x)\/g(x) is approximately constant over the interval of interest then: f(x) = g(x)(c + R(x)) Will yield a much better solution: here /c/ is a constant that is the approximate value of f(x)\/g(x) and R(x) is typically tiny compared to /c/. In this situation if R(x) is optimised for absolute error, then as long as its error is small compared to the constant /c/, that error will effectively get wiped out when R(x) is added to /c/. The difficult part is obviously finding the right g(x) to extract from your function: often the asymptotic behaviour of the function will give a clue, so for example the function __erfc becomes proportional to e[super -x[super 2]]\/x as x becomes large. Therefore using: erfc(z) = (C + R(x)) e[super -x[super 2]]/x as the approximating form seems like an obvious thing to try, and does indeed yield a useful approximation. However, the difficulty then becomes one of converging the minimax solution. Unfortunately, it is known that for some functions the Remez method can lead to divergent behaviour, even when the initial starting approximation is quite good. Furthermore, it is not uncommon for the solution obtained in the first Remez step above to be a bad one: the equations to be solved are generally "stiff", often very close to being singular, and assuming a solution is found at all, round-off errors and a rapidly changing error function, can lead to a situation where the error function does not in fact change sign at each control point as required. If this occurs, it is fatal to the Remez method. It is also possible to obtain solutions that are perfectly valid mathematically, but which are quite useless computationally: either because there is an unavoidable amount of roundoff error in the computation of the rational function, or because the denominator has one or more roots over the interval of the approximation. In the latter case while the approximation may have the correct limiting value at the roots, the approximation is nonetheless useless. Assuming that the approximation does not have any fatal errors, and that the only issue is converging adequately on the minimax solution, the aim is to get as close as possible to the minimax solution before beginning the Remez method. Using the zeros of a Chebyshev polynomial for the initial interpolation is a good start, but may not be ideal when dealing with relative errors and\/or rational (rather than polynomial) approximations. One approach is to skew the initial interpolation points to one end: for example if we raise the roots of the Chebyshev polynomial to a positive power greater than 1 then the roots will be skewed towards the middle of the \[-1,1\] interval, while a positive power less than one will skew them towards either end. More usefully, if we initially rescale the points over \[0,1\] and then raise to a positive power, we can skew them to the left or right. Returning to our example of e[super x][space] over \[-1,1\], the initial interpolated form was some way from the minimax solution: [$images/remez-2.png] However, if we first skew the interpolation points to the left (rescale them to \[0, 1\], raise to the power 1.3, and then rescale back to \[-1,1\]) we reduce the error from 1.3x10[super -3][space]to 6x10[super -4]: [$images/remez-5.png] It's clearly still not ideal, but it is only a few percent away from our desired minimax solution (5x10[super -4]). [h4 Remez Method Checklist] The following lists some of the things to check if the Remez method goes wrong, it is by no means an exhaustive list, but is provided in the hopes that it will prove useful. * Is the function smooth enough? Can it be better separated into a rapidly changing part, and an asymptotic part? * Does the function being approximated have any "blips" in it? Check for problems as the function changes computation method, or if a root, or an infinity has been divided out. The telltale sign is if there is a narrow region where the Remez method will not converge. * Check you have enough accuracy in your calculations: remember that the Remez method works on the difference between the approximation and the function being approximated: so you must have more digits of precision available than the precision of the approximation being constructed. So for example at double precision, you shouldn't expect to be able to get better than a float precision approximation. * Try skewing the initial interpolated approximation to minimise the error before you begin the Remez steps. * If the approximation won't converge or is ill-conditioned from one starting location, try starting from a different location. * If a rational function won't converge, one can minimise a polynomial (which presents no problems), then rotate one term from the numerator to the denominator and minimise again. In theory one can continue moving terms one at a time from numerator to denominator, and then re-minimising, retaining the last set of control points at each stage. * Try using a smaller interval. It may also be possible to optimise over one (small) interval, rescale the control points over a larger interval, and then re-minimise. * Keep abscissa values small: use a change of variable to keep the abscissa over, say \[0, b\], for some smallish value /b/. [h4 References] The original references for the Remez Method and it's extension to rational functions are unfortunately in Russian: Remez, E.Ya., ['Fundamentals of numerical methods for Chebyshev approximations], "Naukova Dumka", Kiev, 1969. Remez, E.Ya., Gavrilyuk, V.T., ['Computer development of certain approaches to the approximate construction of solutions of Chebyshev problems nonlinearly depending on parameters], Ukr. Mat. Zh. 12 (1960), 324-338. Gavrilyuk, V.T., ['Generalization of the first polynomial algorithm of E.Ya.Remez for the problem of constructing rational-fractional Chebyshev approximations], Ukr. Mat. Zh. 16 (1961), 575-585. Some English language sources include: Fraser, W., Hart, J.F., ['On the computation of rational approximations to continuous functions], Comm. of the ACM 5 (1962), 401-403, 414. Ralston, A., ['Rational Chebyshev approximation by Remes' algorithms], Numer.Math. 7 (1965), no. 4, 322-330. A. Ralston, ['Rational Chebyshev approximation, Mathematical Methods for Digital Computers v. 2] (Ralston A., Wilf H., eds.), Wiley, New York, 1967, pp. 264-284. Hart, J.F. e.a., ['Computer approximations], Wiley, New York a.o., 1968. Cody, W.J., Fraser, W., Hart, J.F., ['Rational Chebyshev approximation using linear equations], Numer.Math. 12 (1968), 242-251. Cody, W.J., ['A survey of practical rational and polynomial approximation of functions], SIAM Review 12 (1970), no. 3, 400-423. Barrar, R.B., Loeb, H.J., ['On the Remez algorithm for non-linear families], Numer.Math. 15 (1970), 382-391. Dunham, Ch.B., ['Convergence of the Fraser-Hart algorithm for rational Chebyshev approximation], Math. Comp. 29 (1975), no. 132, 1078-1082. G. L. Litvinov, ['Approximate construction of rational approximations and the effect of error autocorrection], Russian Journal of Mathematical Physics, vol.1, No. 3, 1994. [endsect][/section:remez The Remez Method] ================================================ FILE: doc/test/stub.cpp ================================================ /*============================================================================= Copyright (c) 2006 Joel de Guzman http://spirit.sourceforge.net/ Use, modification and distribution is subject to 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) =============================================================================*/ #include //[ bar //` This is the [*/bar/] function std::string bar() { // return 'em, bar man! return "bar"; } //] //[ foo /*` This is the [*['foo]] function. */ std::string foo() { // return 'em, foo man! return "foo"; } //] //[ foo_bar std::string foo_bar() /*< The /Mythical/ FooBar. See [@http://en.wikipedia.org/wiki/Foobar Foobar for details] >*/ { return "foo-bar"; /*< return 'em, foo-bar man! >*/ } //] //[ class_ class x { public: /*<< Constructor >>*/ x() : n(0) { } /*<< Destructor >>*/ ~x() { } /*<< Get the `n` member variable >>*/ int get() const { return n; /*<- this will be ignored by quickbook ->*/ } /*<< Set the `n` member variable >>*/ void set(int n_) { n = n_; } //<- this will be ignored by quickbook private: int n; //-> }; //] ================================================ FILE: doc/test/test.mml ================================================ asinh x x x 3 6 ; x < ε ================================================ FILE: doc/test/test.qbk ================================================ [article Document To Test Formatting [quickbook 1.4] [copyright 2007 John Maddock, Joel de Guzman, Eric Niebler and Matias Capeletto] [purpose Test Formatting Document] [license 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]) ] [authors [Maddock, John], [de Guzman, Joel], [Niebler, Eric], [Capeletto, Matias] ] [category math] [/last-revision $Date: 2007-05-07 10:21:52 +0100 (Mon, 07 May 2007) $] ] [include HTML4_symbols.qbk] [/ Some composite templates] [template super[x]''''''[x]''''''] [template sub[x]''''''[x]''''''] [template floor[x]'''⌊'''[x]'''⌋'''] [template floorlr[x][lfloor][x][rfloor]] [template ceil[x] '''⌈'''[x]'''⌉'''] [section Introduction] This document is purely a test case to test out HTML and PDF generation and style. This is some body text. int main() { double d = 2.345; return d; } We can count in Greek too: [alpha], [beta], [gamma]. Try some superscripts and subscripts: x[super 2], x[sub i][super 3], [alpha][super 2], [beta][super [alpha]], [floor x], [floor [alpha]], [ceil a]. [endsect] [section Code Blocks] [section Embedded code] These should be syntax highlighted: #include int main() { // Sample code std::cout << "Hello, World\n"; return 0; } [endsect] [section Code With a Very Long Line] template RealType inline foo(const RealType& a, const RealType& b, const RealType& c, const RealType& d, const RealType& e, const RealType& f, const RealType& g, const RealType& h){ return 0; } [endsect] [section Imported code and callouts] [import stub.cpp] Here's some code with left-placed callouts: [class_] And again with callouts placed exactly where we put them: [foo_bar] [endsect] [section Larger example] Now let's include a larger example, this may span several pages and should not be chopped off half way through... some FO processors get this wrong! namespace boost{ template class sub_match; typedef sub_match csub_match; typedef sub_match wcsub_match; typedef sub_match ssub_match; typedef sub_match wssub_match; template class sub_match : public std::pair { public: typedef typename iterator_traits::value_type value_type; typedef typename iterator_traits::difference_type difference_type; typedef BidirectionalIterator iterator; bool matched; difference_type length()const; operator basic_string()const; basic_string str()const; int compare(const sub_match& s)const; int compare(const basic_string& s)const; int compare(const value_type* s)const; #ifdef BOOST_REGEX_MATCH_EXTRA typedef implementation-private capture_sequence_type; const capture_sequence_type& captures()const; #endif }; // // comparisons to another sub_match: // template bool operator == (const sub_match& lhs, const sub_match& rhs); template bool operator != (const sub_match& lhs, const sub_match& rhs); template bool operator < (const sub_match& lhs, const sub_match& rhs); template bool operator <= (const sub_match& lhs, const sub_match& rhs); template bool operator >= (const sub_match& lhs, const sub_match& rhs); template bool operator > (const sub_match& lhs, const sub_match& rhs); // // comparisons to a basic_string: // template bool operator == (const std::basic_string::value_type, traits, Allocator>& lhs, const sub_match& rhs); template bool operator != (const std::basic_string::value_type, traits, Allocator>& lhs, const sub_match& rhs); template bool operator < (const std::basic_string::value_type, traits, Allocator>& lhs, const sub_match& rhs); template bool operator > (const std::basic_string::value_type, traits, Allocator>& lhs, const sub_match& rhs); template bool operator >= (const std::basic_string::value_type, traits, Allocator>& lhs, const sub_match& rhs); template bool operator <= (const std::basic_string::value_type, traits, Allocator>& lhs, const sub_match& rhs); template bool operator == (const sub_match& lhs, const std::basic_string::value_type, traits, Allocator>& rhs); template bool operator != (const sub_match& lhs, const std::basic_string::value_type, traits, Allocator>& rhs); template bool operator < (const sub_match& lhs, const std::basic_string::value_type, traits, Allocator>& rhs); template bool operator > (const sub_match& lhs, const std::basic_string::value_type, traits, Allocator>& rhs); template bool operator >= (const sub_match& lhs, const std::basic_string::value_type, traits, Allocator>& rhs); template bool operator <= (const sub_match& lhs, const std::basic_string::value_type, traits, Allocator>& rhs); // // comparisons to a pointer to a character array: // template bool operator == (typename iterator_traits::value_type const* lhs, const sub_match& rhs); template bool operator != (typename iterator_traits::value_type const* lhs, const sub_match& rhs); template bool operator < (typename iterator_traits::value_type const* lhs, const sub_match& rhs); template bool operator > (typename iterator_traits::value_type const* lhs, const sub_match& rhs); template bool operator >= (typename iterator_traits::value_type const* lhs, const sub_match& rhs); template bool operator <= (typename iterator_traits::value_type const* lhs, const sub_match& rhs); template bool operator == (const sub_match& lhs, typename iterator_traits::value_type const* rhs); template bool operator != (const sub_match& lhs, typename iterator_traits::value_type const* rhs); template bool operator < (const sub_match& lhs, typename iterator_traits::value_type const* rhs); template bool operator > (const sub_match& lhs, typename iterator_traits::value_type const* rhs); template bool operator >= (const sub_match& lhs, typename iterator_traits::value_type const* rhs); template bool operator <= (const sub_match& lhs, typename iterator_traits::value_type const* rhs); // // comparisons to a single character: // template bool operator == (typename iterator_traits::value_type const& lhs, const sub_match& rhs); template bool operator != (typename iterator_traits::value_type const& lhs, const sub_match& rhs); template bool operator < (typename iterator_traits::value_type const& lhs, const sub_match& rhs); template bool operator > (typename iterator_traits::value_type const& lhs, const sub_match& rhs); template bool operator >= (typename iterator_traits::value_type const& lhs, const sub_match& rhs); template bool operator <= (typename iterator_traits::value_type const& lhs, const sub_match& rhs); template bool operator == (const sub_match& lhs, typename iterator_traits::value_type const& rhs); template bool operator != (const sub_match& lhs, typename iterator_traits::value_type const& rhs); template bool operator < (const sub_match& lhs, typename iterator_traits::value_type const& rhs); template bool operator > (const sub_match& lhs, typename iterator_traits::value_type const& rhs); template bool operator >= (const sub_match& lhs, typename iterator_traits::value_type const& rhs); template bool operator <= (const sub_match& lhs, typename iterator_traits::value_type const& rhs); // // addition operators: // template std::basic_string::value_type, traits, Allocator> operator + (const std::basic_string::value_type, traits, Allocator>& s, const sub_match& m); template std::basic_string::value_type, traits, Allocator> operator + (const sub_match& m, const std::basic_string::value_type, traits, Allocator>& s); template std::basic_string::value_type> operator + (typename iterator_traits::value_type const* s, const sub_match& m); template std::basic_string::value_type> operator + (const sub_match& m, typename iterator_traits::value_type const * s); template std::basic_string::value_type> operator + (typename iterator_traits::value_type const& s, const sub_match& m); template std::basic_string::value_type> operator + (const sub_match& m, typename iterator_traits::value_type const& s); template std::basic_string::value_type> operator + (const sub_match& m1, const sub_match& m2); // // stream inserter: // template basic_ostream& operator << (basic_ostream& os, const sub_match& m); } // namespace boost [endsect] [endsect] [section Basic Formatting] [section Font Styles] Here we go with some inline formatting: ['italic], [*bold], [_underline], [^teletype], [-strikethrough], we can combine styles as well: ['[*bold italic]], [_[^teletype with underline]]. [endsect] [section Replaceable Text] Text that is intended to be user-replaceable is [~rendered like this]. [endsect] [section Quotations] Here we go: ["A question that sometimes drives me hazy: am I or are the others crazy?]--Einstein Note the proper left and right quote marks. Also, while you can simply use ordinary quote marks like "quoted", our quotation, above, will generate correct DocBook quotations (e.g. quoted). Like all phrase elements, quotations may be nested. Example: ["Here's the rule for bargains: ["Do other men, for they would do you.] That's the true business precept.] [endsect] [section Inline Code] This text has inlined code `int main() { return 0; }` in it. The code should be syntax highlighted. [endsect] [section Links] Try this: [@http://www.boost.org this is [*boost's] website....] it should be visible as a link. This is [@../../../boost/math/distributions.hpp a link to a header file (boost/math/distributions.hpp)], it should be rewritable and point to the website when built as a PDF. This is [@boost:libs/regex/index.html a link to another library's documentation (Boost.Regex)], using the boost: protocol, it should be rewritten to point to the website when building a PDF. This is [@boost:/libs/regex/index.html a link to another library's documentation (Boost.Regex)], using the boost:/ protocol, it should be rewritten to point to the website when building a PDF. This is [@../weighted_tail_quantile.hpp a relative link to a header file within the test source], it should be rewritten to point to the website when building a PDF. Although it might be on the website yet. [endsect] [section Footnotes] Here's one [footnote A sample footnote]. And here's another [footnote Another sample footnote]. [endsect] [section Blockquote] Lets indent the next paragraph: [:Here we go!!!] [endsect] [section Headings] Now try rendering some heading styles: [h1 Heading 1] [h2 Heading 2] [h3 Heading 3] [h4 Heading 4] [h5 Heading 5] [h6 Heading 6] [endsect] [endsect] [section Blurbs] [section Preformatted text] Here's some sample program output: [pre '''F test for equal standard deviations ____________________________________ Sample 1: Number of Observations = 240 Sample Standard Deviation = 65.549 Sample 2: Number of Observations = 240 Sample Standard Deviation = 61.854 Test Statistic = 1.123 CDF of test statistic: = 8.148e-001 Upper Critical Value at alpha: = 1.238e+000 Upper Critical Value at alpha/2: = 1.289e+000 Lower Critical Value at alpha: = 8.080e-001 Lower Critical Value at alpha/2: = 7.756e-001 Results for Alternative Hypothesis and alpha = 0.0500 Alternative Hypothesis Conclusion Standard deviations are unequal (two sided test) REJECTED Standard deviation 1 is less than standard deviation 2 REJECTED Standard deviation 1 is greater than standard deviation 2 REJECTED''' ] [endsect] [section Admonishments] There are four admonishments supported by Docbook XML: [note This is a note] [tip This is a tip] [important This is important] [caution This is a caution] [warning This is a warning They can contain more than one paragraph. ] [endsect] [section Blurbs] [blurb [*An eye catching advertisement or note...] These should be rendered in a manner similar to admonishments. They can contain more than one paragraph. ] [endsect] [endsect] [section Lists and Tables] [section Lists] A numbered list: # One # Two # Three # Three.a # Three.b # Three.c # Four # Four.a # Four.a.i # Four.a.ii # Five An unordered list: * First * Second * Third A mixture of the two: # 1 * 1.a # 1.a.1 # 1.a.2 * 1.b # 2 * 2.a * 2.b # 2.b.1 # 2.b.2 * 2.b.2.a * 2.b.2.b [endsect] [section Variable Lists] [variablelist A Variable List [[term 1] [The definition of term 1]] [[term 2] [The definition of term 2]] [[term 3] [The definition of term 3]] ] [endsect] [section Tables] Here's a big table with code and other tricky things: [table Notes on the Implementation of the Beta Distribution [[Function][Implementation Notes]] [[pdf] [f(x;[alpha],[beta]) = x[super[alpha] - 1] (1 - x)[super[beta] -1] / B([alpha], [beta]) Implemented using ibeta_derivative(a, b, x).]] [[cdf][Using the incomplete beta function ibeta(a, b, x)]] [[cdf complement][ibetac(a, b, x)]] [[quantile][Using the inverse incomplete beta function ibeta_inv(a, b, p)]] [[quantile from the complement][ibetac_inv(a, b, q)]] [[mean][`a/(a+b)`]] [[variance][`a * b / (a+b)^2 * (a + b + 1)`]] [[mode][`(a-1) / (a + b + 2)`]] [[skewness][`2 (b-a) sqrt(a+b+1)/(a+b+2) * sqrt(a * b)`]] [[kurtosis excess][ [$images/beta_dist_kurtosis.png] ]] [[kurtosis][`kurtosis + 3`]] [[parameter estimation][ ]] [[alpha from mean and variance][`mean * (( (mean * (1 - mean)) / variance)- 1)`]] [[beta from mean and variance][`(1 - mean) * (((mean * (1 - mean)) /variance)-1)`]] [[The member functions `estimate_alpha` and `estimate_beta` from cdf and probability x and *either* `alpha` or `beta`] [Implemented in terms of the inverse incomplete beta functions ibeta_inva, and ibeta_invb respectively.]] [[`estimate_alpha`][`ibeta_inva(beta, x, probability)`]] [[`estimate_beta`][`ibeta_invb(alpha, x, probability)`]] ] [endsect] [endsect] [section Images] These are tricky enough that they warrant their own section. Let's start with a PNG file that's set to 120dpi, it should render at a sensible size in both html and PDF forms. It should print OK too! [$images/digamma3.png] Now try again with a sample SVG image: [$images/open_clipart_library_logo.svg] [endsect] [section Equations] This page is largely to test equation handling in various browsers, unfortunately none of this works as well as it should (or at all?) in Internet Explorer.... This equation is formatted from Latex text: '''ax^2 + bx + c = 0''' This equation is formed from MathML: '''''' This equation is SVG: '''''' [endsect] [include test_HTML4_symbols.qbk] [include remez.qbk] [section:array Array Example Boostbook XML Documentation] [xinclude array.xml] [xinclude array1.xml] [xinclude array2.xml] [xinclude array3.xml] [xinclude array4.xml] [endsect] [section:accumulators Accumulators Example Doxygen Documentation] [xinclude statsdoc.xml] [endsect] ================================================ FILE: doc/test/test_HTML4_symbols.qbk ================================================ [section:test test HTML4 symbols] [/ Examples of using all the Greek and Math symbols defined in HTML4_symbols.qbk] [/ See http://www.htmlhelp.com/reference/html40/entities/symbols.html] [/ Also some miscellaneous math characters added to this list - see the end.] [/ To use, enclose the template name in square brackets.] [section test Greek and Math symbols] [fnof], [Alpha], [Beta], [Gamma], [Delta], [Epsilon], [Zeta], [Eta], [Theta], [Iota], [Kappa], [Lambda], [Mu], [Nu], [Xi], [Omicron], [Pi], [Rho], [Sigma], [Tau], [Upsilon], [Phi], [Chi], [Psi], [Omega], [alpha], [beta], [gamma], [delta], [epsilon], [zeta], [eta], [theta], [iota], [kappa], [lambda], [mu], [nu], [xi], [omicron], [pi], [rho], [sigmaf], [sigma], [tau], [upsilon], [phi], [chi], [psi], [omega], [thetasym], [upsih], [piv], [bull], [hellip], [prime], [Prime], [oline], [frasl], [weierp], [image], [real], [trade], [alefsym], [larr], [uarr], [rarr], [darr], [harr], [crarr], [lArr], [uArr], [rArr], [dArr], [hArr], [forall], [part], [exist], [empty], [nabla], [isin], [notin], [ni], [prod], [sum], [minus], [lowast], [radic], [prop], [infin], [ang], [and], [or], [cap], [cup], [int], [there4], [sim], [cong], [asymp], [ne], [equiv], [le], [ge], [subset], [superset], [nsubset], [sube], [supe], [oplus], [otimes], [perp], [sdot], [lceil], [rceil], [lfloor], [rfloor], [lang], [rang], [loz], [spades], [clubs], [hearts], [diams] [endsect] [section test Latin1 symbols] [/ Examples of using all the symbols defined in Latin1_symbols.qbk] [/ http://www.htmlhelp.com/reference/html40/entities/latin1.html ] [/ To use, enclose the template name in square brackets.] [nbsp], [iexcl], [cent], [pound], [curren], [yen], [brvbar], [sectsign], [uml], [copy], [ordf], [laquo], [not], [shy], [reg], [macron], [deg], [plusmn], [sup2], [cubed], [acute], [micro], [para], [middot], [cedil], [sup1], [ordm], [raquo], [frac14], [frac12], [frac34], [iquest], [Agrave], [Aacute], [Acirc], [Atilde], [Auml], [Aring], [AElig], [Ccedil], [Egrave], [Eacute], [Ecirc], [Euml], [Igrave], [Iacute], [Icirc], [Iuml], [ETH], [Ntilde], [Ograve], [Oacute], [Ocirc], [Otilde], [Ouml], [times], [Oslash], [Ugrave], [Uacute], [Ucirc], [Uuml], [Yacute], [THORN], [szlig], [agrave], [aacute], [acirc], [atilde], [auml], [aring], [aelig], [ccedil], [egrave], [eacute], [ecirc], [euml], [igrave], [iacute], [icirc], [iuml], [eth], [ntilde], [ograve], [oacute], [ocirc], [otilde], [ouml], [divide], [oslash], [ugrave], [uacute], [ucirc], [uuml], [yacute], [thorn], [yuml], [endsect] [endsect] [/ testsymbols.qbk Copyright 2006 John Maddock and Paul A. Bristow. 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). ] ================================================ FILE: doc/test/weighted_tail_quantile.hpp ================================================ /////////////////////////////////////////////////////////////////////////////// // weighted_tail_quantile.hpp // // Copyright 2006 Daniel Egloff, Olivier Gygi. 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) #ifndef BOOST_ACCUMULATORS_STATISTICS_WEIGHTED_TAIL_QUANTILE_HPP_DE_01_01_2006 #define BOOST_ACCUMULATORS_STATISTICS_WEIGHTED_TAIL_QUANTILE_HPP_DE_01_01_2006 #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #ifdef _MSC_VER # pragma warning(push) # pragma warning(disable: 4127) // conditional expression is constant #endif namespace boost { namespace accumulators { namespace impl { /////////////////////////////////////////////////////////////////////////////// // weighted_tail_quantile_impl // Tail quantile estimation based on order statistics of weighted samples /** @brief Tail quantile estimation based on order statistics of weighted samples (for both left and right tails) An estimator \f$\hat{q}\f$ of tail quantiles with level \f$\alpha\f$ based on order statistics \f$X_{1:n} \leq X_{2:n} \leq\dots\leq X_{n:n}\f$ of weighted samples are given by \f$X_{\lambda:n}\f$ (left tail) and \f$X_{\rho:n}\f$ (right tail), where \f[ \lambda = \inf\left\{ l \left| \frac{1}{\bar{w}_n}\sum_{i=1}^{l} w_i \geq \alpha \right. \right\} \f] and \f[ \rho = \sup\left\{ r \left| \frac{1}{\bar{w}_n}\sum_{i=r}^{n} w_i \geq (1 - \alpha) \right. \right\}, \f] \f$n\f$ being the number of samples and \f$\bar{w}_n\f$ the sum of all weights. @param quantile_probability */ template struct weighted_tail_quantile_impl : accumulator_base { typedef typename numeric::functional::average::result_type float_type; // for boost::result_of typedef Sample result_type; weighted_tail_quantile_impl(dont_care) {} template result_type result(Args const &args) const { float_type threshold = sum_of_weights(args) * ( ( is_same::value ) ? args[quantile_probability] : 1. - args[quantile_probability] ); std::size_t n = 0; Weight sum = Weight(0); while (sum < threshold) { if (n < static_cast(tail_weights(args).size())) { sum += *(tail_weights(args).begin() + n); n++; } else { if (std::numeric_limits::has_quiet_NaN) { return std::numeric_limits::quiet_NaN(); } else { std::ostringstream msg; msg << "index n = " << n << " is not in valid range [0, " << tail(args).size() << ")"; boost::throw_exception(std::runtime_error(msg.str())); return Sample(0); } } } // Note that the cached samples of the left are sorted in ascending order, // whereas the samples of the right tail are sorted in descending order return *(boost::begin(tail(args)) + n - 1); } }; } // namespace impl /////////////////////////////////////////////////////////////////////////////// // tag::weighted_tail_quantile<> // namespace tag { template struct weighted_tail_quantile : depends_on > { /// INTERNAL ONLY typedef accumulators::impl::weighted_tail_quantile_impl impl; }; } /////////////////////////////////////////////////////////////////////////////// // extract::weighted_tail_quantile // namespace extract { extractor const weighted_tail_quantile = {}; } using extract::weighted_tail_quantile; }} // namespace boost::accumulators #ifdef _MSC_VER # pragma warning(pop) #endif #endif ================================================ FILE: index.htm ================================================ Automatic redirection failed, please go to index.html. ================================================ FILE: index.html ================================================ Boost C++ Libraries
boost.png (6897 bytes)

{{#is_develop}}Development Snapshot{{/is_develop}} {{^is_develop}}Release {{version}}{{/is_develop}}

Getting Started      Libraries      Tools      Web Site      News      Community      FAQ      More Info

Welcome to the Boost C++ Libraries

Boost provides free peer-reviewed portable C++ source libraries.

We emphasize libraries that work well with the C++ Standard Library. Boost libraries are intended to be widely useful, and usable across a broad spectrum of applications. The Boost license encourages both commercial and non-commercial use.

We aim to establish "existing practice" and provide reference implementations so that Boost libraries are suitable for eventual standardization. Ten Boost libraries are already included in the C++ Standards Committee's Library Technical Report (TR1) and will be included in the upcoming revision of the C++ Standard. More Boost libraries are proposed for the upcoming TR2.

Changes in this release

{{#unreleased_lib_count}}

{{#is_develop}}This development snapshot{{/is_develop}} {{^is_develop}}Boost {{minor_release}}{{/is_develop}} includes {{unreleased_lib_count}} new {{#unreleased_library_plural}}libraries{{/unreleased_library_plural}} {{^unreleased_library_plural}}library{{/unreleased_library_plural}} ({{#unreleased_libs}}{{#index}}, {{/index}}{{name}}{{/unreleased_libs}}) as well as updates to many existing libraries. {{/unreleased_lib_count}} {{^unreleased_lib_count}}

The release includes updates to many existing libraries. {{/unreleased_lib_count}} See Release History for more information.

Getting Started

If Boost hasn't already been installed on your system, follow the Getting Started Guide to complete the installation. But if you've reached to this point by installing Boost from a Windows pre-build executable or a pre-built Linux and Unix distribution package, that's already been completed. Likewise, if you're reading this on your organization's internal web server, the installation is probably already complete.

Contents

The release directory tree contains almost all of Boost; documentation, sources, headers, scripts, tools, and everything else a Boost user might need!

Library Documentation

The starting point for the documentation of individual libraries is the Libraries page, which gives a brief description of each library and links to its documentation.

Web Site

Some general interest or often changing Boost information lives only on the Boost web site. The release contains links to the site, so while browsing it you'll see occasional broken links if you aren't connected to the Internet. But everything needed to use the Boost libraries is contained within the release.

Background

Read the introductory material to help you understand what Boost is about and to help in educating your organization about Boost.

Community

Boost welcomes and thrives on participation from a variety of individuals and organizations. Many avenues for participation are available in the Boost Community.

================================================ FILE: libs/Jamfile.v2 ================================================ # Jamfile.v2 # # Copyright (C) 2013 Bjorn Roald # # Distributed under the Boost Software License, Version 1.0. # See www.boost.org/LICENSE_1_0.txt # # Boost libraries common project properties: # # Under modularized layout, ensure all inheriting projects get # implicit dependency to headers staged as links in /boost project boost/libs : requirements /boost//headers ; ================================================ FILE: libs/index.html ================================================ Automatic redirection failed, please go to libraries.htm.

Copyright Beman Dawes, 2001

Distributed under the Boost Software License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at www.boost.org/LICENSE_1_0.txt)

================================================ FILE: libs/libraries.htm ================================================ {{! This is a template for the library list. See the generated file at: http://www.boost.org/doc/libs/develop/libs/libraries.htm }} Boost Libraries
boost.png (6897 bytes) Libraries
Getting Started         Tools         Web Site         News         Community         FAQ         More Info
Libraries Listed Alphabetically
Libraries Listed by Category
{{#categorized}}
{{title}}
{{/categorized}}
Libraries Retired from Boost

See Getting Started page to find out how to download, build, and install the libraries.


Libraries Listed Alphabetically

    {{#alphabetic}}
  • {{name}} - {{description}}{{#authors}}, from {{authors}}{{/authors}}
  • {{/alphabetic}}

Libraries Listed by Category

{{#categorized}}

{{title}}

    {{#libraries}}
  • {{name}} - {{description}}{{#authors}}, from {{authors}}{{/authors}}
  • {{/libraries}}
{{/categorized}}

[Category suggestions from Aleksey Gurtovoy, Beman Dawes and Vicente J. Botet Escribá]


Libraries Retired from Boost

  • compose - Functional composition adapters for the STL, from Nicolai Josuttis. Removed in Boost version 1.32. Please use Bind or Lambda instead.
  • signals (v1) - Managed signals and slots callback implementation, from Doug Gregor. Removed in Boost version 1.69. Please use Signals2 instead.

Revised 19 Feb 2015

© Copyright Beman Dawes 2000-2004

Distributed under the Boost Software License, Version 1.0. (See file LICENSE_1_0.txt or www.boost.org/LICENSE_1_0.txt)

================================================ FILE: libs/maintainers.txt ================================================ # Copyright (C) 2005, 2007 Douglas Gregor # Distributed under the Boost Software License, Version 1.0. # See www.boost.org/LICENSE_1_0.txt # # This file lists the names and e-mail addresses of the maintainers # of each Boost library, and is used by the regression-reporting # scripts to direct e-mail related to those libraries to the # maintainers. # # This file is automatically updated from library metadata. accumulators Eric Niebler algorithm Marshall Clow algorithm/minmax Marshall Clow algorithm/string Marshall Clow align Glen Fernandes any Antony Polukhin array Marshall Clow asio Chris Kohlhoff assert Peter Dimov assign Thorsten Ottosen atomic Helge Bahmann , Tim Blechmann , Andrey Semashev beast Vinnie Falco bimap Matias Capeletto bind Peter Dimov callable_traits Barrett Adair charconv Matt Borland chrono Vicente J. Botet Escriba chrono/stopwatch Vicente J. Botet Escriba circular_buffer Jan Gaspar cobalt Klemens Morgenstern compat Peter Dimov compute Kyle Lutz concept_check Jeremy Siek config John Maddock container Ion Gaztanaga container_hash Peter Dimov context Oliver Kowalke contract Lorenzo Caminiti conversion Antony Polukhin convert Vladimir Batov core Peter Dimov , Glen Fernandes , Andrey Semashev coroutine Oliver Kowalke coroutine2 Oliver Kowalke crc Daryle Walker date_time Jeff Garland , James E. King III describe Peter Dimov detail Robert Ramey , Rene Rivera , Andrey Semashev disjoint_sets Jeremy Siek dll Antony Polukhin dynamic_bitset Jeremy Siek endian Peter Dimov exception Emil Dotchevski fiber Oliver Kowalke filesystem Andrey Semashev flyweight Joaquin M Lopez Munoz foreach Eric Niebler format Samuel Krempp , James E. King III function Peter Dimov function_types Tobias Schwinger functional functional/factory Glen Fernandes , Tobias Schwinger functional/forward Tobias Schwinger functional/hash Daniel James functional/overloaded_function Lorenzo Caminiti fusion Joel de Guzman , Dan Marsden , Tobias Schwinger geometry Barend Gehrels , Bruno Lalande , Mateusz Loskot , Adam Wulkiewicz , Vissarion Fisikopoulos geometry/extensions Barend Gehrels , Bruno Lalande , Mateusz Loskot , Adam Wulkiewicz geometry/index Barend Gehrels , Bruno Lalande , Mateusz Loskot , Adam Wulkiewicz , Vissarion Fisikopoulos gil Stefan Seefeld , Mateusz Loskot , Pranam Lashkari graph Jeremy W. Murphy graph_parallel K. Noel Belcourt hana Louis Dionne heap Tim Blechmann histogram Hans Dembinski hof Paul Fultz II icl Joachim Faulhaber integer Daryle Walker , Andrey Semashev interprocess Ion Gaztanaga intrusive Ion Gaztanaga io Glen Fernandes iostreams Jonathan Turkanis iterator David Abrahams , Thomas Witt , Jeffrey Lee Hellrung Jr. iterator_facade Zach Laine json Vinnie Falco lambda Jaakko Jarvi lambda2 Peter Dimov leaf Emil Dotchevski lexical_cast Antony Polukhin local_function Lorenzo Caminiti locale Artyom Beilis , Alexander Grund lockfree Tim Blechmann log Andrey Semashev logic Douglas Gregor math John Maddock , Chris Kormanyos , Nick Thompson , Matt Borland metaparse Abel Sinkovics move Ion Gaztanaga mp11 Peter Dimov mpi K. Noel Belcourt , Alain Miniussi mpl Aleksey Gurtovoy msm Christophe Henry multi_array Ronald Garcia multi_index Joaquin M Lopez Munoz multiprecision John Maddock , christopher Kormanyos mysql Rubén Pérez nowide Alexander Grund numeric/conversion Fernando Cacciola , Brandon Kohn numeric/interval Sylvain Pion , Herve Bronnimann , Guillaume Melquiond numeric/odeint Karsten Ahnert , Mario Mulansky , Matt Borland , Nick Thompson numeric/ublas David Bellot , Stefan Seefeld operators Daniel Frey optional Fernando Cacciola , Andrzej Krzemienski outcome Niall Douglas parameter David Abrahams , Daniel Wallin parameter_python David Abrahams , Daniel Wallin pfr Antony Polukhin phoenix Joel de Guzman , Thomas Heller , John Fletcher poly_collection Joaquin M Lopez Munoz polygon Lucanus Simonson , Andrii Sydorchuk pool Stephen Cleary predef René Ferdinand Rivera Morell preprocessor Paul Mensonides , Edward Diener process Klemens D. Morgenstern program_options Vladimir Prus property_map Douglas Gregor property_map_parallel Douglas Gregor property_tree Richard Hodges proto Eric Niebler ptr_container Thorsten Ottosen python Stefan Seefeld qvm Emil Dotchevski random Steven Watanabe , Matt Borland range Neil Groves , Nathan Ridge ratio Vicente J. Botet Escriba rational Jonathan Turkanis redis Marcelo Zimbres Silva regex John Maddock safe_numerics Robert Ramey scope Andrey Semashev scope_exit Alexander Nasonov , Lorenzo Caminiti serialization Robert Ramey signals Douglas Gregor signals2 Frank Mori Hess smart_ptr Peter Dimov smart_ptr/make_shared Glen Fernandes sort Steven Ross spirit Joel de Guzman , Hartmut Kaiser spirit/classic Joel de Guzman , Hartmut Kaiser spirit/repository Joel de Guzman , Hartmut Kaiser stacktrace Antony Polukhin statechart Andreas Huber static_assert John Maddock static_string Krystian Stasiowski , Alan de Freitas , Vinnie Falco stl_interfaces Zach Laine system Peter Dimov test Gennadiy Rozental , Raffi Enficiaud , Matt Borland thread Vicente J. Botet Escriba throw_exception Emil Dotchevski , Peter Dimov timer Peter Dimov tokenizer John R. Bandela tr1 John Maddock tti Edward Diener tuple Jaakko Jarvi type_erasure Steven Watanabe type_index Antony Polukhin type_traits John Maddock typeof Arkadiy Vertleyb , Peder Holt units Jürgen Hunold , Steven Watanabe unordered Christian Mazakas , Joaquín M López Muñoz url Vinnie Falco , Alan de Freitas utility utility/enable_if Jaakko Jarvi , Jeremiah Willcock utility/identity_type Lorenzo Caminiti utility/ostream_string Glen Fernandes utility/result_of Daniel Walker utility/string_ref Marshall Clow utility/string_view Marshall Clow utility/swap Joseph Gauterin uuid Andy Tompkins , James E. King III variant Antony Polukhin , Eric Friedman variant2 Peter Dimov vmd Edward Diener wave Hartmut Kaiser winapi Andrey Semashev xpressive Eric Niebler yap Zach Laine ================================================ FILE: libs/numeric/doc/build.jam ================================================ # Copyright (c) 2016 Rene Rivera # # 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) ############################################################################### alias boostdoc ; explicit boostdoc ; alias boostrelease : ../conversion/doc//standalone ../odeint/doc//standalone ; explicit boostrelease ; ================================================ FILE: libs/numeric/index.html ================================================ Automatic redirection failed, please go to ublas/doc/index.html

Copyright Beman Dawes, 2001

Distributed under the Boost Software License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at www.boost.org/LICENSE_1_0.txt)

================================================ FILE: libs/numeric/sublibs ================================================ The existance of this file tells the regression reporting programs that the directory contains sub-directories which are libraries. ================================================ FILE: libs/platform_maintainers.txt ================================================ # Copyright (C) 2005, 2007 Douglas Gregor # Distributed under the Boost Software License, Version 1.0. # See www.boost.org/LICENSE_1_0.txt # # This file lists the names and e-mail addresses of the maintainers # of each Boost testing platform , and is used by the regression- # reporting scripts to direct e-mail related to those platforms to the # maintainers. When making changes to this file, please be careful # to closely follow the format of the library. # # The format of each line is: # # Runner Platform Email addresses Sandia-darwin-intel darwin-4.0.1 Noel Belcourt Sandia-darwin-ppc darwin-4.0.1 Noel Belcourt Sandia-intel intel-linux-8.1 Noel Belcourt Sandia-intel intel-linux-9.0 Noel Belcourt Sandia-intel intel-linux-9.1 Noel Belcourt Sandia-gcc gcc-4.2.1 Noel Belcourt Sandia-gcc gcc-3.4.3 Noel Belcourt Sandia-gcc gcc-4.0.1 Noel Belcourt Sandia-gcc-64 gcc-4.2.1 Noel Belcourt Sandia-gcc-64 gcc-4.1.1 Noel Belcourt Sandia-sun gcc-3.4.6 Noel Belcourt Sandia-sun sun-5.7 Noel Belcourt Sandia-sun sun-5.8 Noel Belcourt Sandia-sun sun-5.9 Noel Belcourt "Martin Wille x86_64" gcc-4.2.1_linux_x86_64 Martin Wille "Martin Wille x86_64" gcc-3.4.6_linux_x86_64 Martin Wille Huang-WinXP-x86_32 intel-vc8-win-10.0 Sean Huang Huang-WinXP-x86_32 msvc-8.0 Sean Huang Huang-Vista-x64 msvc-8.0_64 Sean Huang Huang-Vista-x64 intel-vc8-win-10.0_x86_64 Sean Huang Huang-Vista-x64 msvc-8.0_x86_64 Sean Huang IBM_Canada_Ltd vacpp Chris Cambly RW_WinXP_VC msvc-7.1 Richard Webb RW_WinXP_VC msvc-9.0 Richard Webb ================================================ FILE: rst.css ================================================ @import url("doc/src/boostbook.css"); @import url("doc/src/docutils.css"); /* Copyright David Abrahams 2006. 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) */ dl.docutils dt { font-weight: bold } img.boost-logo { border: none; vertical-align: middle } pre.literal-block span.concept { font-style: italic; } .nav { display: inline; list-style-type: none; } .prevpage { padding-top: -5px; text-align: left; float: left; } .nextpage { padding-top: -20px; text-align: right; float: right; } div.small { font-size: smaller } h2 a { font-size: 90%; } h3 a { font-size: 80%; } h4 a { font-size: 70%; } h5 a { font-size: 60%; } dl,table { text-align: left; font-size: 10pt; line-height: 1.15; } /*============================================================================= Tables =============================================================================*/ /* The only clue docutils gives us that tables are logically tables, and not, e.g., footnotes, is that they have border="1". Therefore we're keying off of that. We used to manually patch docutils to add a "table" class to all logical tables, but that proved much too fragile. */ table[border="1"] { width: 92%; margin-left: 4%; margin-right: 4%; } table[border="1"] { padding: 4px; } /* Table Cells */ table[border="1"] tr td { padding: 0.5em; text-align: left; font-size: 9pt; } table[border="1"] tr th { padding: 0.5em 0.5em 0.5em 0.5em; border: 1pt solid white; font-size: 80%; } @media screen { /* Tables */ table[border="1"] tr td { border: 1px solid #DCDCDC; } table[border="1"] tr th { background-color: #F0F0F0; border: 1px solid #DCDCDC; } pre, .screen { border: 1px solid #DCDCDC; } td pre td .screen { border: 0px } .sidebar pre { border: 0px } } pre, .screen { font-size: 9pt; display: block; margin: 1pc 4% 0pc 4%; padding: 0.5pc 0.5pc 0.5pc 0.5pc; } /* Program listings in tables don't get borders */ td pre, td .screen { margin: 0pc 0pc 0pc 0pc; padding: 0pc 0pc 0pc 0pc; } ================================================ FILE: status/Jamfile.v2 ================================================ # Copyright 2002. Dave Abrahams # Copyright 2016-2018. Rene Rivera # 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) # This build project manages running the tests for all of Boost. # The tests to run are discovered from the structure of the libs tree. # # Usage: # # > cd boost-root/status # > b2 [--check-libs-only] [--limit-tests=/lib-name-regex../]* [--exclude-tests=/lib-name-regex../]* # # --check-libs-only # Only runs the library conformance tests. # # --no-check-libs # Do not run the library conformance tests. # # --limit-tests, or --include-tests # Only runs the tests for whom the name matches the regex. # The value for the argument is a comma separated list of simple # regular expressions to check against the names of all the libraries. # If any one regex matches the matching library is tested. # # --exclude-tests # Only runs the tests for whom the names does not match the regex. # The argument is the same as for the limit-tests option except # that the result is that libraries for whom the name matches # are not tested. # # The test filters are evaluated in the order given in the command # and can be used to selectively narrow or widen the set of libraries # tested. # # Examples: # # > b2 --check-libs-only --include-tests=predef,config # # Runs the library conformance tests for the predef and config # libraries only. # # > b2 --include-tests=[n-t] --exclude-tests=rat --limit-tests=[v-w] # # Runs all the tests for library names that begin with "n" through "t", # or "v" through "w", but not libraries that start with "rat". project status : source-location $(BOOST_ROOT) : requirements true ; import testing ; import modules ; import project ; import regex ; import modules ; import path ; import feature ; import numbers ; import python ; local check-libs-only = [ MATCH "^--(check-libs-only)" : [ modules.peek : ARGV ] ] ; local no-check-libs = [ MATCH "^--(no-check-libs)$" : [ modules.peek : ARGV ] ] ; local check-libs-only-targets = ; local libraries = ; local rule run-tests ( root : tests * ) { local filter-args = [ MATCH "^--(limit|exclude|include)-tests=(.*)" : [ modules.peek : ARGV ] ] ; local filter-tests ; while $(filter-args) { local type = $(filter-args[1]) ; for local test in [ regex.split-list $(filter-args[2]) : "[,]" ] { filter-tests += $(type) $(test) ; } filter-args = $(filter-args[3-]) ; } # If any filter is given we make the initial set of tested libraries we: # (a) make it empty if the first filter is an include. # (b) make it full otherwise. local include-default = y ; if $(filter-tests[1]) && ( $(filter-tests[1]) in limit include ) { include-default = n ; } local location = [ project.attribute $(__name__) location ] ; # We only run the check library test when host-os == target-os. # Hence we need that information. local host-os-default = [ feature.defaults ] ; for local test in $(tests) { local library = [ path.parent $(test) ] ; if $(library) = "." { library = $(test) ; } local include-test = $(include-default) ; local t = 1 ; local f = 2 ; while $(filter-tests[$(f)]) { if [ MATCH "^($(filter-tests[$(f)]))" : $(test) ] { if $(filter-tests[$(t)]) = exclude { include-test = n ; } else { include-test = y ; } } t = [ CALC $(t) + 2 ] ; f = [ CALC $(f) + 2 ] ; } if $(include-test) = y { if [ path.exists ../$(root)/$(test) ] { use-project /boost/$(test) : ../$(root)/$(test) ; } if $(root) = libs && ! $(no-check-libs) && ( ! ( $(library) in $(libraries) ) ) { libraries += $(library) ; local test_module = [ project.find ../$(root)/$(test) : $(location) ] ; modules.poke $(test_module) : __LIBRARY__ : $(root)/$(library) ; modules.poke $(test_module) : __JAMFILE__ : [ modules.peek project : JAMFILE ] ; modules.poke $(test_module) : __REQUIRE__ : $(host-os-default:G=) ; project.push-current [ project.target $(test_module) ] ; module $(test_module) { import testing ; testing.make-test run-pyd : $(BOOST_ROOT)/status/boost_check_library.py : $(BOOST_ROOT)/status --boost-root=\"$(BOOST_ROOT)\" --library=$(__LIBRARY__) --jamfile=\"$(__JAMFILE__:J=;)\" organization $(__REQUIRE__) : __boost_check_library__ ; } project.pop-current ; check-libs-only-targets += ../$(root)/$(test)//__boost_check_library__ ; } if ! $(check-libs-only) { build-project ../$(root)/$(test) ; } } } } local rule find-targets ( target : libs * ) { local result = ; for local lib in $(libs) { local path = $(lib)/test ; local project = [ project.load $(path) ] ; local pt = [ project.target $(project) ] ; local mt = [ $(pt).main-target $(target) ] ; if $(mt) { result += $(path)//$(target) ; } } return $(result) ; } local libs-to-test = ; for local libdir in [ path.glob $(BOOST_ROOT) : libs/* ] { local jamfile = [ modules.peek project : JAMFILE ] ; local jamfiles = [ path.glob [ path.join $(libdir) test ] : $(jamfile) ] ; if $(jamfiles) { libs-to-test += $(libdir:B) ; } if [ path.glob $(libdir) : sublibs ] { jamfiles = [ path.glob $(libdir) : */test/$(jamfile) ] ; for local sublib_jamfile in $(jamfiles) { local sublibdir = [ path.parent [ path.parent $(sublib_jamfile) ] ] ; local sublib = $(libdir:B)/$(sublibdir:B) ; libs-to-test += $(sublib) ; } } } libs-to-test = [ SORT $(libs-to-test) ] ; run-tests libs : $(libs-to-test)/test ; # Tests from Jamfiles in tools/ # Please keep these in alphabetical order local tools-to-test = ; for local tooldir in bcp check_build quickbook { local jamfile = [ modules.peek project : JAMFILE ] ; local jamfiles = [ path.glob [ path.join $(BOOST_ROOT) tools $(tooldir) test ] : $(jamfile) ] ; if $(jamfiles) { tools-to-test += $(tooldir) ; } } #ECHO "tools-to-test:" $(tools-to-test) ; run-tests tools : $(tools-to-test)/test ; if $(check-libs-only-targets) { alias check-libs-only : $(check-libs-only-targets) ; } alias minimal : [ find-targets minimal : ../libs/$(libs-to-test) ] ; explicit minimal ; alias quick : [ find-targets quick : ../libs/$(libs-to-test) ../tools/$(tools-to-test) ] ; explicit quick ; ================================================ FILE: status/boost-no-inspect ================================================ This file tells boost inspect to ignore this directory and any sub-directories ================================================ FILE: status/boost_check_library.py ================================================ #!/usr/bin/env python # Copyright Rene Rivera 2016 # # 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 os import inspect import optparse import sys import glob import fnmatch import json class check_library(): ''' This is a collection of checks for a library to test if a library follows the Boost C++ Libraries requirements and guidelines. It also checks for possible and likely errors in the library. ''' def __init__(self): self.main() def check_organization(self): self.run_batch('check_organization_') def check_organization_build(self): if os.path.isdir(os.path.join(self.library_dir, 'build')): self.assert_file_exists(os.path.join(self.library_dir, 'build'), self.jamfile, ''' Did not find a Boost Build file in the [project-root]/build directory. The library needs to provide a Boost Build project that the user, and the top level Boost project, can use to build the library if it has sources to build. ''', 'org-build-ok') if os.path.isdir(os.path.join(self.library_dir, 'src')): self.assert_dir_exists(os.path.join(self.library_dir,'build'), ''' Missing [project-root]/build directory. The [project-root]/build directory is required for libraries that have a [project-root]/src directory. ''', 'org-build-src') def check_organization_doc(self): self.assert_file_exists(self.library_dir, ['index.html'], ''' Did not find [project-root]/index.html file. The file is required for all libraries. Redirection to HTML documentation. ''', 'org-doc-redir') self.assert_dir_exists(os.path.join(self.library_dir,'doc'), ''' Missing [project-root]/doc directory. The [project-root]/doc directory is required for all libraries. Sources to build with and built documentation for the library. If the library needs to build documentation from non-HTML files this location must be buildable with Boost Build. ''', 'org-doc-dir') def check_organization_include(self): if os.path.isdir(os.path.join(self.library_dir,'include','boost',self.library_name)): self.warn_file_exists(os.path.join(self.library_dir,'include','boost'), ['*.h*'], ''' Found extra files in [project-root]/include/boost directory. ''', 'org-inc-extra', negate = True, globs_to_exclude = ['%s.h*'%(self.library_name)]) else: self.warn_file_exists(os.path.join(self.library_dir,'include','boost'), ['%s.h*'%(self.library_name)], ''' Did not find [project-root]/include/boost/[library].h* file. A single header for the library is suggested at [project-root]/include/boost/[library].h* if the library does not have a header directory at [project-root]/include/boost/[library]. ''', 'org-inc-one') def check_organization_meta(self): parent_dir = os.path.dirname(self.library_dir) # If this is a sublibrary it's possible that the library information is the # parent library's meta/libraries.json. Otherwise it's a regular library # and structure. if not self.test_dir_exists(os.path.join(self.library_dir,'meta')) \ and self.test_file_exists(os.path.join(parent_dir,'meta'),['libraries.json']): if self.get_library_meta(): return self.assert_file_exists(os.path.join(self.library_dir, 'meta'), ['libraries.json'], ''' Did not find [project-root]/meta/libraries.json file, nor did [super-project]/meta/libraries.json contain an entry for the sublibrary. The file is required for all libraries. And contains information about the library used to generate website and documentation for the Boost C++ Libraries collection. ''', 'org-meta-libs') elif self.assert_dir_exists(os.path.join(self.library_dir,'meta'), ''' Missing [project-root]/meta directory. The [project-root]/meta directory is required for all libraries. ''', 'org-meta-dir'): self.assert_file_exists(os.path.join(self.library_dir, 'meta'), ['libraries.json'], ''' Did not find [project-root]/meta/libraries.json file. The file is required for all libraries. And contains information about the library used to generate website and documentation for the Boost C++ Libraries collection. ''', 'org-meta-libs') def check_organization_test(self): if self.assert_dir_exists(os.path.join(self.library_dir,'test'), ''' Missing [project-root]/test directory. The [project-root]/test directory is required for all libraries. Regression or other test programs or scripts. This is the only location considered for automated testing. If you have additional locations that need to be part of automated testing it is required that this location refer to the additional test locations. ''', 'org-test-dir'): self.assert_file_exists(os.path.join(self.library_dir, 'test'), self.jamfile, ''' Did not find a Boost Build file in the [project-root]/test directory. ''', 'org-test-ok') def main(self): commands = []; for method in inspect.getmembers(self, predicate=inspect.ismethod): if method[0].startswith('check_'): commands.append(method[0][6:].replace('_','-')) commands = "commands: %s" % ', '.join(commands) opt = optparse.OptionParser( usage="%prog [options] [commands]", description=commands) opt.add_option('--boost-root') opt.add_option('--library') opt.add_option('--jamfile') opt.add_option('--debug', action='store_true') self.boost_root = None self.library = None self.jamfile = None self.debug = False ( _opt_, self.actions ) = opt.parse_args(None,self) self.library_dir = os.path.join(self.boost_root, self.library) self.error_count = 0; self.jamfile = self.jamfile.split(';') self.library_name = self.library.split('/',1)[1] #os.path.basename(self.library) self.library_key = self.library.split('/',1)[1] if self.debug: print(">>> cwd: %s"%(os.getcwd())) print(">>> actions: %s"%(self.actions)) print(">>> boost_root: %s"%(self.boost_root)) print(">>> library: %s"%(self.library)) print(">>> jamfile: %s"%(self.jamfile)) for action in self.actions: action_m = "check_"+action.replace('-','_') if hasattr(self,action_m): getattr(self,action_m)() def run_batch(self, action_base, *args, **kargs): for method in inspect.getmembers(self, predicate=inspect.ismethod): if method[0].startswith(action_base): getattr(self,method[0])(*args, **kargs) def get_library_meta(self): ''' Fetches the meta data for the current library. The data could be in the superlib meta data file. If we can't find the data None is returned. ''' parent_dir = os.path.dirname(self.library_dir) if self.test_file_exists(os.path.join(self.library_dir,'meta'),['libraries.json']): with open(os.path.join(self.library_dir,'meta','libraries.json'),'r') as f: meta_data = json.load(f) if isinstance(meta_data,list): for lib in meta_data: if lib['key'] == self.library_key: return lib elif 'key' in meta_data and meta_data['key'] == self.library_key: return meta_data if not self.test_dir_exists(os.path.join(self.library_dir,'meta')) \ and self.test_file_exists(os.path.join(parent_dir,'meta'),['libraries.json']): with open(os.path.join(parent_dir,'meta','libraries.json'),'r') as f: libraries_json = json.load(f) if isinstance(libraries_json,list): for lib in libraries_json: if lib['key'] == self.library_key: return lib return None def error(self, reason, message, key): self.error_count += 1 print("%s: error: %s; %s <<%s>>"%( self.library, self.clean_message(reason), self.clean_message(message), key, )) def warn(self, reason, message, key): print("%s: warning: %s; %s <<%s>>"%( self.library, self.clean_message(reason), self.clean_message(message), key, )) def info(self, message): if self.debug: print("%s: info: %s"%(self.library, self.clean_message(message))) def clean_message(self, message): return " ".join(message.strip().split()) def assert_dir_exists(self, dir, message, key, negate = False): self.info("check directory '%s', negate = %s"%(dir,negate)) if os.path.isdir(dir): if negate: self.error("directory found", message, key) return False else: if not negate: self.error("directory not found", message, key) return False return True def warn_dir_exists(self, dir, message, key, negate = False): self.info("check directory '%s', negate = %s"%(dir,negate)) if os.path.isdir(dir): if negate: self.warn("directory found", message, key) return False else: if not negate: self.warn("directory not found", message, key) return False return True def assert_file_exists(self, dir, globs_to_include, message, key, negate = False, globs_to_exclude = []): found = self.test_file_exists(dir, globs_to_include = globs_to_include, globs_to_exclude = globs_to_exclude) if negate: if found: self.error("file found", message, key) return False else: if not found: self.error("file not found", message, key) return False return True def warn_file_exists(self, dir, globs_to_include, message, key, negate = False, globs_to_exclude = []): found = self.test_file_exists(dir, globs_to_include = globs_to_include, globs_to_exclude = globs_to_exclude) if negate: if found: self.warn("file found", message, key) return False else: if not found: self.warn("file not found", message, key) return False return True def test_dir_exists(self, dir): return os.path.isdir(dir) def test_file_exists(self, dir, globs_to_include, globs_to_exclude = []): self.info("test file(s) in dir '%s', include = '%s', exclude = %s"%(dir,globs_to_include,globs_to_exclude)) found = False if os.path.isdir(dir): for g in globs_to_include: for f in glob.iglob(os.path.join(dir,g)): exclude = False for ge in globs_to_exclude: if fnmatch.fnmatch(os.path.basename(f),ge): exclude = True found = not exclude if found: break return found if check_library().error_count > 0: sys.exit(1) ================================================ FILE: status/expected_results.xml ================================================ ================================================ FILE: status/explicit-failures-markup.xml ================================================ This failure is caused by a timeout when compiling the test. It passes when the timeout value is increased. These failures are caused by a lack of support/configuration for Boost.Tr1 The compiler does not support features that are essential for the library. The toolset is not supported by Boost.Regex. The test fail with ICE, but the exact reason for ICE is not known. A minimal example of casting any to reference type seem to work. Anyone interested in using this functionality with msvc is suggested to do additional testing. Compilers need to support partial template specialization to work with zero length arrays. This compiler does not support enable_if, which is needed by the Boost.System library on which Boost.Asio depends. On HP-UX 11.23 platform, these tests must be compiled with _XOPEN_SOURCE_EXTENDED macro defined. It is likely related to CR JAGag28813. The test would (most likely) compile and run properly if the workaround syntax .to_container( c ) was applied to all list_of() expressions. This test could probably be made to work if somebody with knowledge about the compilers would submit a patch. The test would (most likely) compile and run properly if the workaround syntax .to_container( c ) was applied to all list_of() expressions. The test could probably be made to work if somebody submitted a patch. The test would (most likely) compile and run properly if the workaround syntax .to_container( c ) was applied to all list_of() expressions. The test depends on Boost.Pointer Container which probably does not work for this compiler. The test depends on Boost.Pointer Container which probably does not work for this compiler. The test depends on Boost.Pointer Container which probably does not work for this compiler. The test does not work for this compiler. The test depends on Boost.Tuple which probably does not work for this compiler. C++11 is the minimum requirement. The VC++ 6.0 backend runs out of internal resources while trying to process the Comeau output for this library; Comeau Computing has been asked about a solution. On the other hand, Comeau 4.3.3 with VC++ 7.0 backend works fine. Compiler bug. Time out. This failure is caused by Boost.Function. This failure is caused by a bug in the compiler triggered by the use of the debug flag '-gall'. It has been reported to the compiler vendor. This failure is only present in release mode and is caused by /OPT:ICF. Temporarily enabled and always failing test used for collecting additional feedback from the testing site. The compiler does not support features that are essential for the library. This version of the Rogue Wave library fails to provide all needed addition operators for the iterator type and the difference type of std::deque. Long double NaN's are apparently handled incorrectly on this platform. This failure is due to NaNs trapping. This failure is due to the compiler not recognising the long double special values for infinity and quiet NaN The compiler does not support features that are essential for the library. hash_value is not overloaded for arrays for older versions of Visual C++. There is a work around so that boost::hash<T[N]>, boost::hash_combine and boost::hash_range work. On these compilers the wrong overload of hash_value is called when the argument is a hash function pointer. So calling hash_value doesn't work but boost::hash does work (and it's recommended that user never call hash_value directly so this shouldn't be a problem). This platform has poor support for long double so the hash function perform poorly for values out of the range of double or if they differ at a greater precision that double is capable of representing. These examples only work on compilers with support for ADL. It is possible to work around this, but I wanted to keep the example code as clean as possible. It appears that Borland doesn't find friend functions defined in a class by ADL. This is easily fixed but this example is meant to show the typical way of customising boost::hash, not the portable way. The test demonstrates a Borland bug - functions that aren't in a namespace don't appear to be found by ADL. Debug containers aren't supported on Apple's version of gcc 4.2. The relevant SFINAE support is broken in MSVC up to version 11. This compiler does not support the is_abstract type trait Conversion double-string-double may give a different value (or even throw) on many compilers Some compilers and STL realizations convert double and long double types with bigger precision loss than minimal (or even round to infinity). Such failures are not a lexical_cast, but a compiler fault. On this compiler, Boost.Function gives a run-time error when calling non-nullary lambdas as used by the tests of this library to program contract failure handlers. It might still be possible to use this library on this compiler using default contract failure handlers or programming custom contract failure handlers but without using non-nullary lambdas (however, the authors did not confirm that). Even tests that do not use C++11 lambda functions fail on this compiler because it incorrectly attempts an extra copy when objects are constructed using `boost::check c = ...`. This is fixed in MinGW GCC 4.3. Even tests that do not use C++11 lambda functions fail on this compiler because of a number of issues (Boost.Exception is not supported on this compiler but it is used by this library implementation, some aspects of `friend` and `volatile` are not properly implemented on this compiler, etc.). These specific issues are fixed in MSVC 9.0 (but only MSVC 11.0 has adequate lambda function support that makes this library actually usable). This test fails on this compiler because of a bug with exceptions (see http://grokbase.com/t/gg/android-ndk/1656csqqtp/assertion-ttypeencoding-dw-eh-pe-absptr-unexpected-ttypeencoding-failed). This test fails on this compiler because of a bug in its STL implementation (undefined references to `std::ios_base::failure::failure`). This test fails because of a libcxxrt bug on Clang for FreeBSD which causes `std::uncaught_exception` to not work properly on re-throws (see https://github.com/pathscale/libcxxrt/issues/49). This test fails because this complier does not properly implement SFINAE giving incorrect errors on substitution failures for private members. This seems to be fixed in GCC 4.8 and MSVC 12.0. This test fails because SFINAE on this complier seems to not fail as it should when a derived class tries to call a protected member function on a base class object via a function pointer instead of via inheritance. This seems to be fixed in Clang 3.1, and to be specific to version 4.6 of GCC. This test fails because this compiler seems to incorrectly check access level of members in base classes in a context when only derived class members are used. This seems to be fixed in GCC 4.8 (possibly related to https://gcc.gnu.org/bugzilla/show_bug.cgi?id=57973). This test fails because `std::unchaught_exception` seems to always return zero on this compiler (even if the authors could not find a direct reference to this possible compiler issue online). This test fails because this complier seems to dispatch calls incorrectly when both `const` and `const volatile` overloads are present (even if the authors could not find a direct reference to this possible compiler issue online). This is fixed in MSVC 9.0 (but only MSVC 11.0 has adequate lambda function support). This test fails because MSVC 10.0 is not able to properly deduce a template specialization. This is fixed in MSVC 11.0. This test fails because of a MSVC 10.0 bug with lambdas within template class initialization list. This can be worked around using a functor bind instead of a lambda, but it is fixed in MSVC 11.0. This test fails because of a MSVC 10.0 bug for which lambdas cannot access typedefs declared within classes. This can be worked around declaring typedefs outside of classes, but it is fixed in MSVC 11.0. This test fails because of an internal MSVC 10.0 compiler bug. This is fixed in MSVC 11.0. The serialization library does not support this compiler. XML serialization is not supported on this compiler. The serialization library does not support this compiler. XML serialization is not supported on this compiler. These are strange runtime failures for which there is no obvious explanation. Later versions of the Intel compiler (eg:8.0) seem to have resolved the issue. For some reason Code Warrior has difficulty compiling some of the input code. This may be related to limitations of locale handling, but it's unclear at this time (2005-May-21). Some older compilers are confused by the template code here. These are new features to date-time in 1.33 and there is no plan to backport to these non-compliant compilers. Some older compilers are confused by the template code here. These are new features to date-time in 1.33 and there is no plan to backport to these non-compliant compilers. Some older compilers are confused by the template code here. These are new features to date-time in 1.33 and there is no plan to backport to these non-compliant compilers. Some older compilers are confused by the template code here. These are new features to date-time in 1.33 and there is no plan to backport to these non-compliant compilers. Some compilers are confused by the template code here. These are new features to date-time in 1.33 and there is no plan to backport to these non-compliant compilers. Some older compilers are confused by the template code here. These are new features to date-time in 1.33 and there is no plan to backport to these non-compliant compilers. Some older compilers are confused by the template code here. These are new features to date-time in 1.33 and there is no plan to backport to these non-compliant compilers. Some older compilers are confused by the template code here. These are new features to date-time in 1.33 and there is no plan to backport to these non-compliant compilers. Some older compilers are confused by the template code here. These are new features to date-time in 1.33 and there is no plan to backport to these non-compliant compilers. Some compilers are confused by the template code here. These are new features to date-time in 1.33 and there is no plan to backport to these non-compliant compilers. These compilers are unfortunately able to correctly compile the new format-based input-output code for date time. Suitable, but less flexible, alternatives are available on these compilers. These compilers are unfortunately able to correctly compile the new format-based input-output code for date time. Suitable, but less flexible, alternatives are available on these compilers. These compilers are unfortunately able to correctly compile the new format-based input-output code for date time. Suitable, but less flexible, alternatives are available on these compilers. These compilers are unfortunately able to correctly compile the new format-based input-output code for date time. Suitable, but less flexible, alternatives are available on these compilers. These compilers are unfortunately able to correctly compile the new format-based input-output code for date time. Suitable, but less flexible, alternatives are available on these compilers. There is apparently a bug in Borland library such that std::local_time and std::gmtime are returning a time that's 1 hour ahead GetSystemTimeAsFileTime during DST. This is a rather serious problem in that some of the date-time clock interfaces will give the wrong current time. The sun 5.8 compiler and standard library have a problem with the classic facet which causes some of the io tests for date-time to fail. Overall this should not affect most uses of the library. The STLPort standard library has issues with some custom facet settings causing an unexplained failure in these facet tests. The STLPort standard library has issues with the handling of the classic facet which causes some fo the i/o tests for date-time to fail. Overall this should not affect most uses of the library. MSVC 7.1 with its standard library passes all date-time tests. For some reason when paired with stlport a few widestream io tests do not format output correctly. Overall this should not affect most uses of the library. Although these tests compile, the execution aborts for an unknown reason. Note that sometimes the execution is ok on cw-9_4. This may be fixable if someone can track down the source of the problem. These tests are failing with the beta2 version of VC_8. At least one of them is directly a result of the new VC_8 standard library restricting the year value in a tm struct to be positive (that is greater than year 1900). This is a change from VC7_1 and Microsoft is considering removing this restriction. These tests are for serialization which has been marked as unusable. The issue was specifically noted on AIX version : 5.2.0.41 using IBM XL Version 8.0.0.0. The failure is caused by a standard library bug. It doesn't support user defined facets which are not default constructible. This has been reported to the compiler vendor. These tests rely on the ability of an std::map to be instantiated on an incomplete type. The Rogue Wave version 2.2 and higher does not allow this. The failure is caused by a standard library bug. It doesn't support user defined facets which are not default constructible. This has been reported to the compiler vendor. The failure is caused by a standard library bug. The end-of-stream istream iterator can only be constructed when the istream iterator has been instantiated with char as the character type. This has been reported to the compiler vendor. This indicates that forward declarations could probably be used for these compilers but currently aren't. All these compilers use STLport, which is compatible with forward declarations in some circumstances, but not in others. I haven't looked into how to determine this, so I've just set container_fwd to never forward declare for STLport. GCC's libstdc++ has a versioned namespace feature which breaks container forwarding. I don't know how to detect it so I'm just always disabling it, which means that a lot of setups which means that it's disabled for a lot of setups where it could work - which is what these failures represent. Failing because these tests are run with warnings as errors, and the standard library is causing warnings. STLport debug mode seems to be broken here. Some old versions of GCC's libstdc++ don't work on clang with _GLIBCXX_DEBUG defined. http://lists.cs.uiuc.edu/pipermail/cfe-dev/2011-May/015178.html The exact reason of this (linker related) bug is unresearched. The test passes on some environments. The test was found to fail on a platform whit a german version of the compiler. This compiler does not support enable_if, which is needed by the Boost.System library on which Boost.Filesystem depends. Due to standard library bugs this configuration is not supported by the most recent version of the library. Due to standard library bugs, this version is not supported. More recent version of the library should work OK. Due to lack of C library features, this toolset is not supported. The library works well with versions of this compiler 5.9 and later fstream for this compiler has serious problems and is not supported The library does not support wide paths on this compiler because it does not support SFINAE. These failures are reported to be fixed in Sun's next compiler release. This compiler does not support Boost.Interprocess, on which intermodule_holder depends. This compiler does not support the Boost.Range library, on which Boost.Foreach depends. This compiler does not support detection of const rvalues. This compiler does not support detection of const rvalues. This compiler does not support detection of rvalues. This compiler does not support detection of rvalues. These compilers cannot handle BOOST_FOREACH in a template, where the collection type depends on a template parameter. This failure is because the Boost.Range extension mechanism is broken on these compilers. It requires ADL which these compilers do not support. The failure is caused by a standard library bug: the iostream components fail to handle ios::internal flag. Not all compilers/platforms implement nonstandard calling conventions.
With GCC/x86 this failure reflects http://gcc.gnu.org/bugzilla/show_bug.cgi?id=29328 .
Not all compilers/platforms implement nonstandard calling conventions. Overload selection does not work in some assignment contexts with this compiler.
Probably broken const conversion with that compiler. This compiler is currently not supported. This compiler is currently not supported. hash_value is not overloaded for arrays for older versions of Visual C++. There is a work around so that boost::hash<T[N]>, boost::hash_combine and boost::hash_range work. On these compilers the wrong overload of hash_value is called when the argument is a hash function pointer. So calling hash_value doesn't work but boost::hash does work (and it's recommended that user never call hash_value directly so this shouldn't be a problem). This platform has poor support for long double so the hash function perform poorly for values out of the range of double or if they differ at a greater precision that double is capable of representing. These examples only work on compilers with support for ADL. It is possible to work around this, but I wanted to keep the example code as clean as possible. It appears that Borland doesn't find friend functions defined in a class by ADL. This is easily fixed but this example is meant to show the typical way of customising boost::hash, not the portable way. The test demonstrates a Borland bug - functions that aren't in a namespace don't appear to be found by ADL. Debug containers aren't supported on Apple's version of gcc 4.2. The compiler doesn't generate defaulted move ctor/assgin thus perform copy construction/assginment. Even though such case, the `inline` versions don't force generating move ctor/assign to preserve trivial requirements. Since that is not documented behaviour, it might be changed in future release. These compilers do not support features that are essential for the library. Intel 11.1 and 12.0 on Darwin raises a SIGSEGV in almost all unit tests. Intel 13.1.3 does not support BOOST_TEST pgi 11.1 does not support BOOST_AUTO and is not configured for UBLAS This configuration is not well configured for UBLAS The compiler does not support features that are essential for the library. Compiler error expected for msvc: A minimal example of a class template 'value' that results in syntax error in a subsequent meta function. See ticket #5141 for details. When compiling with aC++, depending on system load, the compile time may exceed specified timeout value. The test passes when the timeout value is increased. When compiling with GCC, linker takes segmentation fault. In the HP bug tracking system, this issue is tracked as QuIX ID: QXCR1000836120. The compiler does not support features that are essential for the library. The compiler does not support features that are essential for the library. The compiler is not supported by Interprocess. This is gcc bug 26526, and is fixed in later releases. No bzip2 support on the testing machine and no way to disable this test with BBv2 at present. compiler can't compile "windows.h" in strict mode This platform lacks the placement delete operator required by the C++ standard These six tests pass individually but cause a compiler stack overflow when compiled as a group On this platform, linking this test takes longer than 10 minutes which is a time limit specified for bjam. When linked manually, the test succeeds. The test fails at runtime for unknown reasons. I'm not sure whether CodeWarrior is correct to report that the member in question is inaccessible; however, when the member is made public an internal error occur that I have not been able to fix, so for now the question is moot. The failure reflects a problem with the build system: the zlib object files are generated in the wrong directory. Memory mapped files are not supported in QNX Neutrino version 6.3.0. "restrict" is treated as a keyword on this platform (as in C99); use the alias "slice" instead, defined in "boost/iostreams/slice.hpp." In the Dinkumware standard library, streampos relies on fpos_t to store stream offsets, but fpos_t is defined as a 32-bit long by the Borland runtime library. In Borland's modified version of STLPort, streampos relies on streamoff to store stream offsets, but streamoff is defined to be a 32-bit long. In STLPort, streampos consists of a long together with a conversion state; on this platform, long is a 32-bit type On this platform, streampos is an alias for fpos, whose implementation stores stream offsets using streamsize and fpos_t; both of the latter types are 32-bit On this platform, streampos is an alias for ptrdiff_t, which is an alias for a 32-bit type The following applies only to gcc-4.2 using the stdcxx standard library: On this platform, streampos is an alias for ptrdiff_t, which is an alias for a 32-bit type Visual C++ 7.1's SFINAE implementation can't deal with multiple assignment functions with the same parameters (but disabled with SFINAE). So path's assignment from boost::filesystem2::path is disabled. Would be pretty easy to workaround, but probably not worth it since this is pretty obscure, and filesystem2 will be removed soon. C++11 is the minimum requirement. This test does not allow C++11 auto-declaration support (because it uses the `auto` keyword as storage classifier). The compiler fails to compile Boost.Move and Boost.PropertyTree, which are used by this library. Boost.Filesystem used by Boost.Log does not support Windows Mobile. The compiler does not support features that are essential for the library. The compiler is not supported by the library due to an utterly broken templates support. This failure is caused by a deficient SFINAE implementation; the bug was fixed in the next major compiler version (CodeWarrior 9.x). This failure is caused by a deficient SFINAE implementation. This failure is caused by a problem with recursive templates and default template parameters, fixed in Update 2. This failure is caused by a lack of compiler support for template template parameters. This is an advanced functionality that hasn't been ported to the deficient compilers (yet). Patches are welcome! This is an advanced functionality that hasn't been ported to the deficient compilers (yet). Patches are welcome! This is a regression in the gcc 4.1 series that has been fixed in gcc 4.2.0. See bug #28088 for details. This is reported to be fixed in the next Sun compiler release.

This library has never worked [on Borland 5.5.1 and 5.6.4], and the only tests that 'pass' are compile-fail tests failing for the wrong reasons!

Known error in MSVC. see http://boost-consulting.com/boost/libs/multi_index/doc/compiler_specifics.html#msvc_60 for more information.
The VC++ 6.0 backend runs out of internal resources while trying to process the Comeau output for this library; Comeau Computing has been asked about a solution. On the other hand, Comeau 4.3.3 with VC++ 7.0 backend works fine. This error shows when using the dynamic version of the STLport library. The problem is reportedly fixed in STLport 5.0 (in beta stage as of this writing.) This test fails due to limitations of the template instantiation model used in the testing environment (-timplicit_local) resulting in erroneous duplication of some function-static variables. The test passes with other template instantiation models.

These compilers are too antiquated for this library.

These compilers don't quite have the necessary support for this library, it's possible that they could be made to work if someone cares enough.

This failure is caused by a test-runner timeout: unfortunately the Intel compiler is exceptionally slow at building some of these tests. This failure is caused by a test-runner timeout.

This is a compiler bug: it sometimes creates an illegal temporary object. The following code illustrates the bug:

		#include <cassert>
		const int global_i = 0;
		
		struct TestingReferenceBinding
		{
		  TestingReferenceBinding(const int& ii)
		  {
		    assert(&ii == &global_i);
  		  }
		};
		
		int main()
		{
		  TestingReferenceBinding ttt = global_i;
		}
                

This failure is caused by a compiler bug, and as far as we can tell, can't be worked around in the library, although we think the library might be made safer with respect to this bug.

Specifics: the following simple test fails when it should succeed.

                #include <cassert>

                int const x = 0;
                struct A
                {
                   A(int const& y)
                   {
                     assert(&x == &y);
                   }
                };

                int main()
                {
                    A a(x);  // direct initialization works fine
                    A b = x; // copy initialization causes x to be copied before it is bound
                }
                
The possible safety enhancement would be to cause the constructor in question to be explicit for optional<T const&>; that would prevent copy initialization.
Complete C++14 support is the minimum requirement. libstdc++ 6 is the minimum version which works. Tests are unstable on GCC 6. Tests are unstable on VS2017 and VS2019. Wrokaround: define BOOST_RESULT_OF_USE_TR1 Compiler's too old for working. C++11 or later required. The test is exposing the following known error of Sun Studio 11: overload resolution fails if a) some class has a conversion operator to a reference to a built-in type, and b) overload resolution involves a user-defined operator as well as a built-in operator, and c) the built-in operator takes the result of the conversion mentioned in a) as an operand. A fix will be reportedly included in patch no 6 of Sun Studio 11. This error shows when the code has become too complex for the compiler to handle. The problem has no relationship with the functionality being tested, which in fact does work for MSVC++ 7.0. msvc 6 compiler failure. The facility being tested conflicts the the compiler in a fundamental way and cannot be worked around. msvc 6 compiler failure. The facility being tested conflicts the the compiler in a fundamental way and cannot be worked around. This failure appears when STLPort is built and used as a DLL with msvc 6. STLPort suggests that the next version of STLPort(5.0) will include a workaround for this problem. The library is believed to work in this configuration if compiled against Spirit 1.6. The latter is not provided by the particular testing environment these tests have been run in. All tests that serialize derived pointers currently fail with Metrowerks compilers. The CW compilers have problems with the static construction idiom used to implement the type registration in the Boost.Serialization library. In many cases CW specific workarounds are implemented in the library but this one is not immediately solvable. There is a user work around possible, please contact the library developers on the Boost list for information on the work around if needed. The variant library is not supported for this compiler version. Therefore serialization of variants doesn't work. The compiler fails with an error supposedly related to std::fpos<>::_Stz from the <iosfwd> header. It is not known what causes the compiler to instantiate this field and what causes the instantiation to fail.

Historically, Spirit supported a lot of compilers, including (to some extent) poorly conforming compilers such as VC6. Spirit v1.6.x will be the last release that will support older poorly conforming compilers. Starting from Spirit v1.8.0, ill conforming compilers will not be supported. If you are still using one of these older compilers, you can still use Spirit v1.6.x.

The reason why Spirit v1.6.x worked on old non-conforming compilers is that the authors laboriously took the trouble of searching for workarounds to make these compilers happy. The process takes a lot of time and energy, especially when one encounters the dreaded ICE or "Internal Compiler Error". Sometimes searching for a single workaround takes days or even weeks. Sometimes, there are no known workarounds. This stifles progress a lot. And, as the library gets more progressive and takes on more advanced C++ techniques, the difficulty is escalated to even new heights.

Spirit v1.6.x will still be supported. Maintenance and bug fixes will still be applied. There will still be active development for the back- porting of new features introduced in Spirit v1.8.0 (and Spirit 1.9.0) to lesser able compilers; hopefully, fueled by contributions from the community. For instance, there is already a working AST tree back-port for VC6 and VC7 by Peder Holt.

This failure is caused by a compiler bug that manifests itself in the particular environment/hardware configuration the test has been run in. You may or may not experience this issue in your local setup. With GCC 3.4.6 the test fails with ICE: internal compiler error. The footprint is similar to that in GCC Bugzilla Bug 34950 except 34950 is a regression introduced in GCC 4.2.3. In any case, whatever the problem is, the GCC 4.x series does not seem to have it: the test compiles just fine with GCC 4.x compiler.
This compiler is not supported. Native mode is not supported for this compiler. Emulation mode is not supported for this compiler. The feature is not supported by this compiler. The feature is not supported by this compiler. The feature is not supported by this compiler. This failure is caused by a compiler bug. Templated operators that combine different iterators built with iterator_facade or iterator_adaptor may be present in an overload set even when those iterators are not interoperable. The usual result is that error messages generated by illegal use of these operators will be of lower quality. This failure is caused by a compiler bug. is_convertible<T,U>::value may be true for unrelated iterators T and U (including many of the Boost specialized adaptors) which use enable_if_convertible to restrict the applicability of converting constructors, even when T is not convertible to U because instantiating the conversion will cause a compilation failure. This failure is caused by a compiler bug. The compiler tends to drop const-ness and as a result some indirect_iterators will have pointer and reference members of T* and T& that should have been T const* and T const&. For some currently unknown reason, with aCC, this test can be compiled only in strict ansi mode. Since on HP-UX/aCC boost testing is done in the default compilation mode, this test fails to compile on this platform. Sadly Borland-5.9.2 has an even harder time compiling this library than earlier versions did. There are currently too many issues to stand a chance of porting to this compiler. This test relies on external software being installed in order to pass. This compiler is not sufficiently conforming to correctly handle these tests. Some versions of the Darwin platform have insufficient long double support for us to be able to run this test. This test takes too long to build for this compiler and times out. This is a compiler bug: it is unable to use SFINAE to detect the presence of specific member functions. This is a compiler bug: it is unable to resolve the overloaded functions. This test takes too long to execute and times out. These tests fail with an internal compiler error: there is no known workaround at present, except to use Sun-5.9 which does build this code correctly. This compiler is not sufficiently conforming to correctly handle these tests. This compiler is not sufficiently conforming to correctly handle these tests. There appears to be a bug in gcc's std::exp (long double) on this platform. For some reason taking the address of std library math functions fails on this platform: this is a problem for our test code, not the library. This compiler is not sufficiently conforming to compile these tests. std::numeric_limits<long double>::infinity() is apparently broken in this compiler: it's filed as bug 6347520 with Sun. Incomplete std::complex support make these tests pointless (the complex trig functions are absent). These have yet to fully investigated, but the code is known to compile with more conforming compilers, probably workarounds are possible if someone is prepared to invest the time. Appears to be a bug in STLport's complex abs function, but needs more investigation. This appears to be a problem with STLPort's abs function: the issue only effects the test code. A workaround should be possible but users should be encouraged to use STLport 5 instead. No true long double standard lib support causes these tests to fail. This is Intel issue 409291, it should be fixed from compiler package l_cc_c_9.1.046 onwards. This failure appears to be caused by a compiler bug: please note that the issue only effects the test suite, not the library itself. A workaround is available but breaks other compilers. This test ensures the inclusion property of interval arithmetic is available for built-in floating-point types float and double. If the test fails, interval<float> and interval<double> should not be used on this compiler/platform since there will be no numerical guarantee. This compiler has some problems with name lookup / overload resolution. This failure is unresearched. Presumably, the problem is that the abs function is not available in the "right" namespace with this compiler/stdlib combination. This old version of the stlport library causes the BOOST_NO_STDC_NAMESPACE macro to be set. But this conflicts with the requirements of the library. The failure is caused by standard library deficiencies -- it lacks the basic_string class template and the <locale> header. The failures are caused by problems with std::locale implementation The failures are caused by compiler bug: it's not possible to explicitly pass template arguments to member template function. The failure is serious and makes one of the primary interfaces unusable. Several compiler bugs were worked around in order to get this test to pass, so it could be considered to be only partially working. However, the library's macro system, which is really being tested here, does work on this compiler, which is why we worked around the failures. Please see the test's source file for details. These compilers do not support SFINAE, so are expected to fail this test. Borland does not support this feature. A compatibility syntax might be developed later on. This feature generally requires advanced compiler features not supported by these compilers. It might be possible to work around the issue on VC6/7, but at this time no such workaround has been done. This is old and should not be tested any more. These test failure are reported to be under investigation at Sun's compiler labs. Inherited from MultiIndex Lots of test failures complaining about the ambiguity of a const and a non-const overload of the same function. This compiler seems to have very broken name lookup. Tend to crash the compiler (Intel 10) or simply take too long (Intel 11). This ancient GCC doesn't like local const ints as template parameters. Or something like that. The error is due to problems in the standard library implementation. It should be fixed in newer versions of the compiler. The error is due to problems in the standard library implementation. It should be fixed in newer versions of the compiler. This error seems to be a bug the compiler. Please submit a patch. This error seems to be a bug the standard library. Please submit a patch. This test fails because the test ptr_vector fails. Please see the note for that test. For sun the problem is that insert(iterator,range) is not available due to partial ordering errors (the core library remains usable). For codewarrior the problem is at least std::auto_ptr overloads (the core library remains usable). For sun the problem is that insert(iterator,range) is not available due to partial ordering errors (the core library remains usable). For codewarrior the problem is at least std::auto_ptr overloads (the core library remains usable). For sun the problem is that insert(iterator,range) is not available due to partial ordering errors (the core library remains usable). For codewarrior the problem is at least std::auto_ptr overloads (the core library remains usable). For hp, this compiler bug is insignificant. For sun the problem is that transfer(range,ptr_map) is not available due to partial ordering errors (the core library remains usable). For codewarrior the problem is not known so please submit a patch. For sun the problem is that transfer(range,ptr_map) and insert(range)code> is not available due to partial ordering errors (the core library remains usable). For codewarrior the problem is at least std::auto_ptr overloads (the core library remains usable).. For codewarrior, the cause of this problem is unknown. Please submit a patch. Other failures are due to problems with the serialization library, or to a minor problem with the use of the library. For sun the problem is due to Boost.Test. Seem like a bug in the compiler. Please submit a patch. Seem like a bug in the compiler. Please submit a patch. The library fails to compile because of an error in the C++ standard library implementation on this platform. It incorrectly assumes that fpos_t is of an integral type, which is not always the case. This is fixed in a later release. The old reasoning given for this markup, which applied to sun-5.8*, was as follows. However, tuple's tests seem to use the test library, which is apparently completely broken on Sun. Therefore, I've backed off the version number to sun-5.6 so I can see the actual state of the failures.
This compiler seems to be having trouble digesting Boost.Tuple. Until it can handle Boost.Tuple there's little chance it will handle Boost.Python
This compiler has a bug that causes silent misbehavior at runtime when each of an assignment expression follows one of the following patterns: expr.attr(name) or expr[item], where expr is-a boost::python::object. We've been unable to find a workaround. The problems with GCC 2.x only occur when C++ exceptions are thrown and the framework catches them, which happens quite often in the tests. So technically GCC 2.x is usable if you're careful. This test assumes standard-compliant dependent template name lookup which is performed by aCC6 only in strict ansi mode. Since on HP-UX/aCC6 boost testing is done in the default compilation mode, this test fails to compile on this platform (in strict ansi mode, it compiles and succeeds).
Unsupported compiler C++11 mode (or later) required Reported to Intel as issue 409291, and confirmed as a problem. Probably this relates to a specific Linux-Kernel or GLibC version. Test fails with ranlux*_O1 RNGs when saving and recalling the state due to a bug in the double to string conversion. The problem has been reported to QNX as PR29252. This test fails because of limitations in the system assembler version used by GCC. It most probably would pass if the test were split into multiple source files. It looks like a compiler issue: the test fails with gcc 3.4.6 and succeeds with gcc 4.2.1. This test is designed to give users visibility of the ADL problems with their compilers. Lack of Argument Dependent Lookup changes how one can extend the library. The lack of ADL is worked-around internally so that most of the functionality is preserved. For most compilers this is due to problems with built-in arrays (notably char arrays) and operator==() and operator!=() for iterator_range. Thus, not using built-in arrays fixes the problem. For other compilers it is simply a bug in the standard library. push_front fails the unit test in this configuration. I do not have this configuration available to determine if a work-around is possible. This test probably fails because it uses built-in arrays. So do expect these functions to work in normal code. The string functionality is expected to work if the user employs std::string and stays away from built-in arrays. For most compilers this is due to problems with built-in arrays (notably char arrays) and operator==() and operator!=() for iterator_range. Thus, not using built-in arrays fixes the problem. At the time of release I couldn't figure out why this was failing. Anyway, the failure is not very important; also, the well-definedness of "singularity" of an iterator range is likely to change. The test requires support for Argument Dependent Lookup (ADL) which the compiler in question does not provide. The compiler does not support features that are essential for the library. internal error: assertion failed: copy_template_param_expr. It seems to be already an Intel internal bug database (tracker number #82149). I have no workaround yet. The compiler does not support features that are essential for this test . No Wide character support on this platform. No Wide character support on this platform. This test requires features that are unsupported by Como: use and building of dll's mainly. This test requires features that are unsupported by Como: use and building of dll's mainly. This tests fails because a dependency (Boost.Test) fails to initialise correctly. The issue has been reported to the library's author. GCC on tru64 appears not to cope with C++ exceptions thrown from within threads. This test fails because a dependency (Boost.Program Options) doesn't build with this compiler. This test fails because a dependency (Boost.Program Options) which currently doesn't build with this compiler. There appears to be a linker bug that prevents these projects from building, see http://qc.borland.com/wc/qcmain.aspx?d=32020. There appears to be a linker bug that prevents these projects from building, see http://qc.borland.com/wc/qcmain.aspx?d=32020. Test fails due to unresolved externals from STLport: appears to be an STLport bug. These tests pass when run directly from the command line, but fail when run under the regression test script. The issue has never been fully pinned down, but appears to be related to how long the tests take to run. The test does not compile in typeof emulation mode, most likely due to a compiler bug. Users are advised to use native typeof. This compiler does not support native type-of (force type-of emulation mode defining the BOOST_TYPEOF_EMULATION macro). A runtime failure of this test indicates that this platform dynamically links code in a manner such that under certain circumstances more than one instance of a header-defined static class member can exist at runtime. See FAQ for more information. This test runs without problem on Borland compilers, which means the static assertion is not being caught. This compiler does not support enable_if, which is required by Boost.System. The test verifies that Boost.Test detects division by zero. It fails on PowerPC, PA-RISC and Linux ia64. On PowerPC processors, division has an undefined result. The compiler has to emit extra code to assert that the divisor isn't zero. Compiler options -fno-trapping-math and -fnon-call-exceptions might affect this. However, in default configuration no check is done, and division by zero is not detected. The test appears to test that failed assertion result in non-zero exit status. That seems to be not the case, for unknown reasons. On HP-UX platform, this test must be compiled/linked in multithread mode. When compiled/linked with aC++ with -mt, it succeeds. When compiled/linked with GCC with -pthread, it links cleanly but fails in run-time. This failure is caused by a conflict between the compiler and the testing environment: the tests are run on a platform with too recent version of glibc, which is not currently supported by the compiler vendor (Intel). If you are having the same problem and really want to make things work, renaming strol symbol in the compiler's static runtime library (libcprts.a) to something else is known to resolve the issue. When a thread ends, tss data needs to be cleaned up. This process is mostly automatic. When threads are launched by the Boost.Thread API cleanup is handled by the library implementation. For threads, launched by the native operating system API it is not possible to get this cleanup on every compiler/platform. A warning (error) will be present in this case, which clearly states this fact. It is recommended to start threads only by means of the Boost.Thread API if you need to avoid the leaks that appear on the end of the thread. If this is not possible the cleanup can be invoked from user code before the process actually ends. For library implementors this means to call these functions during library initialization and finalization. The Borland compiler and HP-UX aC++ compiler in default mode fail to bind rvalues to the thread move constructor, choosing instead to bind them to the private (and unimplemented) copy constructor. With aC++, the tests compile cleanly in strict ansi mode and succeed. These tests will fail in most compilers that don't support rvalue references. The implementation of native_handle() is not possible on this platform. The implementation of native_handle() is not possible on this platform. This platform doesn't supports Boost.Chrono. This platform doesn't supports Boost.Container. These are all failures with Boost.FunctionTypes which TTI uses. SFINAE for the constructors of param doesn't work correctly on this compiler. This affects free functions (including operators) with more than one any argument and overloaded member functions. This looks like an instance of MSVC substituting int in a template-id. Classes with exactly the same names defined in different modules in anonymous namespaces collapse for this compiler even with RTTI on. This is a known compiler limitation that already fixed in newer versions or will be fixed soon. Classes with exactly the same names defined in different modules in anonymous namespaces collapse for this compiler with RTTI off. This is a known limitation of RTTI-off mode. Such behavior is reflected in docs. Type Traits tests are run with warnings-as-errors and GCC 3.x emits warnings with this test that I haven't been able to suppress. Apparently the compiler can't cope with these - later versions are fine though. Probably work-round-able if someone would care to look into these. This failure is caused by the lack of compiler support for class template partial specialization. A limited subset of the tested functionality is available on the compiler through a user-side workaround (see http://www.boost.org/libs/type_traits/index.html#transformations for details). See bug 99776 'enum UIntEnum { value = UINT_MAX } is promoted to int' http://lab.msdn.microsoft.com/ProductFeedback/viewfeedback.aspx?feedbackid=22b0a6b7-120f-4ca0-9136-fa1b25b26efe https://developercommunity.visualstudio.com/content/problem/490264/standard-violation-enum-underlying-type-cannot-rep.html This functionality is available only on compilers that implement C++ Core Language Defect Report 337. The Type Traits library is broken when used with Sunpro-5.3 and the argument to the template is an array or function type. Most other argument types do work as expected: in other words the functionality is limited with this compiler, but not so much as to render the library unuseable. The Type Traits library is broken when used with Sunpro-5.8 and the argument to the template is a function type. Most other argument types do work as expected: in other words the functionality is limited with this compiler, but not so much as to render the library unuseable. This fails with an internal compiler error, there is no workaround as yet. Older versions of MWCW incorrectly align pointers to member functions (they use 12-byte boundaries, rather than a power-of-2 boundary), leading to alignment_of / aligned_storage to fail with these types on this compiler. VC6/7 has a buggy using declaration syntax which basically makes it impossible to implement the namespace forwarding that this library relies upon. See KB article 263630 here: http://support.microsoft.com/default.aspx?scid=kb;en-us;263630 Metrowerks Codewarrior has partial TR1 support built in which conflicts with this implementation. Porting to this compiler is almost certainly possible, but will require some work by someone who has this compiler. Later versions of MSVC are required for these tests - the issues may be work-round-able if anyone cares enough to look into them. These tests test features that are not supported in the current Boost implementations of TR1 components, they will currently fail on all compilers, unless that compiler has native TR1 support. MSVC 9.0 with the optional feature pack installed includes a version of the TR1 libraries that is not as interface-conforming as the Boost version. Most of these failures are of the "annoying" rather than "unusable" kind. These tests fail on this platform due to a lack of wide character support. These tests fail due to a lack of adequate long double std math lib support. These tests fail on this platform due to incomplete wide character support. These tests fail on this platform due to incomplete wide character support. Support for Borland C++ in the various TR1 libraries is pretty poor (due to numerous compiler bugs sadly). The TR1 concept checks are *very* strict, and are expected to fail with this compiler. In addition most of the type_traits tests fail whenever debugging support is turned on with an internal compiler error. More conservative uses are more likely to succeed with this compiler however. Support for Borland C++ in the various TR1 libraries is pretty poor (due to numerous compiler bugs sadly). The TR1 concept checks are *very* strict, and are expected to fail with this compiler. More conservative uses are more likely to succeed with this compiler however. These tests fail on this platform due to a recurring GCC bug. These tests fail due to a known compiler bug that is fixed in more recent GNU compiler releases. Users are very unlikely to encounter this as a real problem in practice. These tests fail due to a known compiler bug that is fixed in more recent releases. Users are very unlikely to encounter this as a real problem in practice. These tests fail due to a known compiler bug that is fixed in more recent releases. This functionality may not be usable with this compiler. These tests fail due to a known stdlib bug that has been reported to the vendor. This failure is caused by the lack of compiler support for class template partial specialization. A limited subset of the tested functionality is available on the compiler through a user-side workaround (see http://www.boost.org/libs/type_traits/index.html#transformations for details). This functionality is available only on compilers that implement C++ Core Language Defect Report 337. The Type Traits library is broken when used with Sunpro-5.3 and the argument to the template is an array or function type. Most other argument types do work as expected: in other words the functionality is limited with this compiler, but not so much as to render the library unuseable. The Type Traits library is broken when used with Sunpro-5.8 and the argument to the template is a function type. Most other argument types do work as expected: in other words the functionality is limited with this compiler, but not so much as to render the library unuseable. These failures appear to represent a genuine issue with the Boost.Random library that has yet to be addressed. These fail with an internal compiler error: there's no workaround as yet. This fails with an internal compiler error: there's no workaround as yet. These failures are completely spurious: they're caused by the tests being run with bjam -j2 and the post-processing not coping with the resulting output. These failures should clear if these tests are re-run at some point in the future. This library is almost unusable with VC7 due to name lookup issues. Older versions of MWCW incorrectly align pointers to member functions (they use 12-byte boundaries, rather than a power-of-2 boundary), leading to alignment_of / aligned_storage to fail with these types on this compiler. This tests whether inserting elements creates as few copies as I think is possible. If this fails it just means that the container might be a little inefficient. This test fail because it's using unordered's internal allocator traits, which doesn't work on Visual C++ 7.1. It normally uses the one from Boost.Container by default. boost::is_nothrow_move_constructible and boost::is_nothrow_move_assignable don't seem to work on this compiler. I'd hope that anyone wanting noexcept support would use a more recent compiler anyway. C++11 is the minimum requirement. The definition of a custom template specialization of std::swap appears to trigger an internal compiler error ("Fatal F1004") on CodeGear 6.10.0 (formerly named Borland), as I reported, with help from Nicola Musatti and David Dean. Related Boost mailing list discussion: http://lists.boost.org/Archives/boost/2008/11/144465.php CodeGear bug reports on this issue: http://qc.codegear.com/wc/qcmain.aspx?d=68959 http://qc.codegear.com/wc/qcmain.aspx?d=69196 Borland 5.9.3 has an error (E2285) when trying to pass a multi-dimensional array by reference to a function template. A bug report by Christopher Yeleighton appears related: "The compiler obligatorily converts member arrays to pointers" http://qc.codegear.com/wc/qcmain.aspx?d=10267 Compiler has a problem with BOOST_STATIC_CONSTANT in nested templates inside class template specializations. When I made the conversion from value_initialized<T> to T& const-correct, this specific compiler version gave compile errors. See also: Ticket #2548 - "Let's fix the logical constness of value_initialized!" This failure is caused by a compiler bug (default-constructed scalar types are not zero-initialized) that has been fixed in the latest versions of the compiler (VC 7.1 and greater). The test takes more that 30 minutes to compile and the compilation is automatically killed. It is likely caused by the compiler bug, but it unknown how much this bug affects regular use of the operators library. Is it also unknown if the test can be refactored so that not to trigger this bug. The test relies on Boost.Serialization which is not supported on this toolset. The test relies on Boost.Random which is not supported on this toolset. The test relies on Boost.Iterator (iterator_facade) which is not supported on this toolset. This toolset isn't supported because of the used Spirit V1.8.x, which in turn is not usable with this toolset. This toolset isn't supported because of the used multi_index library, which in turn is not usable with this toolset. These compilers do not support class template partial specialization. Boost.Proto doesn't work on this compiler. This compiler doesn't support SFINAE / enable_if Digital Mars cannot seem to handle dependent default template parameters, such as "template < class T, bool B = is_foo < T > ::value >" Boost.Proto doesn't work on the cray compiler. Boost.Proto doesn't work on the vacpp compiler. This library is unusable due to bug #5373 in Boost.Thread on this compiler. Windows Mobile lacks essential features of the standard C library like gmtime, mktime, localtime making it impossible to use Boost.Locale on this platform. Compiler does not support shared runtime linking thus is makes it problematic to use Boost.Locale as dll Problems with wide file stream I/O. Currently unresolved due to lack of access to the compiler. This test fails only intermittently. The failure is caused by a problem in Boost code. The Boost developers are aware of the problem and plan to fix it. The failure is caused by a compiler bug. The failure is caused by a compiler bug, which has been reported to the compiler supplier (or is already known to them). The failure is caused by a standard library bug. The failure is caused by a standard library bug, which has been reported to the standard library supplier (or is already known to them). The failure is probably caused by the test code, harness, or configuration. Thus, it may not affect users of the library. The failure is serious and likely to prevent all use of this Boost library with this compiler. The failure is serious and likely to prevent all use of this Boost library with this compiler. The failure is caused by a compiler bug, which has been reported to the compiler supplier (or is already known to them). The failure is caused by a platform API bug. The failure is caused by a platform API bug, which has been reported to the platform API supplier (or is already known to them). The failure is not serious and will not affect most users. The library degrades gracefully. This compiler's bugs are not supported by the library. Locales missing or adequately supported by this compiler. Missing or inadequate wchar/wstring/wstream support for this compiler. No std iterator traits for this compiler. Library has limited input/output support due to compiler inadequacies. No high precision clock for this platform. A bug in standard library prevents passing std::set from DLL to application. A fixed <tree> header is available from http://www.dinkumware.com/vc_fixes.html. Although the documentation from the Comeau website would make it appear that windows DLL's are supported using the --windows option, after some experimentation we have been unsuccessful in making dll configurations work correctly. The failure is caused by a runtime limitation. Locale support is only available with the static linked variant of the runtime. Generally the dynamic linked variant is required when building dynamic modules, DLL, so, etc. This failure is caused by a compiler bug with no known workaround. Patches are welcome! This failure is caused by bugs in the standard library implementation and/or bugs in the compiler. Unresearched failure -- please contact library developers for more information about possible causes. The test fails due to unresearched issues. The library developers are aware of this failure, but need help with investigating/addressing it for future releases. The support for this deficient compiler will be dropped starting from Boost 1.33.0 release. Please use one of the previous Boost releases if you need the library to work on this compiler. This failure is caused by compiler bugs or limitations. Some advanced or esoteric library features may be unavailable or only partially available. This does not impact most common uses of the library. This failure is caused by a compiler bug. Certain code constructs that should fail compilation are accepted by the compiler. This can mask some programming errors, but does not impact the usability of the library. The failures are caused by the wrong handling of the std::internal flag in the iostreams implementation of the standard library used on that compiler/platform combo. Apart from that, the format library works as expected. The failures are caused by the fact that the iword and pword arrays seem to share the same memory area in the iostreams implementation of the standard library used on that compiler/platform combo. As long as you stay clear of iword and pword, the library should work ok. This failure occurs only when using shared libraries for this compiler and platform, although the same programs should work properly when using static libraries. This problem has not been researched. Wide character support is disabled in the GNU Standard C++ library as supplied on the QNX Neutrino version 6.3.0 distribution. This problem is due to the non-conforming STLport implementation of vector's swap: it can be easily reproduced with the following code snippet: typedef std::vector<int> vector_type; typedef vector_type::reference reference_type; vector_type v1(4u, 1); vector_type v2(7u, 0); reference_type ref = v1[2]; int x = ref; std::swap(v1, v2); BOOST_CHECK(v2[2] == x); // ok v2[2] = 1 - v2[2]; BOOST_CHECK(ref != x); // oops When compiling this test, aCC6 runs out of memory. The HP compiler group is aware of this issue and is working on the fix. This test assumes native typeof support. This test assumes compiler support for rvalue references. These tests rely on the ability of an std::deque container to be constructed off two input iterators. Unfortunately, the Rogue Wave library version 2.2 and higher assumes iterator which has + and - operators which only random access iterator is required to provide. Internal compiler error: GCC Bugzilla Bug 33580. This is a regression in the gcc 4.2 series. These test failures are reported to be under investigation at HP's compiler lab. This compiler does not support gcc stdcall function attribute. The Rogue Wave standard library version used by this compiler provides a faulty vector<bool> iterator, which is not symmetric. There is an associated bug report in the Rogue Wave bug tracking system for this problem. The test does not compile, most likely because of new version of EDG Front End implementing Core Issue 574. In the HP bug tracking system, it is tracked as QuIX ID: QXCR1000804484. Depending on system load, the compile time may exceed specified timeout value. The test passes when the timeout value is increased. This test fails when BOOST_UBLAS_NO_NESTED_CLASS_RELATION is defined. This test fails because MinGW apparently does not always catch exceptions properly. This test requires variadic macro support. This test requires lambda function support. This test has not been updated to accomodate changes in Boost.Random.
================================================ FILE: status/explicit-failures.xsd ================================================ ================================================ FILE: tools/Jamfile.v2 ================================================ # Copyright 2005 Rene Rivera # Copyright 2005 Hartmut Kaiser # Copyright 2005 John Maddock # Copyright 2003 Vladimir Prus # Distributed under the Boost Software License, Version 1.0. # (See accompanying file LICENSE_1_0.txt or http://www.boost.org/LICENSE_1_0.txt) # Jamfile which builds all the tools. project : requirements static /boost//headers : usage-requirements /boost//headers ; TOOLS = bcp//bcp inspect/build//inspect quickbook//quickbook /boost/libs/wave/tool//wave ; install dist-bin : $(TOOLS) : EXE ../dist/bin : release ; install dist-lib : $(TOOLS) : LIB ../dist/lib : release ; local patterns = *.dtd *.xml *.xsl LICENSE ; local dirs = boostbook/dtd boostbook/xsl ; install dist-share-boostbook : [ glob $(dirs)/$(patterns) $(dirs)/*/$(patterns) $(dirs)/*/*/$(patterns) ] : ../dist/share . ; ================================================ FILE: tools/index.html ================================================ Boost Tools
boost.png (6897 bytes) Tools
Getting Started          Libraries         Web Site         News        Community         FAQ         More Info 

Boost developers, testers, and maintainers have developed various tools to help with the administration of the Boost Libraries. Like everything else about Boost, these tools are available in source form, and are part of the regular Boost distribution.

Users may find these tools useful when porting Boost libraries to a new platform, or for use with their own applications.

  • Boost.Build - The Boost build system, including the full Boost version of the jam sources.
     
  • Inspect - The inspection tool used to detect errors in the Boost directory hierarchy.
     
  • BoostBook - A Boost documentation system, based on DocBook and the Extensible Stylesheet Language (XSL), used by some Boost libraries.
     
  • bcp - A utility to extract subsets of Boost; to determine which parts of Boost your code is using; and to print reports on Boost usage (including Licence information).
     
  • QuickBook - QuickBook is a WikiWiki style documentation tool geared towards C++ documentation using simple rules and markup for simple formatting tasks. QuickBook generates BoostBook XML.
     
  • Wave - A Standards conformant C/C++ preprocessor usable on top of any other compiler. Usable for instance for the debugging of the expansion of macros in your code or as a replacement for your built-in preprocessor.
     
  • AutoIndex - A tool for indexing Boostbook/Docbook documents.
     

Revised 13 Mar 2008

Copyright Beman Dawes 2003
Copyright Douglas Gregor 2003
Copyright Aleksey Gurtovoy 2004
Copyright John Maddock 2004
Copyright Eric Niebler 2005
Copyright Hartmut Kaiser 2005

Distributed under the Boost Software License, Version 1.0. (See file LICENSE_1_0.txt or www.boost.org/LICENSE_1_0.txt)

================================================ FILE: tools/make-cputime-page.pl ================================================ #!/usr/bin/perl -w # Copyright 2004 Aleksey Gurtovoy # Copyright 2001 Jens Maurer # Distributed under the Boost Software License, Version 1.0. # (See accompanying file LICENSE_1_0.txt or http://www.boost.org/LICENSE_1_0.txt) use strict; my $filename; my $compiler; my $time = 0; my $ct = 0; my $first = 2; print "\n\n\nCompile Times\n\n\n"; print "\n"; print ""; print "

\n"; print "Compile time for each successful regression test in seconds.\n"; print "

\n"; print "\n"; print "\n"; while(<>) { if(/^\*\*\* (.*) \*\*\*$/) { $filename = $1; $first = ($first == 0 ? 0 : $first-1); if($first == 0) { print "\n\n\n\n"; } } elsif(/^\*\* (.*)/) { $compiler = $1; if($first) { print "\n"; } else { $ct = 1; } } elsif($ct && /^CPU time: ([.0-9]*) s user, ([.0-9]*) s system/) { $time = $1 + $2; } elsif($ct && /^Pass$/) { printf "\n", $time; $ct = 0; } elsif($ct && /^Fail$/) { print "\n"; $ct = 0; } } print "\n"; print "
Test
$filename$compiler%.02f-
\n"; print "\n\n";