[
  {
    "path": ".drone/drone.sh",
    "content": "#!/bin/bash\n\n# Copyright 2020 Rene Rivera, Sam Darwin\n# Distributed under the Boost Software License, Version 1.0.\n# (See accompanying file LICENSE.txt or copy at http://boost.org/LICENSE_1_0.txt)\n\nset -e\nexport TRAVIS_BUILD_DIR=$(pwd)\nexport DRONE_BUILD_DIR=$(pwd)\nexport TRAVIS_BRANCH=$DRONE_BRANCH\nexport VCS_COMMIT_ID=$DRONE_COMMIT\nexport GIT_COMMIT=$DRONE_COMMIT\nexport REPO_NAME=$DRONE_REPO\nexport PATH=~/.local/bin:/usr/local/bin:$PATH\n\nif [ \"$DRONE_JOB_BUILDTYPE\" == \"boost\" ]; then\n\necho '==================================> INSTALL'\n\nBOOST_BRANCH=develop && [ \"$TRAVIS_BRANCH\" == \"master\" ] && BOOST_BRANCH=master || true\ncd ..\ngit clone -b $BOOST_BRANCH https://github.com/boostorg/boost.git boost-root\ncd boost-root\ngit submodule update --init tools/build\ngit submodule update --init libs/config\ngit submodule update --init tools/boostdep\ncp -r $TRAVIS_BUILD_DIR/* libs/serialization\npython tools/boostdep/depinst/depinst.py serialization\n./bootstrap.sh\n./b2 headers\n\necho '==================================> SCRIPT'\n\necho \"using $TOOLSET : : $TRAVIS_COMPILER ;\" > ~/user-config.jam\n./b2 -j 3 libs/serialization/test toolset=$TOOLSET link=${LINK:-shared}\n\nfi\n"
  },
  {
    "path": ".drone.star",
    "content": "# Use, modification, and distribution are\n# subject to the Boost Software License, Version 1.0. (See accompanying\n# file LICENSE.txt)\n#\n# Copyright Rene Rivera 2020.\n\n# For Drone CI we use the Starlark scripting language to reduce duplication.\n# As the yaml syntax for Drone CI is rather limited.\n#\n#\nglobalenv={}\nlinuxglobalimage=\"cppalliance/droneubuntu1604:1\"\nwindowsglobalimage=\"cppalliance/dronevs2019\"\n\ndef main(ctx):\n  return [\n  linux_cxx(\"TOOLSET=gcc LINK=static,shared Job 0\", \"g++\", packages=\"\", buildtype=\"boost\", buildscript=\"drone\", image=linuxglobalimage, environment={'TOOLSET': 'gcc', 'LINK': 'static,shared', 'TRAVIS_COMPILER': 'g++', 'DRONE_JOB_UUID': 'b6589fc6ab'}, globalenv=globalenv),\n  linux_cxx(\"TOOLSET=gcc LINK=static,shared Job 1\", \"g++\", packages=\"g++-5\", buildtype=\"boost\", buildscript=\"drone\", image=linuxglobalimage, environment={'TOOLSET': 'gcc', 'LINK': 'static,shared', 'TRAVIS_COMPILER': 'g++-5', 'DRONE_JOB_UUID': '356a192b79'}, globalenv=globalenv),\n  linux_cxx(\"TOOLSET=gcc LINK=static,shared Job 2\", \"g++\", packages=\"g++-6\", buildtype=\"boost\", buildscript=\"drone\", image=linuxglobalimage, environment={'TOOLSET': 'gcc', 'LINK': 'static,shared', 'TRAVIS_COMPILER': 'g++-6', 'DRONE_JOB_UUID': 'da4b9237ba'}, globalenv=globalenv),\n  linux_cxx(\"TOOLSET=gcc LINK=static,shared Job 3\", \"g++\", packages=\"g++-7\", buildtype=\"boost\", buildscript=\"drone\", image=linuxglobalimage, environment={'TOOLSET': 'gcc', 'LINK': 'static,shared', 'TRAVIS_COMPILER': 'g++-7', 'DRONE_JOB_UUID': '77de68daec'}, globalenv=globalenv),\n  linux_cxx(\"TOOLSET=clang LINK=static,shared Job 4\", \"clang++\", packages=\"\", buildtype=\"boost\", buildscript=\"drone\", image=linuxglobalimage, environment={'TOOLSET': 'clang', 'LINK': 'static,shared', 'TRAVIS_COMPILER': 'clang++', 'DRONE_JOB_UUID': '1b64538924'}, globalenv=globalenv),\n  linux_cxx(\"TOOLSET=clang LINK=static,shared Job 5\", \"clang++\", packages=\"libc++-dev\", buildtype=\"boost\", buildscript=\"drone\", image=linuxglobalimage, environment={'TOOLSET': 'clang', 'LINK': 'static,shared', 'TRAVIS_COMPILER': 'clang++-libc++', 'DRONE_JOB_UUID': 'ac3478d69a'}, globalenv=globalenv),\n  osx_cxx(\"TOOLSET=clang LINK=static,shared Job 6\", \"clang++\", packages=\"\", buildtype=\"boost\", buildscript=\"drone\", environment={'TOOLSET': 'clang', 'LINK': 'static,shared', 'TRAVIS_COMPILER': 'clang++', 'DRONE_JOB_UUID': 'c1dfd96eea'}, globalenv=globalenv),\n  osx_cxx(\"TOOLSET=clang LINK=static,shared Job 7\", \"clang++\", packages=\"\", buildtype=\"boost\", buildscript=\"drone\", xcode_version=\"10\", environment={'TOOLSET': 'clang', 'LINK': 'static,shared', 'TRAVIS_COMPILER': 'clang++', 'DRONE_JOB_UUID': '902ba3cda1'}, globalenv=globalenv),\n    ]\n\n# from https://github.com/boostorg/boost-ci\nload(\"@boost_ci//ci/drone/:functions.star\", \"linux_cxx\",\"windows_cxx\",\"osx_cxx\",\"freebsd_cxx\")\n"
  },
  {
    "path": ".gitattributes",
    "content": "* text=auto !eol svneol=native#text/plain\n*.gitattributes text svneol=native#text/plain\n\n# Scriptish formats\n*.bat        text svneol=native#text/plain\n*.bsh        text svneol=native#text/x-beanshell\n*.cgi        text svneol=native#text/plain\n*.cmd        text svneol=native#text/plain\n*.js         text svneol=native#text/javascript\n*.php        text svneol=native#text/x-php\n*.pl         text svneol=native#text/x-perl\n*.pm         text svneol=native#text/x-perl\n*.py         text svneol=native#text/x-python\n*.sh         eol=lf svneol=LF#text/x-sh\nconfigure    eol=lf svneol=LF#text/x-sh\n\n# Image formats\n*.bmp        binary svneol=unset#image/bmp\n*.gif        binary svneol=unset#image/gif\n*.ico        binary svneol=unset#image/ico\n*.jpeg       binary svneol=unset#image/jpeg\n*.jpg        binary svneol=unset#image/jpeg\n*.png        binary svneol=unset#image/png\n*.tif        binary svneol=unset#image/tiff\n*.tiff       binary svneol=unset#image/tiff\n*.svg        text svneol=native#image/svg%2Bxml\n\n# Data formats\n*.pdf        binary svneol=unset#application/pdf\n*.avi        binary svneol=unset#video/avi\n*.doc        binary svneol=unset#application/msword\n*.dsp        text svneol=crlf#text/plain\n*.dsw        text svneol=crlf#text/plain\n*.eps        binary svneol=unset#application/postscript\n*.gz         binary svneol=unset#application/gzip\n*.mov        binary svneol=unset#video/quicktime\n*.mp3        binary svneol=unset#audio/mpeg\n*.ppt        binary svneol=unset#application/vnd.ms-powerpoint\n*.ps         binary svneol=unset#application/postscript\n*.psd        binary svneol=unset#application/photoshop\n*.rdf        binary svneol=unset#text/rdf\n*.rss        text svneol=unset#text/xml\n*.rtf        binary svneol=unset#text/rtf\n*.sln        text svneol=native#text/plain\n*.swf        binary svneol=unset#application/x-shockwave-flash\n*.tgz        binary svneol=unset#application/gzip\n*.vcproj     text svneol=native#text/xml\n*.vcxproj    text svneol=native#text/xml\n*.vsprops    text svneol=native#text/xml\n*.wav        binary svneol=unset#audio/wav\n*.xls        binary svneol=unset#application/vnd.ms-excel\n*.zip        binary svneol=unset#application/zip\n\n# Text formats\n.htaccess    text svneol=native#text/plain\n*.bbk        text svneol=native#text/xml\n*.cmake      text svneol=native#text/plain\n*.css        text svneol=native#text/css\n*.dtd        text svneol=native#text/xml\n*.htm        text svneol=native#text/html\n*.html       text svneol=native#text/html\n*.ini        text svneol=native#text/plain\n*.log        text svneol=native#text/plain\n*.mak        text svneol=native#text/plain\n*.qbk        text svneol=native#text/plain\n*.rst        text svneol=native#text/plain\n*.sql        text svneol=native#text/x-sql\n*.txt        text svneol=native#text/plain\n*.xhtml      text svneol=native#text/xhtml%2Bxml\n*.xml        text svneol=native#text/xml\n*.xsd        text svneol=native#text/xml\n*.xsl        text svneol=native#text/xml\n*.xslt       text svneol=native#text/xml\n*.xul        text svneol=native#text/xul\n*.yml        text svneol=native#text/plain\nboost-no-inspect text svneol=native#text/plain\nCHANGES      text svneol=native#text/plain\nCOPYING      text svneol=native#text/plain\nINSTALL      text svneol=native#text/plain\nJamfile      text svneol=native#text/plain\nJamroot      text svneol=native#text/plain\nJamfile.v2   text svneol=native#text/plain\nJamrules     text svneol=native#text/plain\nMakefile*    text svneol=native#text/plain\nREADME       text svneol=native#text/plain\nTODO         text svneol=native#text/plain\n\n# Code formats\n*.c          text svneol=native#text/plain\n*.cpp        text svneol=native#text/plain\n*.h          text svneol=native#text/plain\n*.hpp        text svneol=native#text/plain\n*.ipp        text svneol=native#text/plain\n*.tpp        text svneol=native#text/plain\n*.jam        text svneol=native#text/plain\n*.java       text svneol=native#text/plain\n"
  },
  {
    "path": ".github/workflows/posix.yml",
    "content": "# Copyright 2020-2021 Peter Dimov\n# Copyright 2021 Andrey Semashev\n# Copyright 2021 Alexander Grund\n# Copyright 2022 James E. King III\n# Copyright 2023 Matt Borland\n#\n# Distributed under the Boost Software License, Version 1.0.\n# (See accompanying file LICENSE_1_0.txt or copy at http://boost.org/LICENSE_1_0.txt)\n\nname: POSIX\n\non:\n  pull_request:\n  push:\n    branches:\n      - master\n      - develop\n      - feature/**\n\nconcurrency:\n  group: ${{ github.workflow }}-${{ github.ref }}\n  cancel-in-progress: true\n\nenv:\n  LIBRARY: serialization\n  UBSAN_OPTIONS: print_stacktrace=1\n  GIT_FETCH_JOBS: 8\n  NET_RETRY_COUNT: 5\n  DEFAULT_BUILD_VARIANT: release\n\njobs:\n  CI:\n    defaults:\n      run:\n        shell: bash\n    strategy:\n      fail-fast: false\n      matrix:\n        include:\n          - toolset: gcc-4.8\n            cxxstd: \"11\"\n            address_model: 64\n            os: ubuntu-latest\n            container: ubuntu:16.04\n            install:\n              - g++-4.8\n            sources:\n              - \"ppa:ubuntu-toolchain-r/test\"\n          - toolset: gcc-4.9\n            cxxstd: \"11\"\n            address_model: 64\n            os: ubuntu-latest\n            container: ubuntu:16.04\n            install:\n              - g++-4.9\n            sources:\n              - \"ppa:ubuntu-toolchain-r/test\"\n          - toolset: gcc-5\n            cxxstd: \"11,14,1z\"\n            address_model: 64\n            os: ubuntu-latest\n            container: ubuntu:16.04\n            install:\n              - g++-5-multilib\n          - toolset: gcc-5\n            cxxstd: \"11-gnu,14-gnu,1z-gnu\"\n            address_model: 64\n            os: ubuntu-latest\n            container: ubuntu:16.04\n            install:\n              - g++-5-multilib\n          - toolset: gcc-6\n            cxxstd: \"11,14,1z\"\n            address_model: 64\n            os: ubuntu-latest\n            container: ubuntu:18.04\n            install:\n              - g++-6-multilib\n          - toolset: gcc-7\n            cxxstd: \"11,14,17\"\n            address_model: 64\n            os: ubuntu-latest\n            container: ubuntu:18.04\n            install:\n              - g++-7-multilib\n          - toolset: gcc-8\n            cxxstd: \"11,14,17,2a\"\n            address_model: 64\n            os: ubuntu-latest\n            container: ubuntu:18.04\n            install:\n              - g++-8-multilib\n          - toolset: gcc-9\n            cxxstd: \"11,14,17,2a\"\n            address_model: 64\n            os: ubuntu-20.04\n            install:\n              - g++-9-multilib\n          - toolset: gcc-9\n            cxxstd: \"11-gnu,14-gnu,17-gnu,2a-gnu\"\n            address_model: 64\n            os: ubuntu-20.04\n            install:\n              - g++-9-multilib\n          - toolset: gcc-10\n            cxxstd: \"11,14,17,20\"\n            address_model: 64\n            os: ubuntu-20.04\n            install:\n              - g++-10-multilib\n          - toolset: gcc-11\n            cxxstd: \"11,14,17,20,23\"\n            address_model: 64\n            os: ubuntu-22.04\n            install:\n              - g++-11-multilib\n          - toolset: gcc-12\n            cxxstd: \"11,14,17,20,23\"\n            address_model: 64\n            os: ubuntu-22.04\n            install:\n              - g++-12-multilib\n          - toolset: gcc-12\n            cxxstd: \"11-gnu,14-gnu,17-gnu,20-gnu,23-gnu\"\n            address_model: 64\n            os: ubuntu-22.04\n            install:\n              - g++-12-multilib\n          - name: UBSAN\n            toolset: gcc-12\n            cxxstd: \"11,20\"\n            address_model: 64\n            ubsan: 1\n            os: ubuntu-22.04\n            install:\n              - g++-12-multilib\n\n          # Linux, clang\n          - toolset: clang\n            compiler: clang++-3.7\n            cxxstd: \"11,14\"\n            os: ubuntu-latest\n            container: ubuntu:16.04\n            install:\n              - clang-3.7\n          - toolset: clang\n            compiler: clang++-3.8\n            cxxstd: \"11,14\"\n            os: ubuntu-latest\n            container: ubuntu:16.04\n            install:\n              - clang-3.8\n          - toolset: clang\n            compiler: clang++-3.9\n            cxxstd: \"11,14\"\n            os: ubuntu-latest\n            container: ubuntu:18.04\n            install:\n              - clang-3.9\n          - toolset: clang\n            compiler: clang++-4.0\n            cxxstd: \"11,14\"\n            os: ubuntu-latest\n            container: ubuntu:18.04\n            install:\n              - clang-4.0\n          - toolset: clang\n            compiler: clang++-5.0\n            cxxstd: \"11,14,1z\"\n            os: ubuntu-latest\n            container: ubuntu:18.04\n            install:\n              - clang-5.0\n          - toolset: clang\n            compiler: clang++-6.0\n            cxxstd: \"11,14,17\"\n            os: ubuntu-latest\n            container: ubuntu:18.04\n            install:\n              - clang-6.0\n          - toolset: clang\n            compiler: clang++-7\n            cxxstd: \"11,14,17\"\n            os: ubuntu-latest\n            container: ubuntu:18.04\n            install:\n              - clang-7\n          # Note: clang-8 does not fully support C++20, so it is not compatible with libstdc++-8 in this mode\n          - toolset: clang\n            compiler: clang++-8\n            cxxstd: \"11,14,17,2a\"\n            os: ubuntu-latest\n            container: ubuntu:18.04\n            install:\n              - clang-8\n              - g++-7\n            gcc_toolchain: 7\n          - toolset: clang\n            compiler: clang++-9\n            cxxstd: \"11,14,17,2a\"\n            os: ubuntu-20.04\n            install:\n              - clang-9\n          - toolset: clang\n            compiler: clang++-10\n            cxxstd: \"11,14,17,20\"\n            os: ubuntu-20.04\n            install:\n              - clang-10\n          - toolset: clang\n            compiler: clang++-11\n            cxxstd: \"11,14,17,20\"\n            os: ubuntu-22.04\n            install:\n              - clang-11\n          - toolset: clang\n            compiler: clang++-12\n            cxxstd: \"11,14,17,20,2b\"\n            os: ubuntu-22.04\n            install:\n              - clang-12\n          - toolset: clang\n            compiler: clang++-13\n            cxxstd: \"11,14,17,20,2b\"\n            os: ubuntu-22.04\n            install:\n              - clang-13\n          - toolset: clang\n            compiler: clang++-14\n            cxxstd: \"11,14,17,20,2b\"\n            os: ubuntu-22.04\n            install:\n              - clang-14\n          - toolset: clang\n            compiler: clang++-14\n            cxxstd: \"11-gnu,14-gnu,17-gnu,20-gnu,2b-gnu\"\n            os: ubuntu-22.04\n            install:\n              - clang-14\n          - toolset: clang\n            compiler: clang++-15\n            cxxstd: \"11,14,17,20,2b\"\n            os: ubuntu-22.04\n            install:\n              - clang-15\n            sources:\n              - \"deb http://apt.llvm.org/jammy/ llvm-toolchain-jammy-15 main\"\n            source_keys:\n              - \"https://apt.llvm.org/llvm-snapshot.gpg.key\"\n          - toolset: clang\n            compiler: clang++-15\n            cxxstd: \"11,14,17,20,2b\"\n            os: ubuntu-22.04\n            install:\n              - clang-15\n              - libc++-15-dev\n              - libc++abi-15-dev\n            sources:\n              - \"deb http://apt.llvm.org/jammy/ llvm-toolchain-jammy-15 main\"\n            source_keys:\n              - \"https://apt.llvm.org/llvm-snapshot.gpg.key\"\n            cxxflags: -stdlib=libc++\n            linkflags: -stdlib=libc++\n\n          - toolset: clang\n            cxxstd: \"11,14,17,2a\"\n            os: macos-11\n          - toolset: clang\n            cxxstd: \"11,14,17,20,2b\"\n            os: macos-12\n\n    timeout-minutes: 360\n    runs-on: ${{matrix.os}}\n    container: ${{matrix.container}}\n\n    steps:\n      - name: Setup environment\n        run: |\n            if [ -f \"/etc/debian_version\" ]\n            then\n                echo \"DEBIAN_FRONTEND=noninteractive\" >> $GITHUB_ENV\n                export DEBIAN_FRONTEND=noninteractive\n            fi\n            if [ -n \"${{matrix.container}}\" ]\n            then\n                echo \"GHA_CONTAINER=${{matrix.container}}\" >> $GITHUB_ENV\n                if [ -f \"/etc/debian_version\" ]\n                then\n                    apt-get -o Acquire::Retries=$NET_RETRY_COUNT update\n                    if [ \"$(apt-cache search \"^python-is-python3$\" | wc -l)\" -ne 0 ]\n                    then\n                        PYTHON_PACKAGE=\"python-is-python3\"\n                    else\n                        PYTHON_PACKAGE=\"python\"\n                    fi\n                    apt-get -o Acquire::Retries=$NET_RETRY_COUNT install -y sudo software-properties-common tzdata wget curl apt-transport-https ca-certificates make build-essential g++ $PYTHON_PACKAGE python3 perl git cmake\n                fi\n            fi\n            git config --global pack.threads 0\n      - uses: actions/checkout@v3\n\n      - name: Install packages\n        if: matrix.install\n        run: |\n            declare -a SOURCE_KEYS SOURCES\n            if [ -n \"${{join(matrix.source_keys, ' ')}}\" ]\n            then\n                SOURCE_KEYS=(\"${{join(matrix.source_keys, '\" \"')}}\")\n            fi\n            if [ -n \"${{join(matrix.sources, ' ')}}\" ]\n            then\n                SOURCES=(\"${{join(matrix.sources, '\" \"')}}\")\n            fi\n            for key in \"${SOURCE_KEYS[@]}\"\n            do\n                for i in {1..$NET_RETRY_COUNT}\n                do\n                    echo \"Adding key: $key\"\n                    wget -O - \"$key\" | sudo apt-key add - && break || sleep 2\n                done\n            done\n            if [ ${#SOURCES[@]} -gt 0 ]\n            then\n                APT_ADD_REPO_COMMON_ARGS=(\"-y\")\n                APT_ADD_REPO_SUPPORTED_ARGS=\"$(apt-add-repository --help | perl -ne 'if (/^\\s*-n/) { print \"n\"; } elsif (/^\\s*-P/) { print \"P\"; } elsif (/^\\s*-S/) { print \"S\"; } elsif (/^\\s*-U/) { print \"U\"; }')\"\n                if [ -n \"$APT_ADD_REPO_SUPPORTED_ARGS\" -a -z \"${APT_ADD_REPO_SUPPORTED_ARGS##*n*}\" ]\n                then\n                    APT_ADD_REPO_COMMON_ARGS+=(\"-n\")\n                fi\n                APT_ADD_REPO_HAS_SOURCE_ARGS=\"$([ -n \"$APT_ADD_REPO_SUPPORTED_ARGS\" -a -z \"${APT_ADD_REPO_SUPPORTED_ARGS##*P*}\" -a -z \"${APT_ADD_REPO_SUPPORTED_ARGS##*S*}\" -a -z \"${APT_ADD_REPO_SUPPORTED_ARGS##*U*}\" ] && echo 1 || echo 0)\"\n                for source in \"${SOURCES[@]}\"\n                do\n                    for i in {1..$NET_RETRY_COUNT}\n                    do\n                        APT_ADD_REPO_ARGS=(\"${APT_ADD_REPO_COMMON_ARGS[@]}\")\n                        if [ $APT_ADD_REPO_HAS_SOURCE_ARGS -ne 0 ]\n                        then\n                            case \"$source\" in\n                            \"ppa:\"*)\n                                APT_ADD_REPO_ARGS+=(\"-P\")\n                                ;;\n                            \"deb \"*)\n                                APT_ADD_REPO_ARGS+=(\"-S\")\n                                ;;\n                            *)\n                                APT_ADD_REPO_ARGS+=(\"-U\")\n                                ;;\n                            esac\n                        fi\n                        APT_ADD_REPO_ARGS+=(\"$source\")\n                        echo \"apt-add-repository ${APT_ADD_REPO_ARGS[@]}\"\n                        sudo -E apt-add-repository \"${APT_ADD_REPO_ARGS[@]}\" && break || sleep 2\n                    done\n                done\n            fi\n            sudo apt-get -o Acquire::Retries=$NET_RETRY_COUNT update\n            sudo apt-get -o Acquire::Retries=$NET_RETRY_COUNT install -y ${{join(matrix.install, ' ')}}\n      - name: Setup GCC Toolchain\n        if: matrix.gcc_toolchain\n        run: |\n            GCC_TOOLCHAIN_ROOT=\"$HOME/gcc-toolchain\"\n            echo \"GCC_TOOLCHAIN_ROOT=\\\"$GCC_TOOLCHAIN_ROOT\\\"\" >> $GITHUB_ENV\n            MULTIARCH_TRIPLET=\"$(dpkg-architecture -qDEB_HOST_MULTIARCH)\"\n            mkdir -p \"$GCC_TOOLCHAIN_ROOT\"\n            ln -s /usr/include \"$GCC_TOOLCHAIN_ROOT/include\"\n            ln -s /usr/bin \"$GCC_TOOLCHAIN_ROOT/bin\"\n            mkdir -p \"$GCC_TOOLCHAIN_ROOT/lib/gcc/$MULTIARCH_TRIPLET\"\n            ln -s \"/usr/lib/gcc/$MULTIARCH_TRIPLET/${{matrix.gcc_toolchain}}\" \"$GCC_TOOLCHAIN_ROOT/lib/gcc/$MULTIARCH_TRIPLET/${{matrix.gcc_toolchain}}\"\n      - name: Setup Boost\n        run: |\n            echo GITHUB_REPOSITORY: $GITHUB_REPOSITORY\n            LIBRARY=${GITHUB_REPOSITORY#*/}\n            echo LIBRARY: $LIBRARY\n            echo \"LIBRARY=$LIBRARY\" >> $GITHUB_ENV\n            echo GITHUB_BASE_REF: $GITHUB_BASE_REF\n            echo GITHUB_REF: $GITHUB_REF\n            REF=${GITHUB_BASE_REF:-$GITHUB_REF}\n            REF=${REF#refs/heads/}\n            echo REF: $REF\n            BOOST_BRANCH=develop && [ \"$REF\" = \"master\" ] && BOOST_BRANCH=master || true\n            echo BOOST_BRANCH: $BOOST_BRANCH\n            BUILD_JOBS=$((nproc || sysctl -n hw.ncpu) 2> /dev/null)\n            echo \"BUILD_JOBS=$BUILD_JOBS\" >> $GITHUB_ENV\n            echo \"CMAKE_BUILD_PARALLEL_LEVEL=$BUILD_JOBS\" >> $GITHUB_ENV\n            DEPINST_ARGS=()\n            GIT_VERSION=\"$(git --version | sed -e 's/git version //')\"\n            GIT_HAS_JOBS=1\n            if [ -f \"/etc/debian_version\" ]\n            then\n                if $(dpkg --compare-versions \"$GIT_VERSION\" lt 2.8.0)\n                then\n                    GIT_HAS_JOBS=0\n                fi\n            else\n                declare -a GIT_VER=(${GIT_VERSION//./ })\n                declare -a GIT_MIN_VER=(2 8 0)\n                for ((i=0; i<${#GIT_VER[@]}; i++))\n                do\n                    if [ -z \"${GIT_MIN_VER[i]}\" ]\n                    then\n                        GIT_MIN_VER[i]=0\n                    fi\n                    if [ \"${GIT_VER[i]}\" -lt \"${GIT_MIN_VER[i]}\" ]\n                    then\n                        GIT_HAS_JOBS=0\n                        break\n                    fi\n                done\n            fi\n            if [ \"$GIT_HAS_JOBS\" -ne 0 ]\n            then\n                DEPINST_ARGS+=(\"--git_args\" \"--jobs $GIT_FETCH_JOBS\")\n            fi\n            cd ..\n            git clone -b \"$BOOST_BRANCH\" --depth 1 \"https://github.com/boostorg/boost.git\" \"boost-root\"\n            cd boost-root\n            mkdir -p libs/$LIBRARY\n            cp -r $GITHUB_WORKSPACE/* libs/$LIBRARY\n            git submodule update --init tools/boostdep\n            DEPINST_ARGS+=(\"$LIBRARY\")\n            python tools/boostdep/depinst/depinst.py \"${DEPINST_ARGS[@]}\"\n            if [ -z \"${{matrix.cmake_tests}}\" ]\n            then\n                ./bootstrap.sh\n                ./b2 headers\n                if [ -n \"${{matrix.compiler}}\" -o -n \"$GCC_TOOLCHAIN_ROOT\" ]\n                then\n                    echo -n \"using ${{matrix.toolset}} : : ${{matrix.compiler}}\" > ~/user-config.jam\n                    if [ -n \"$GCC_TOOLCHAIN_ROOT\" ]\n                    then\n                        echo -n \" : <compileflags>\\\"--gcc-toolchain=$GCC_TOOLCHAIN_ROOT\\\" <linkflags>\\\"--gcc-toolchain=$GCC_TOOLCHAIN_ROOT\\\"\" >> ~/user-config.jam\n                    fi\n                    echo \" ;\" >> ~/user-config.jam\n                fi\n            fi\n      - name: Run tests\n        if: matrix.cmake_tests == ''\n        run: |\n            cd ../boost-root\n            B2_ARGS=(\"-j\" \"$BUILD_JOBS\" \"toolset=${{matrix.toolset}}\" \"cxxstd=${{matrix.cxxstd}}\" \"link=static,shared\")\n            if [ -n \"${{matrix.build_variant}}\" ]\n            then\n                B2_ARGS+=(\"variant=${{matrix.build_variant}}\")\n            else\n                B2_ARGS+=(\"variant=$DEFAULT_BUILD_VARIANT\")\n            fi\n            if [ -n \"${{matrix.threading}}\" ]\n            then\n                B2_ARGS+=(\"threading=${{matrix.threading}}\")\n            fi\n            if [ -n \"${{matrix.ubsan}}\" ]\n            then\n                export UBSAN_OPTIONS=\"print_stacktrace=1\"\n                B2_ARGS+=(\"cxxflags=-fsanitize=undefined -fno-sanitize-recover=undefined\" \"linkflags=-fsanitize=undefined -fuse-ld=gold\" \"define=UBSAN=1\" \"debug-symbols=on\" \"visibility=global\")\n            fi\n            if [ -n \"${{matrix.cxxflags}}\" ]\n            then\n                B2_ARGS+=(\"cxxflags=${{matrix.cxxflags}}\")\n            fi\n            if [ -n \"${{matrix.linkflags}}\" ]\n            then\n                B2_ARGS+=(\"linkflags=${{matrix.linkflags}}\")\n            fi\n            if [ -n \"${{matrix.address_model}}\" ]\n            then\n                B2_ARGS+=(\"address-model=${{matrix.address_model}}\")\n            fi\n            B2_ARGS+=(\"libs/$LIBRARY/test\")\n            ./b2 \"${B2_ARGS[@]}\"\n"
  },
  {
    "path": ".github/workflows/windows.yml",
    "content": "name: Windows\n\non:\n  pull_request:\n  push:\n    branches:\n      - master\n      - develop\n      - feature/**\n\nconcurrency:\n  group: ${{ github.workflow }}-${{ github.ref }}\n  cancel-in-progress: true\n\nenv:\n  LIBRARY: serialization\n\njobs:\n  CI:\n    strategy:\n      fail-fast: false\n      matrix:\n        include:\n          - toolset: msvc-14.0\n            cxxstd: \"11,14\"\n            addrmd: 32,64\n            os: windows-2019\n          - toolset: msvc-14.2\n            cxxstd: \"14,17,latest\"\n            addrmd: 32,64\n            os: windows-2019\n          - toolset: msvc-14.3\n            cxxstd: \"17,20,latest\"\n            addrmd: 32,64\n            os: windows-2022\n          - toolset: clang-win\n            cxxstd: \"14,17,latest\"\n            addrmd: 32,64\n            os: windows-2022\n          - toolset: gcc\n            cxxstd: \"11,14,17,2a\"\n            addrmd: 64\n            os: windows-2019\n\n    runs-on: ${{matrix.os}}\n\n    steps:\n      - uses: actions/checkout@v3\n\n      - name: Setup Boost\n        shell: cmd\n        run: |\n          echo GITHUB_REPOSITORY: %GITHUB_REPOSITORY%\n          for /f %%i in (\"%GITHUB_REPOSITORY%\") do set LIBRARY=%%~nxi\n          echo LIBRARY: %LIBRARY%\n          echo LIBRARY=%LIBRARY%>>%GITHUB_ENV%\n          echo GITHUB_BASE_REF: %GITHUB_BASE_REF%\n          echo GITHUB_REF: %GITHUB_REF%\n          if \"%GITHUB_BASE_REF%\" == \"\" set GITHUB_BASE_REF=%GITHUB_REF%\n          set BOOST_BRANCH=develop\n          for /f %%i in (\"%GITHUB_BASE_REF%\") do if \"%%~nxi\" == \"master\" set BOOST_BRANCH=master\n          echo BOOST_BRANCH: %BOOST_BRANCH%\n          cd ..\n          git clone -b %BOOST_BRANCH% --depth 1 https://github.com/boostorg/boost.git boost-root\n          cd boost-root\n          xcopy /s /e /q %GITHUB_WORKSPACE% libs\\%LIBRARY%\\\n          git submodule update --init tools/boostdep\n          python tools/boostdep/depinst/depinst.py --git_args \"--jobs 3\" %LIBRARY%\n          cmd /c bootstrap\n          b2 -d0 headers\n\n      - name: Run tests\n        shell: cmd\n        run: |\n          cd ../boost-root\n          b2 -j3 libs/%LIBRARY%/test toolset=${{matrix.toolset}} cxxstd=${{matrix.cxxstd}} address-model=${{matrix.addrmd}} variant=release\n"
  },
  {
    "path": ".gitignore",
    "content": ""
  },
  {
    "path": ".travis.yml",
    "content": "# Copyright 2016, 2017 Peter Dimov\n# Distributed under the Boost Software License, Version 1.0.\n# (See accompanying file LICENSE_1_0.txt or copy at http://boost.org/LICENSE_1_0.txt)\n\nlanguage: cpp\n\nsudo: false\n\ncache:\n  ccache: true\n\nbranches:\n  only:\n    - master\n    - develop\n    - /feature\\/.*/\n\nenv:\n  matrix:\n    - BOGUS_JOB=true\n\nmatrix:\n\n  exclude:\n    - env: BOGUS_JOB=true\n\n  include:\n    - os: linux\n      compiler: g++\n      env: TOOLSET=gcc LINK=static,shared\n\n    - os: linux\n      compiler: g++-5\n      env: TOOLSET=gcc LINK=static,shared\n      addons:\n        apt:\n          packages:\n            - g++-5\n          sources:\n            - ubuntu-toolchain-r-test\n\n    - os: linux\n      compiler: g++-6\n      env: TOOLSET=gcc LINK=static,shared\n      addons:\n        apt:\n          packages:\n            - g++-6\n          sources:\n            - ubuntu-toolchain-r-test\n\n    - os: linux\n      compiler: g++-7\n      env: TOOLSET=gcc LINK=static,shared\n      addons:\n        apt:\n          packages:\n            - g++-7\n          sources:\n            - ubuntu-toolchain-r-test\n\n    - os: linux\n      compiler: clang++\n      env: TOOLSET=clang LINK=static,shared\n\n    - os: linux\n      compiler: clang++-libc++\n      env: TOOLSET=clang LINK=static,shared\n      addons:\n        apt:\n          packages:\n            - libc++-dev\n\n    - os: osx\n      compiler: clang++\n      env: TOOLSET=clang LINK=static,shared\n\n    - os: osx\n      osx_image: xcode10\n      compiler: clang++\n      env: TOOLSET=clang LINK=static,shared\n\ninstall:\n  - BOOST_BRANCH=develop && [ \"$TRAVIS_BRANCH\" == \"master\" ] && BOOST_BRANCH=master || true\n  - cd ..\n  - git clone -b $BOOST_BRANCH https://github.com/boostorg/boost.git boost-root\n  - cd boost-root\n  - git submodule update --init tools/build\n  - git submodule update --init libs/config\n  - git submodule update --init tools/boostdep\n  - cp -r $TRAVIS_BUILD_DIR/* libs/serialization\n  - python tools/boostdep/depinst/depinst.py serialization\n  - ./bootstrap.sh\n  - ./b2 headers\n\nscript:\n  - |-\n    echo \"using $TOOLSET : : $TRAVIS_COMPILER ;\" > ~/user-config.jam\n  - ./b2 -j 3 libs/serialization/test toolset=$TOOLSET link=${LINK:-shared}\n\nnotifications:\n  email:\n    on_success: always\n"
  },
  {
    "path": "CMake/CMakeLists.txt",
    "content": "# CMake build control file for Serialization Library tests\n\ncmake_minimum_required(VERSION 3.5)\n\nif (POLICY CMP0054)\n  cmake_policy (SET CMP0054 NEW)\nendif (POLICY CMP0054)\n\nif (POLICY CMP0063)\n  cmake_policy (SET CMP0063 NEW)\nendif (POLICY CMP0063)\n\nproject(\"serialization\")\n\n#\n# Compiler settings\n#\n\nmessage(STATUS \"C++ compiler is ${CMAKE_CXX_COMPILER_ID}\" )\nadd_definitions(${Boost_LIB_DIAGNOSTIC_DEFINITIONS})\nmessage(STATUS \"C compiler is ${CMAKE_C_COMPILER_ID}\" )\n\nif( CMAKE_CXX_COMPILER_ID STREQUAL \"GNU\" )\n  add_definitions( -ftemplate-depth=255 )\n  # we use gcc to test for C++03 compatibility\n  set(COMPILER_SUPPORTS_CXX11 FALSE)\nelseif( CMAKE_CXX_COMPILER_ID STREQUAL \"MSVC\" )\n  add_definitions( /wd4996 )\n  set(COMPILER_SUPPORTS_CXX11 TRUE)\nelseif( CMAKE_CXX_COMPILER_ID STREQUAL \"AppleClang\" )\n  set(CMAKE_CXX_FLAGS \"${CMAKE_CXX_FLAGS} -ftemplate-depth=300\")\n  set(CMAKE_CXX_FLAGS_DEBUG \"-g -O0\" )\n  set(CMAKE_CXX_FLAGS_RELWITHDEBINFO \"-g -O3\" )\n  set(CMAKE_EXE_LINKER_FLAGS \"${CMAKE_EXE_LINKER_FLAGS} -stdlib=libc++ -dead_strip\")\n  set(COMPILER_SUPPORTS_CXX11 TRUE)\nendif()\n\nadd_definitions( -std=c++11 )\n#set(CMAKE_CXX_FLAGS \"${CMAKE_CXX_FLAGS} -std=c++03\")\nset(CMAKE_CXX_FLAGS \"${CMAKE_CXX_FLAGS} -std=c++11\")\n#set(CMAKE_CXX_FLAGS \"${CMAKE_CXX_FLAGS} -std=c++17\")\n#set(CMAKE_CXX_FLAGS \"${CMAKE_CXX_FLAGS} -std=c++11\")\n\n#\n# Locate Project Prerequisites \n#\n\n# Boost\n\n#\n# Project settings\n#\noption(BUILD_SHARED_LIBS \"Build Shared Libraries\" true)\n\nfind_package(Boost 1.82 REQUIRED COMPONENTS system filesystem)\n\nif(NOT Boost_FOUND)\n  message(\"Boost NOT Found!\")\nelse()\n  message(STATUS \"Boost Found!\")\nendif()\nset(CMAKE_CXX_VISIBILITY_PRESET hidden)\nset(VISIBILITY_INLINES_HIDDEN YES)\n\n# enable usage of CHECK_INCLUDE_FILE_CXX\ninclude(CheckIncludeFileCXX)\n\n# list of archive names for which tests should be generated\nset(archive_list text_archive text_warchive binary_archive xml_archive xml_warchive)\n# set(archive_list xml_warchive)\n\n# list of tests generated by each function call\nset(test_list)\n\n###########################\n# library builds\n\nadd_library(serialization\n  ../src/archive_exception.cpp\n  ../src/basic_archive.cpp\n  ../src/basic_iarchive.cpp\n  ../src/basic_iserializer.cpp\n  ../src/basic_oarchive.cpp\n  ../src/basic_oserializer.cpp\n  ../src/basic_pointer_iserializer.cpp\n  ../src/basic_pointer_oserializer.cpp\n  ../src/basic_serializer_map.cpp\n  ../src/basic_text_iprimitive.cpp\n  ../src/basic_text_oprimitive.cpp\n  ../src/basic_xml_archive.cpp\n  ../src/binary_iarchive.cpp\n  ../src/binary_oarchive.cpp\n  ../src/extended_type_info.cpp\n  ../src/extended_type_info_typeid.cpp\n  ../src/extended_type_info_no_rtti.cpp\n  ../src/stl_port.cpp\n  ../src/text_iarchive.cpp\n  ../src/text_oarchive.cpp\n  ../src/polymorphic_iarchive.cpp\n  ../src/polymorphic_oarchive.cpp\n  ../src/polymorphic_text_iarchive.cpp\n  ../src/polymorphic_text_oarchive.cpp\n  ../src/polymorphic_binary_iarchive.cpp\n  ../src/polymorphic_binary_oarchive.cpp\n  ../src/polymorphic_xml_iarchive.cpp\n  ../src/polymorphic_xml_oarchive.cpp\n  ../src/void_cast.cpp\n  ../src/xml_grammar.cpp\n  ../src/xml_iarchive.cpp\n  ../src/xml_oarchive.cpp\n  ../src/xml_archive_exception.cpp\n  ../src/codecvt_null.cpp\n  ../src/utf8_codecvt_facet.cpp\n  ../src/basic_xml_grammar.ipp # doesn't show up in \"Source Files\" in Xcode\"'\n)\ntarget_include_directories(serialization PUBLIC ${Boost_INCLUDE_DIR})\n\nadd_library(wserialization\n  ../src/basic_text_wiprimitive.cpp\n  ../src/basic_text_woprimitive.cpp\n  ../src/text_wiarchive.cpp\n  ../src/text_woarchive.cpp\n  ../src/polymorphic_text_wiarchive.cpp\n  ../src/polymorphic_text_woarchive.cpp\n  ../src/xml_wiarchive.cpp\n  ../src/xml_woarchive.cpp\n  ../src/polymorphic_xml_wiarchive.cpp\n  ../src/polymorphic_xml_woarchive.cpp\n  ../src/xml_wgrammar.cpp\n  ../src/basic_xml_grammar.ipp # doesn't show up in \"Source Files\" in Xcode\"'\n)\ntarget_include_directories(wserialization PUBLIC ${Boost_INCLUDE_DIR})\ntarget_link_libraries(wserialization PUBLIC serialization)\n\n# end library build\n###########################\n\n###########################\n# test targets\n\nfunction( serialization_test test_name)\n  set(arglist)\n  foreach(a IN ITEMS ${ARGN} )\n    set(arglist ${arglist} ../test/${a}.cpp)\n  endforeach()\n  message(STATUS ${test_name})\n  add_executable( ${test_name} ../test/${test_name}.cpp ${arglist} )\n  target_include_directories(${test_name} PUBLIC ${Boost_INCLUDE_DIR})\n  target_link_libraries(${test_name} serialization wserialization Boost::filesystem)\n  add_test( ${test_name} ${test_name} )\nendfunction(serialization_test)\n\nfunction(archive_test test_name)\n  set(test_listx)\n  set(arglist)\n  foreach(a IN ITEMS ${ARGN} )\n    set(arglist ${arglist} ../test/${a}.cpp)\n  endforeach()\n  foreach(\n    archive-name\n    IN ITEMS ${archive_list}\n  )\n    set(amended_test_name ${test_name}_${archive-name})\n    add_executable(${amended_test_name} ../test/${test_name}.cpp ${arglist})\n    set_property(\n      TARGET ${amended_test_name}\n      PROPERTY COMPILE_DEFINITIONS BOOST_ARCHIVE_TEST=${archive-name}.hpp\n    )\n    target_include_directories(${amended_test_name} PUBLIC ${Boost_INCLUDE_DIR})\n    target_link_libraries(${amended_test_name} serialization wserialization Boost::filesystem)\n    add_test(${amended_test_name} ${amended_test_name})\n    set(test_listx ${test_listx} ${amended_test_name})\n  endforeach()\n  set(test_list ${test_listx} PARENT_SCOPE)\nendfunction(archive_test)\n\nfunction(polymorphic_archive_test test_name)\n  set(test_listx)\n  set(arglist)\n  foreach(a IN ITEMS ${ARGN} )\n    set(arglist ${arglist} ../test/${a}.cpp)\n  endforeach()\n  foreach(\n    archive-name\n    IN ITEMS ${archive_list}\n  )\n    set(amended_archive_name polymorphic_${archive-name})\n    set(amended_test_name ${test_name}_${amended_archive_name})\n    add_executable(${amended_test_name} ../test/${test_name}.cpp ${arglist})\n    set_property(\n      TARGET ${amended_test_name}\n      PROPERTY COMPILE_DEFINITIONS BOOST_ARCHIVE_TEST=${amended_archive_name}.hpp\n    )\n    message(STATUS ${amended_test_name} \" \" ${arglist} \" \" ${amended_archive_name})\n    target_include_directories(${amended_test_name} PUBLIC ${Boost_INCLUDE_DIR})\n    target_link_libraries(${amended_test_name} serialization wserialization Boost::filesystem)\n    add_test(${amended_test_name} ${amended_test_name})\n    set(test_listx ${test_listx} ${amended_test_name})\nendforeach()\nset(test_list ${test_listx} PARENT_SCOPE)\nendfunction(polymorphic_archive_test)\n\nenable_testing()\n\nmessage(STATUS dll_a)\nadd_library(dll_a SHARED ../test/dll_a.cpp)\ntarget_link_libraries(dll_a serialization)\n\nmessage(STATUS dll_polymorphic_base)\nadd_library(dll_polymorphic_base SHARED ../test/dll_polymorphic_base.cpp)\ntarget_link_libraries(dll_polymorphic_base serialization)\n\nmessage(STATUS dll_polymorphic_derived2)\nadd_library(dll_polymorphic_derived2 SHARED ../test/dll_polymorphic_derived2.cpp)\ntarget_link_libraries(dll_polymorphic_derived2 dll_polymorphic_base serialization)\n\n# compile test_dll_plugin.cpp\n# Running the following test requires that the test know the directory \n# in which the dll is stored. I don't know how to extract this from bjam\n# serialization(test_dll_plugin : : dll_polymorphic_derived2_lib)\n\nif(BUILD_SHARED_LIBS)\n  # this test can only be made to work if we're linking with shared\n  # libraries. Basically the build systems like to have all shared\n  # or all static so if we're building with static C++ libraries\n  # then linking with a shared one - we need multiple C++ libraries\n  # and things get complex.  So just run this test when we're\n  # building with shared libraries (dll in windows speak)\n  serialization_test(test_dll_simple)\n  target_link_libraries(test_dll_simple dll_a serialization)\nendif()\n\nserialization_test(test_private_ctor)\nserialization_test(test_reset_object_address A)\nserialization_test(test_void_cast)\nserialization_test(test_mult_archive_types)\nserialization_test(test_iterators)\nserialization_test(test_iterators_base64)\nserialization_test(test_inclusion)\nserialization_test(test_inclusion2)\nserialization_test(test_smart_cast)\nserialization_test(test_codecvt_null)\nserialization_test(test_strong_typedef)\nserialization_test(test_singleton)\nserialization_test(test_singleton_inherited)\nserialization_test(test_singleton_plain)\n\narchive_test(test_native_array A)\narchive_test(test_boost_array A)\nif(COMPILER_SUPPORTS_CXX11)\n  archive_test(test_array A)\nendif()\n\narchive_test(test_binary)\narchive_test(test_bitset)\narchive_test(test_class_info_save)\narchive_test(test_class_info_load)\narchive_test(test_complex)\narchive_test(test_contained_class A)\narchive_test(test_cyclic_ptrs A)\narchive_test(test_delete_pointer)\narchive_test(test_deque A)\narchive_test(test_derived)\narchive_test(test_derived_class A)\narchive_test(test_diamond)\narchive_test(test_diamond_complex)\nCHECK_INCLUDE_FILE_CXX(forward_list FORWARD_LIST_FOUND)\nif(FORWARD_LIST_FOUND)\n  message(STATUS \"forward_list header found\")\n  archive_test(test_forward_list A)\n  archive_test(test_forward_list_ptrs A)\nelse()\n  message(STATUS \"forward_list header NOT found\")\nendif()\n\narchive_test(test_helper_support)\narchive_test(test_interrupts)\narchive_test(test_list A)\narchive_test(test_list_ptrs A)\n\narchive_test(test_map A)\nCHECK_INCLUDE_FILE_CXX(hash_map HASH_MAP_FOUND)\nif(HASH_MAP_FOUND)\n  archive_test(test_map_hashed A)\nendif()\narchive_test(test_mi)\narchive_test(test_multiple_ptrs A)\narchive_test(test_multiple_inheritance)\narchive_test(test_new_operator A)\narchive_test(test_non_intrusive)\narchive_test(test_non_default_ctor)\narchive_test(test_non_default_ctor2)\narchive_test(test_null_ptr)\narchive_test(test_nvp A)\narchive_test(test_object)\narchive_test(test_optional)\narchive_test(test_primitive)\narchive_test(test_priority_queue A)\narchive_test(test_private_base)\narchive_test(test_private_base2)\narchive_test(test_queue A)\narchive_test(test_recursion A)\narchive_test(test_registered)\n\narchive_test(test_set A)\nCHECK_INCLUDE_FILE_CXX(hash_set HASH_SET_FOUND)\nif(HASH_SET_FOUND)\n  archive_test(test_set_hashed A)\nendif()\n\narchive_test(test_shared_ptr)\narchive_test(test_shared_ptr_multi_base)\narchive_test(test_shared_ptr_132)\narchive_test(test_simple_class A)\narchive_test(test_simple_class_ptr A)\nCHECK_INCLUDE_FILE_CXX(slist SLIST_FOUND)\nif(SLIST_FOUND)\n  message(STATUS \"slist header found\")\n  archive_test(test_slist A)\n  archive_test(test_slist_ptr A)\nendif()\narchive_test(test_stack A)\narchive_test(test_split)\narchive_test(test_tracking)\narchive_test(test_unregistered)\narchive_test(test_unique_ptr)\narchive_test(test_valarray)\narchive_test(test_variant A)\narchive_test(test_vector A)\n\nif(BUILD_SHARED_LIBS)\n  polymorphic_archive_test(test_dll_exported polymorphic_derived1)\n  foreach(test_name IN ITEMS ${test_list} )\n    target_link_libraries(${test_name} dll_polymorphic_derived2 dll_polymorphic_base serialization wserialization)\n  endforeach()\nendif()\n\npolymorphic_archive_test(test_no_rtti polymorphic_base polymorphic_derived1 polymorphic_derived2)\npolymorphic_archive_test(test_exported polymorphic_base polymorphic_derived1 polymorphic_derived2)\npolymorphic_archive_test(test_polymorphic test_polymorphic_A A)\npolymorphic_archive_test(test_polymorphic2 test_polymorphic2imp)\npolymorphic_archive_test(test_p_helper)\n\n# end test targets\n####################\n\n####################\n# add headers in IDE\n\n# for serialization\n\nfile(GLOB x \n  RELATIVE \"${CMAKE_CURRENT_SOURCE_DIR}\" \n  \"${CMAKE_CURRENT_SOURCE_DIR}/../include/boost/archive/*.hpp\"\n)\nadd_custom_target(archive SOURCES ${x})\nset_property(TARGET archive PROPERTY FOLDER \"serialization\")\n\nfile(GLOB x \n  RELATIVE \"${CMAKE_CURRENT_SOURCE_DIR}\" \n  \"${CMAKE_CURRENT_SOURCE_DIR}/../include/boost/archive/detail/*.hpp\"\n)\nadd_custom_target(archive-detail SOURCES ${x})\nset_property(TARGET archive-detail PROPERTY FOLDER \"serialization\")\n\nfile(GLOB x \n  RELATIVE \"${CMAKE_CURRENT_SOURCE_DIR}\" \n  \"${CMAKE_CURRENT_SOURCE_DIR}/../include/boost/archive/impl/*.ipp\"\n)\nadd_custom_target(archive-impl SOURCES ${x})\nset_property(TARGET archive-impl PROPERTY FOLDER \"serialization\")\n\nfile(GLOB x\n  RELATIVE \"${CMAKE_CURRENT_SOURCE_DIR}\" \n  \"${CMAKE_CURRENT_SOURCE_DIR}/../include/boost/archive/iterators/*.hpp\"\n)\nadd_custom_target(archive-iterators SOURCES ${x})\nset_property(TARGET archive-iterators PROPERTY FOLDER \"serialization\")\n\nfile(GLOB x \n  RELATIVE \"${CMAKE_CURRENT_SOURCE_DIR}\" \n  \"${CMAKE_CURRENT_SOURCE_DIR}/../include/boost/serialization/*.hpp\"\n)\nadd_custom_target(serialization-headers SOURCES ${x})\nset_property(TARGET serialization-headers PROPERTY FOLDER \"serialization\")\n\nfile(GLOB x \n  RELATIVE \"${CMAKE_CURRENT_SOURCE_DIR}\" \n  \"${CMAKE_CURRENT_SOURCE_DIR}/../include/boost/serialization/detail/*.hpp\"\n)\nadd_custom_target(serialization-detail SOURCES ${x})\nset_property(TARGET serialization-detail PROPERTY FOLDER \"serialization\")\n\n# for wserialization\n\nfile(GLOB x \n  RELATIVE \"${CMAKE_CURRENT_SOURCE_DIR}\" \n  \"${CMAKE_CURRENT_SOURCE_DIR}/../include/boost/archive/*_w*.hpp\"\n)\nadd_custom_target(wserialization_headers SOURCES ${x})\nset_property(TARGET wserialization_headers PROPERTY FOLDER \"wserialization\")\n\n# end headers in IDE\n####################\n\n#####################\n# add test project to run misc tests\n\nadd_executable( test_z ../test/test_z.cpp)\ntarget_link_libraries(test_z serialization wserialization ${Boost_LIBRARIES})\n\n# end test project\n#####################\n"
  },
  {
    "path": "CMakeLists.txt",
    "content": "# Copyright 2020, 2021 Peter Dimov\n# Distributed under the Boost Software License, Version 1.0.\n# https://www.boost.org/LICENSE_1_0.txt\n\ncmake_minimum_required(VERSION 3.5...3.16)\n\nproject(boost_serialization VERSION \"${BOOST_SUPERPROJECT_VERSION}\" LANGUAGES CXX)\n\nadd_library(boost_serialization\n  src/archive_exception.cpp\n  src/basic_archive.cpp\n  src/basic_iarchive.cpp\n  src/basic_iserializer.cpp\n  src/basic_oarchive.cpp\n  src/basic_oserializer.cpp\n  src/basic_pointer_iserializer.cpp\n  src/basic_pointer_oserializer.cpp\n  src/basic_serializer_map.cpp\n  src/basic_text_iprimitive.cpp\n  src/basic_text_oprimitive.cpp\n  src/basic_xml_archive.cpp\n  src/binary_iarchive.cpp\n  src/binary_oarchive.cpp\n  src/codecvt_null.cpp\n  src/extended_type_info.cpp\n  src/extended_type_info_no_rtti.cpp\n  src/extended_type_info_typeid.cpp\n  src/polymorphic_binary_iarchive.cpp\n  src/polymorphic_binary_oarchive.cpp\n  src/polymorphic_iarchive.cpp\n  src/polymorphic_oarchive.cpp\n  src/polymorphic_text_iarchive.cpp\n  src/polymorphic_text_oarchive.cpp\n  src/polymorphic_xml_iarchive.cpp\n  src/polymorphic_xml_oarchive.cpp\n  src/stl_port.cpp\n  src/text_iarchive.cpp\n  src/text_oarchive.cpp\n  src/utf8_codecvt_facet.cpp\n  src/void_cast.cpp\n  src/xml_archive_exception.cpp\n  src/xml_grammar.cpp\n  src/xml_iarchive.cpp\n  src/xml_oarchive.cpp\n)\n\nadd_library(boost_wserialization\n  src/basic_text_wiprimitive.cpp\n  src/basic_text_woprimitive.cpp\n  src/binary_wiarchive.cpp\n  src/binary_woarchive.cpp\n  src/polymorphic_text_wiarchive.cpp\n  src/polymorphic_text_woarchive.cpp\n  src/polymorphic_xml_wiarchive.cpp\n  src/polymorphic_xml_woarchive.cpp\n  src/text_wiarchive.cpp\n  src/text_woarchive.cpp\n  src/xml_wgrammar.cpp\n  src/xml_wiarchive.cpp\n  src/xml_woarchive.cpp\n)\n\nadd_library(Boost::serialization ALIAS boost_serialization)\nadd_library(Boost::wserialization ALIAS boost_wserialization)\n\ntarget_include_directories(boost_serialization PUBLIC include)\ntarget_include_directories(boost_wserialization PUBLIC include)\n\ntarget_link_libraries(boost_serialization\n  PUBLIC\n    Boost::array\n    Boost::assert\n    Boost::config\n    Boost::core\n    Boost::detail\n    Boost::integer\n    Boost::io\n    Boost::iterator\n    Boost::move\n    Boost::mpl\n    Boost::optional\n    Boost::predef\n    Boost::preprocessor\n    Boost::smart_ptr\n    Boost::spirit\n    Boost::type_traits\n    Boost::unordered\n    Boost::utility\n    Boost::variant\n  PRIVATE\n    Boost::function\n)\n\ntarget_link_libraries(boost_wserialization PUBLIC boost_serialization)\n\ntarget_compile_definitions(boost_serialization\n  PUBLIC BOOST_SERIALIZATION_NO_LIB\n  # Source files already define BOOST_SERIALIZATION_SOURCE\n  # PRIVATE BOOST_SERIALIZATION_SOURCE\n)\n\ntarget_compile_definitions(boost_wserialization\n  PUBLIC BOOST_SERIALIZATION_NO_LIB\n  # Source files already define BOOST_SERIALIZATION_SOURCE\n  # PRIVATE BOOST_SERIALIZATION_SOURCE\n)\n\nif(BUILD_SHARED_LIBS)\n  target_compile_definitions(boost_serialization PUBLIC BOOST_SERIALIZATION_DYN_LINK)\n  target_compile_definitions(boost_wserialization PUBLIC BOOST_SERIALIZATION_DYN_LINK)\nelse()\n  target_compile_definitions(boost_serialization PUBLIC BOOST_SERIALIZATION_STATIC_LINK)\n  target_compile_definitions(boost_wserialization PUBLIC BOOST_SERIALIZATION_STATIC_LINK)\nendif()\n\nif(BOOST_SUPERPROJECT_VERSION AND NOT CMAKE_VERSION VERSION_LESS 3.13)\n  boost_install(TARGETS boost_serialization boost_wserialization VERSION ${BOOST_SUPERPROJECT_VERSION} HEADER_DIRECTORY include)\nendif()\n\nif(BUILD_TESTING AND EXISTS \"${CMAKE_CURRENT_SOURCE_DIR}/test/CMakeLists.txt\")\n\n  add_subdirectory(test)\n\nendif()\n"
  },
  {
    "path": "appveyor.yml",
    "content": "# Copyright 2016 Peter Dimov\n# Copyright 2016 Robert Ramey\n# Distributed under the Boost Software License, Version 1.0.\n# (See accompanying file LICENSE_1_0.txt or copy at http://boost.org/LICENSE_1_0.txt)\n\nversion: 1.0.{build}-{branch}\n\nshallow_clone: true\n\nbranches:\n  only:\n    - develop\n#    - master\n\nenvironment:\n  matrix:\n    - BUILD_TOOLSET: gcc\n      BUILD_LINK: static\n    - BUILD_TOOLSET: gcc\n      BUILD_LINK: shared\n    - BUILD_TOOLSET: msvc-14.0\n      BUILD_LINK: static\n    - BUILD_TOOLSET: msvc-14.0\n      BUILD_LINK: shared\n\ninstall:\n  - cd ..\n  - git clone -b %APPVEYOR_REPO_BRANCH%  https://github.com/boostorg/boost.git boost-root\n  - cd boost-root\n  - git submodule init libs/align\n  - git submodule init libs/array\n  - git submodule init libs/assert\n  - git submodule init libs/bind\n  - git submodule init libs/compatibility\n  - git submodule init libs/concept_check\n  - git submodule init libs/config\n  - git submodule init libs/container\n  - git submodule init libs/container_hash\n  - git submodule init libs/core\n  - git submodule init libs/detail\n  - git submodule init libs/filesystem\n  - git submodule init libs/function\n  - git submodule init libs/functional\n  - git submodule init libs/integer\n  - git submodule init libs/intrusive\n  - git submodule init libs/io\n  - git submodule init libs/iterator\n  - git submodule init libs/lexical_cast\n  - git submodule init libs/math\n  - git submodule init libs/move\n  - git submodule init libs/mpl\n  - git submodule init libs/numeric/conversion\n  - git submodule init libs/optional\n  - git submodule init libs/predef\n  - git submodule init libs/preprocessor\n  - git submodule init libs/range\n  - git submodule init libs/smart_ptr\n  - git submodule init libs/spirit\n  - git submodule init libs/system\n  - git submodule init libs/throw_exception\n  - git submodule init libs/tuple\n  - git submodule init libs/type_index\n  - git submodule init libs/type_traits\n  - git submodule init libs/unordered\n  - git submodule init libs/utility\n  - git submodule init libs/variant\n  - git submodule init libs/winapi\n  - git submodule init tools/boost_install\n  - git submodule init libs/headers\n\n  - git submodule init tools/build\n  - git submodule update\n  - xcopy /s /e /q %APPVEYOR_BUILD_FOLDER% libs\\serialization\n  - set PATH=C:\\mingw-w64\\i686-6.3.0-posix-dwarf-rt_v5-rev1\\mingw32\\bin;%CD%;%PATH%\n  - bootstrap gcc\n  - b2 headers\n\nbuild: off\n\ntest_script:\n  - cd libs/serialization/test\n  - b2 -j2 toolset=%BUILD_TOOLSET% link=%BUILD_LINK%\n"
  },
  {
    "path": "build/Jamfile.v2",
    "content": "# Boost serialization Library Build Jamfile\n#  (C) Copyright Robert Ramey 2002-2004.\n#  Use, modification, and distribution are subject to the\n#  Boost Software License, Version 1.0. (See accompanying file\n#  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n#\n#  See http://www.boost.org/libs/serialization for the library home page.\n\nrequire-b2 5.0.1 ;\nimport-search /boost/config/checks ;\nimport config : requires ;\n\nconstant boost_dependencies_private :\n    /boost/function//boost_function\n    ;\n\nproject\n    : source-location ../src\n    : common-requirements <library>$(boost_dependencies)\n    : requirements\n      <conditional>@include-spirit\n      <library>$(boost_dependencies_private)\n    : usage-requirements\n        <define>BOOST_SERIALIZATION_NO_LIB=1\n;\n\nSPIRIT_ROOT = [ modules.peek : SPIRIT_ROOT ] ;\nrule include-spirit ( properties * )\n{\n    local old-compiler ;\n    if <toolset>borland in $(properties)\n    {\n        if ! <toolset-borland:version>6.1.0 in $(properties)\n        {\n            old-compiler = true ;\n        }\n\n    }\n    else if <toolset>msvc in $(properties)\n    {\n        if <toolset-msvc:version>6.5 in $(properties)\n          || <toolset-msvc:version>7.0 in $(properties)\n        {\n            old-compiler = true ;\n        }\n    }\n\n    local result ;\n    if $(old-compiler)\n    {\n        if $(SPIRIT_ROOT)\n        {\n            # note - we can't use <include>$(SPIRIT_ROOT) because\n            # it puts -I$(SPIRIT_ROOT) AFTER the \"../../..\" in the command line.\n            # so use these instead\n            result = <cxxflags>-I$(SPIRIT_ROOT) ;\n        }\n        else\n        {\n            echo **** spirit 1.6x required to build library with this compiler **** ;\n            result = <build>no ;\n        }\n    }\n    return $(result) ;\n}\n\nSOURCES =\n    archive_exception\n    basic_archive\n    basic_iarchive\n    basic_iserializer\n    basic_oarchive\n    basic_oserializer\n    basic_pointer_iserializer\n    basic_pointer_oserializer\n    basic_serializer_map\n    basic_text_iprimitive\n    basic_text_oprimitive\n    basic_xml_archive\n    binary_iarchive\n    binary_oarchive\n    extended_type_info\n    extended_type_info_typeid\n    extended_type_info_no_rtti\n    polymorphic_iarchive\n    polymorphic_oarchive\n    stl_port\n    text_iarchive\n    text_oarchive\n    polymorphic_text_iarchive\n    polymorphic_text_oarchive\n    polymorphic_binary_iarchive\n    polymorphic_binary_oarchive\n    polymorphic_xml_iarchive\n    polymorphic_xml_oarchive\n    void_cast\n    xml_grammar\n    xml_iarchive\n    xml_archive_exception\n    codecvt_null\n ;\n\nSOURCES_HAS_STD_WSTREAMBUF =\n    xml_oarchive\n    utf8_codecvt_facet\n;\n\nWSOURCES =\n    basic_text_wiprimitive\n    basic_text_woprimitive\n    text_wiarchive\n    text_woarchive\n    polymorphic_text_wiarchive\n    polymorphic_text_woarchive\n    xml_wgrammar\n    xml_wiarchive\n    xml_woarchive\n    polymorphic_xml_wiarchive\n    polymorphic_xml_woarchive\n    codecvt_null\n;\n\nlib boost_serialization\n    : ## sources ##\n     $(SOURCES).cpp\n    : ## requirements ##\n    [ check-target-builds /boost/config/checks//std_wstreambuf : <source>../src/$(SOURCES_HAS_STD_WSTREAMBUF).cpp ]\n    <toolset>msvc:<cxxflags>/Gy\n    <toolset>msvc:<define>_SCL_SECURE_NO_WARNINGS\n    <toolset>msvc:<define>_CRT_SECURE_NO_WARNINGS\n    <link>shared:<define>BOOST_SERIALIZATION_DYN_LINK=1\n    ;\n\nlib boost_wserialization\n    : $(WSOURCES).cpp boost_serialization\n    :\n    [ requires std_wstreambuf ]\n    <toolset>msvc:<cxxflags>/Gy\n    <toolset>msvc:<define>_SCL_SECURE_NO_WARNINGS\n    <toolset>msvc:<define>_CRT_SECURE_NO_WARNINGS\n    # note: both serialization and wserialization are conditioned on the this\n    # switch - don't change it to BOOST_WSERIALIZATION_DYN_LINK\n    <link>shared:<define>BOOST_SERIALIZATION_DYN_LINK=1\n    ;\n"
  },
  {
    "path": "build.jam",
    "content": "# Copyright René Ferdinand Rivera Morell 2023-2024\n# Distributed under the Boost Software License, Version 1.0.\n# (See accompanying file LICENSE_1_0.txt or copy at\n# http://www.boost.org/LICENSE_1_0.txt)\n\nrequire-b2 5.2 ;\n\nconstant boost_dependencies :\n    /boost/array//boost_array\n    /boost/assert//boost_assert\n    /boost/config//boost_config\n    /boost/core//boost_core\n    /boost/detail//boost_detail\n    /boost/integer//boost_integer\n    /boost/io//boost_io\n    /boost/iterator//boost_iterator\n    /boost/move//boost_move\n    /boost/mp11//boost_mp11\n    /boost/mpl//boost_mpl\n    /boost/optional//boost_optional\n    /boost/predef//boost_predef\n    /boost/preprocessor//boost_preprocessor\n    /boost/smart_ptr//boost_smart_ptr\n    /boost/spirit//boost_spirit\n    /boost/throw_exception//boost_throw_exception\n    /boost/type_traits//boost_type_traits\n    /boost/utility//boost_utility\n    /boost/variant//boost_variant\n    /boost/variant2//boost_variant2 ;\n\nproject /boost/serialization\n    : common-requirements\n        <include>include\n    ;\n\nexplicit\n    [ alias boost_serialization : build//boost_serialization ]\n    [ alias boost_wserialization : build//boost_wserialization ]\n    [ alias all : boost_serialization boost_wserialization example test ]\n    ;\n\ncall-if : boost-library serialization\n    : install boost_serialization boost_wserialization\n    ;\n\n"
  },
  {
    "path": "doc/acknowledgments.html",
    "content": "<!doctype HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">\n<html>\n<!--\n(C) Copyright 2002-4 Robert Ramey - http://www.rrsd.com . \nUse, modification and distribution is subject to the Boost Software\nLicense, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\nhttp://www.boost.org/LICENSE_1_0.txt)\n-->\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\n<link rel=\"stylesheet\" type=\"text/css\" href=\"../../../boost.css\">\n<link rel=\"stylesheet\" type=\"text/css\" href=\"style.css\">\n<title>Serialization - Acknowledgments</title>\n</head>\n<body link=\"#0000ff\" vlink=\"#800080\">\n<table border=\"0\" cellpadding=\"7\" cellspacing=\"0\" width=\"100%\" summary=\n    \"header\">\n  <tr> \n    <td valign=\"top\" width=\"300\"> \n      <h3><a href=\"http://www.boost.org\"><img height=\"86\" width=\"277\" alt=\"C++ Boost\" src=\"../../../boost.png\" border=\"0\"></a></h3>\n    </td>\n    <td valign=\"top\"> \n      <h1 align=\"center\">Serialization</h1>\n      <h2 align=\"center\">Acknowledgments</h2>\n    </td>\n  </tr>\n</table>\n<hr>\n<ul>\n  <li>Takatoshi Kondo found and corrected a very obscure and difficult bug in the \n  serialization of virtual base classes.\n  <li><a href=\"http://www.autoform.com\">AutoForm Engineering GmbH</a> supported\n  development efforts to extend correct serialization to objects stored in DLLS.\n  <li><a href\"http://www.cadence.com/il\">Cadence Israel</a> supported enhancement\n  and testing of the portable binary archive.\n  <li>David Abrahams improved implementation of \"export\" functionality.  This not\n  only eliminated an annoying header sequencing requirement, but also the need to maintain\n  a list of \"known archives\".\n  <li>Mattias Troyer enhanced the implementation of native binary archives.  This includes\n  enhancement and generalization of the library itself including generalization of\n  the wrapper concept.\n  <li>Markus Sch&ouml;pflin tracked down issues with TRU64 compiler resulting in 100% passing.\n  <li><a href=\"mailto::troy@resophonic.com\"> Troy D. Straszheim</a> made the initial version of variant serialization.\n  <li>Tonko Juricic helped refine and complete project files for VC 7.1 ide\n  <li><a href=\"http://www.boost.org/people/rene_rivera.htm\">Rene Rivera</a> tracked down several issues related to \n  Code Warrior, toolset configuration and bjam and much else.\n  <li>Martin Ecker detected (and fixed!) a number of subtle errors regarding cyclic\n  pointers, shared pointers.  He also built the library as a DLL and raised some issues\n  <li>Pavel Vozenilek invested much effort in review of code and documentation\n  resulting in many improvements.  In addition he helped a lot with porting to other\n  platforms including VC 6.0, Intel, and especially Borland.\n  <li><a href=\"http://www.boost.org/people/jens_maurer.htm\">Jens Maurer</a> and\n  <a href=\"http://www.boost.org/people/beman_dawes.html\">Beman Dawes</a> who got the boost\n  serialization ball rolling.  It was one or both of these two that invented\n  the much beloved <code>&amp;</code> syntax used to implement both save and\n  load in one function specification.\n  <li><a href=\"http://www.boost.org/people/vladimir_prus.htm\">Vladimir Prus</a> for evaluating an\n  early draft and contributing the diamond inheritance example.\n  <li><a href=\"http://www.boost.org/people/william_kempf.htm\">William E. Kempf</a>\n  who made the templates for this and other boost manuals.  This relieved\n  me of much aggravation.\n  <li><a href=\"mailto:vahan@unicad.am\">Vahan Margaryan</a> and\n  <a href=\"mailto:fredrik_blomqvist-at-home.se\">Fredrik Blomqvist</a> for their contributions\n  to my understanding of the subtle issues of exception safety in this context.\n  <li>all other boost members who responded with feedback during the\n  development of this library.  Almost all comments resulted in\n  tangible changes in the library which made it much better.\n  <li>boosters who helped out in porting to other platforms:, Fernando Cacciola (Borland), \n  Jeff Flinn (VC 7.1), Vladimir Prus (gcc 3.3), Christoph Ludwig(gcc 3.4),\n  Rob Lievaart(mingw), Marshal Clow(gcc-darwin) among others.\n  <li>all boost members who participated in the first formal review\n  in November 2002.  Many of these members invested quite an effort\n  to evaluate the library and suggest changes. They are\n  Matthias Troyer, Pavel Vozenilek, Vladimir Prus, Fredrik Blomqvist,\n  Jeff Garland, Gennadiy Rozental, Alberto Barbati, Dave Harris.\n  Mr. Rozenthal in particular wrote an incredibly insightful analysis\n  that has driven all subsequent development that has resulted in the\n  current package.\n  <li>Dave Harris proposal and spirited defense of it led to a re-thinking\n  of the overrides for serialization of pointers.  This resulted in a simpler\n  and more effective method of accounting for non-default constructors\n  required by serialization of pointers and STL collections.\n  <li><a href=\"mailto:admin@thefireflyproject.us\">Bryce Lelbach</a> rewrote the XML Serialization grammar using Boost.Spirit 2.x.\n</ul>\n<hr>\n<p><i>&copy; Copyright <a href=\"http://www.rrsd.com\">Robert Ramey</a> 2002-2004. \nDistributed under the Boost Software License, Version 1.0. (See\naccompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n</i></p>\n</body>\n</html>\n\n"
  },
  {
    "path": "doc/archive_reference.html",
    "content": "<!doctype HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">\n<html>\n<!--\n(C) Copyright 2002-10 Robert Ramey - http://www.rrsd.com . \nUse, modification and distribution is subject to the Boost Software\nLicense, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\nhttp://www.boost.org/LICENSE_1_0.txt)\n-->\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html; UTF-8\">\n<link rel=\"stylesheet\" type=\"text/css\" href=\"../../../boost.css\">\n<link rel=\"stylesheet\" type=\"text/css\" href=\"style.css\">\n<title>Serialization - More on Archives</title>\n</head>\n<body link=\"#0000ff\" vlink=\"#800080\">\n<table border=\"0\" cellpadding=\"7\" cellspacing=\"0\" width=\"100%\" summary=\"header\">\n  <tr> \n    <td valign=\"top\" width=\"300\"> \n      <h3><a href=\"../../../index.htm\"><img height=\"86\" width=\"277\" alt=\"C++ Boost\" src=\"../../../boost.png\" border=\"0\"></a></h3>\n    </td>\n    <td valign=\"top\"> \n      <h1 align=\"center\">Serialization</h1>\n      <h2 align=\"center\">Archive Class Reference</h2>\n    </td>\n  </tr>\n</table>\n<hr>\n<dl class=\"page-index\">\n  <dt><a href=\"#trivial\">Trivial Archive</a>\n  <dt><a href=\"#implementation\">More Useful Archive Classes</a>\n  <dt><a href=\"#usage\">Usage</a>\n  <dt><a href=\"#testing\">Testing</a>\n  <dt><a href=\"#polymorphic\">Polymorphic Archives</a>\n</dl>\n\n<h3><a name=\"trivial\">Trivial Archive</a></h3>\nThe <a href=\"archives.html\"><strong>Archive</strong></a> concept specifies the functions that a\nclass must implement in order to be used to serialize \n<a href=\"serialization.html\"><strong>Serializable</strong></a> types.\n\nOur discussion will focus on archives used for saving as the hierarchy is exactly analogous\nfor archives used for loading data.\n\n<h4>Minimum Requirements</h4>\n\nThe simplest class which will model the <a href=\"archives.html\"><strong>Archive</strong></a> concept specifies the functions that a\nclass will look like:\n\n<pre><code>\n#include &lt;cstddef&gt; // std::size_t\n//////////////////////////////////////////////////////////////\n// class trivial_oarchive\nclass trivial_oarchive {\npublic:\n    //////////////////////////////////////////////////////////\n    // public interface used by programs that use the\n    // serialization library\n    typedef boost::mpl::bool_&lt;true&gt; is_saving; \n    typedef boost::mpl::bool_&lt;false&gt; is_loading;\n    template&lt;class T&gt; void register_type(){}\n    template&lt;class T&gt; trivial_oarchive &amp; operator&lt;&lt;(const T &amp; t){\n        return *this;\n    }\n    template&lt;class T&gt; trivial_oarchive &amp; operator&amp;(const T &amp; t){\n        return *this &lt;&lt; t;\n    }\n    void save_binary(void *address, std::size_t count){};\n};\n</code></pre>\nThe simplest possible input archive class is analogous to the above.\nIn the following discussion, only output archives will be addressed.\nInput archives are exactly symmetrical to output archives.\n<p>\nThis archive will compile and execute with any types which implement the\n<a href=\"serialization.html\"><strong>Serializable</strong></a> concept.\nFor an example see\n<a href=\"../example/demo_trivial_archive.cpp\" target=\"demo_trivial_archive\">\n<code style=\"white-space: normal\">demo_trivial_archive.cpp</code></a>.\nOf course this program won't produce any output as it is.  But it provides\nthe starting point for a simple class which can be used to log formatted\noutput.  See the implementation of a <a href=\"simple_log.html\">simple\nlog archive</a> to how this has been done.\n\n<h3><a name=\"implementation\">More Useful Archive Classes</a></h3>\nThe above example is fine as far as it goes.  But it doesn't implement\nuseful features such as serialization of pointers, class versioning\nand others. This library implements a family of full featured archive\nclasses appropriate for a variety of purposes.  \n\n<p>\nOur archives have been factored into a tree of classes in order to minimize\nrepetition of code.  This is shown in the accompanying \n<a target=\"class_diagram\" href=\"class_diagram.html\">class diagram</a>.\n\nAny class which fulfills the following requirements will fit into\nthis hierarchy and implement all the features we require.  Deriving from\nthe base class <a href=\"../../../boost/archive/detail/common_oarchive.hpp\" target=\"common_oarchive_hpp\">\ncommon_oarchive.hpp</a> provides all features we desire which\nare missing from trivial_oarchive above.\n\n<pre><code>\n<a href=\"../../../boost/archive/detail/common_oarchive.hpp\" target=\"common_oarchive_hpp\">\n#include &lt;cstddef&gt; // std::size_t\n#include &lt;boost/archive/detail/common_oarchive.hpp&gt;\n</a>\n/////////////////////////////////////////////////////////////////////////\n// class complete_oarchive\nclass complete_oarchive : \n    public boost::archive::detail::common_oarchive&lt;complete_oarchive&gt;\n{\n    // permit serialization system privileged access to permit\n    // implementation of inline templates for maximum speed.\n    friend class boost::archive::save_access;\n\n    // member template for saving primitive types.\n    // Specialize for any types/templates that require special treatment\n    template&lt;class T&gt;\n    void save(T &amp; t);\n\npublic:\n    //////////////////////////////////////////////////////////\n    // public interface used by programs that use the\n    // serialization library\n\n    // archives are expected to support this function\n    void save_binary(void *address, std::size_t count);\n};\n</code></pre>\n\nGiven a suitable definitions of <code style=\"white-space: normal\">save</code>\nand <code style=\"white-space: normal\">save_binary</code>, \nany program using serialization with a conforming C++ compiler should compile \nand run with this archive class.\n\n<h4>Optional Overrides</h4>\n\nThe <code style=\"white-space: normal\">detail::common_oarchive</code> class contains\na number of functions that are used by various parts of the serialization library\nto help render the archive in a particular form.\n\n<dl>\n\n<dt><h4><code>void save_start(char const *)</code></h4></dt>\n<dd>\n<strong>Default</strong>:Does nothing.<br>\n<strong>Purpose</strong>:To inject/retrieve an object name into the archive.  Used\nby XML archive to inject \"&lt;name&gt;\" before data.\n</dd>\n<p>\n\n<dt><h4><code>void save_end(char const *)</code></h4></dt>\n<dd>\n<strong>Default</strong>:Does nothing.<br>\n<strong>Purpose</strong>:To inject/retrieve an object name into the archive. Used\nby XML archive to inject \"&lt;/name&gt;\" after data.\n<dd>\n</dd>\n<p>\n<dt><h4><code>void end_preamble()</code></h4></dt>\n<dd>\n<strong>Default</strong>:Does nothing.<br>\n<strong>Purpose</strong>:Called <strong>each time</strong> user data is saved. \nIt's not called when archive bookkeeping data is saved.  This is used by XML archives \nto determine  when to inject a \"&gt;\" character at the end of an XML header. XML output archives \nkeep their own internal flag indicating that data being written is header data. This\ninternal flag is reset when an object start tag is written. When \n<code style=\"white-space: normal\">void end_preamble()</code> is invoked and this internal flag is set\na \"&gt;\" character is appended to the output and the internal flag is reset. The default\nimplementation for <code style=\"white-space: normal\">void end_preamble()</code> is a no-op thereby permitting it\nto be optimised away for archive classes that don't use it.\n</dd>\n<p>\n<dt><h4><code>\ntemplate&lt;class T&gt;\nvoid save_override(T &amp; t, int);\n</code></h4></dt>\n<dd>\n<strong>Default</strong>:Invokes <code style=\"white-space: normal\">archive::save(Archive &amp; ar, t)</code><br>\nThis is the main entry into the serialization library.<br>\n<strong>Purpose</strong>:This can be specialized in cases where the data is to be written \nto the archive in some special way.  For example, XML archives implement special handling for\nname-value pairs by overriding this function template for name-value pairs.  \nThis replaces the default name-value pair handling, which is just to throw away the name,\nwith one appropriate for XML which writes out the start of an XML tag with the correct object name.\n</dd>\n\n</dl>\n\n<h4>Types used by the serialization library</h4>\nThe serialization library injects bookkeeping data into the serialization archive.\nThis data includes things like object ids, version numbers, class names etc.  Each\nof these objects is included in a wrapper so that the archive class can override the\nimplementation of <code style=\"white-space: normal\">void save_override(T &amp; t, int);</code>.\nFor example, in the XML archive, the override for this type renders an object_id equal to 23 as\n\"object_id=_23\".  The following table lists the types defined in the \n<code style=\"white-space: normal\">boost::archive namespace</code>\nused internally by the serialization library:\n<p>\n<table border>\n<tr><th align=left>type</th><th align=left><code style=\"white-space: normal\">default<br>serialized as</code></th>\n<tr><td><code style=\"white-space: normal\">version_type</code></td><td><code style=\"white-space: normal\">unsigned int</code></td>             \n<tr><td><code style=\"white-space: normal\">object_id_type</code></td><td><code style=\"white-space: normal\">unsigned int</code></td>   \n<tr><td><code style=\"white-space: normal\">object_id_reference_type</code></td><td><code style=\"white-space: normal\">unsigned int</code></td>   \n<tr><td><code style=\"white-space: normal\">class_id_type</code></td><td><code style=\"white-space: normal\">int</code></td>   \n<tr><td><code style=\"white-space: normal\">class_id_optional_type</code></td><td><code style=\"white-space: normal\">nothing</code></td>   \n<tr><td><code style=\"white-space: normal\">class_id_reference_type</code></td><td><code style=\"white-space: normal\">int</code></td>   \n<tr><td><code style=\"white-space: normal\">tracking_type</code></td><td><code style=\"white-space: normal\">bool</code></td>   \n<tr><td><code style=\"white-space: normal\">classname_type</code></td><td><code style=\"white-space: normal\">string</code></td>   \n</table>\n<p>\nAll of these are associated with a default serialization defined in terms of primitive types\nso it isn't a requirement to define <code style=\"white-space: normal\">save_override</code> \nfor these types.\n<p>\nThese are defined in\n<a href=\"../../../boost/archive/basic_archive.hpp\" target=\"basic_archive_hpp\"><code style=\"white-space: normal\">basic_archive.hpp</code></a>.\nAll of these types have been assigned an \n<a target=\"detail\" href=\"traits.html#level\">implementation level</a> of\n<code style=\"white-space: normal\">primitive</code> and are convertible to types such as int, unsigned int, etc. \nso that they have default implementations.  This is illustrated by\n<a href=\"../../../boost/archive/basic_text_iarchive.hpp\" target=\"basic_text_iarchive_hpp\"><code style=\"white-space: normal\">basic_text_iarchive.hpp</code></a>.\nwhich relies upon the default.  However, in some cases, overrides will have to be\nexplicitly provided for these types. For an example see\n<a href=\"../../../boost/archive/basic_xml_iarchive.hpp\" target=\"basic_xml_iarchive_hpp\"><code style=\"white-space: normal\">basic_xml_iarchive.hpp</code></a>.\n<p>\nIn real practice, we probably won't be quite done. \nOne or more of the following issues may need to be addressed:\n<ul>\n    <li>Even if we are using a conforming compiler, we might want our new archive class\n    to be portable to non-conforming compilers.\n    <li>Our archive format might require extra information inserted into it.  For\n    example, XML archives need &lt;name ... &gt;...&lt;/name&gt; surrounding\n    all data objects.\n    <li>Addressing any of the above may generate more issues to be addressed.\n    <li>The archives included with the library are all templates which use a\n    <code style=\"white-space: normal\">stream</code> or\n    <code style=\"white-space: normal\">streambuf</code>\n    as a template parameter rather than simple classes.\n    Combined with the above, even more issues arise with non-conforming compilers.\n</ul>\nThe attached <a target=\"class_diagram\" href=\"class_diagram.html\">class diagram</a>\nshows the relationships between classes used to implement the serialization library.\n<p>\nA close examination of the archives included with the library illustrate\nwhat it takes to make a portable archive that covers all data types.\n<h3><a name=\"usage\">Usage</a></h3>\nThe newly created archive will usually be stored in its own header module.  All\nthat is necessary is to include the header and construct an instance of the new archive.\nEXCEPT for one special case.\n<ul>\n    <li>Instances of a derived class are serialized through a base class pointer.\n    <li>Such instances are not \"registered\" neither implicitly nor explicitly. That\n    is, the macro <code style=\"white-space: normal\">BOOST_CLASS_EXPORT</code> is used \n    to instantiate the serialization code for the included archives.\n</ul>\n\nTo make this work, the following should be included after the archive\nclass definition.\n<pre><code>\nBOOST_SERIALIZATION_REGISTER_ARCHIVE(Archive)\n</code></pre>\nFailure to do this will not inhibit the program from compiling, linking\nand executing properly - except in one case.  If an instance of a derived\nclass is serialized through a pointer to its base class, the program\nwill throw an\n<a href=\"exceptions.html#unregistered_class\"><code style=\"white-space: normal\">unregistered_class</code></a>\nexception.\n<p>\n\n<h4><a name=\"testing\">Testing</h4>\nExhaustive testing of the library requires testing the different aspects of object\nserialization with each archive.  There are 46 different tests that can run with any archive.  \nThere are 5 \"standard archives\" included with the system. \n(3 in systems that don't support wide character i/o). \n<p>\nIn addition, there are 28 other tests which aren't related to any particular archive class.\n<p>\nThe default <code style=\"white-space: normal\">bjam</code> testing setup will run all\nthe above described tests.  This will result in as many as 46 archive tests * 5 \nstandard archives + 28 general tests = 258 tests. Note that a complete test of the\nlibrary would include DLL vs static library, release vs debug so the actual total \nwould be closer to 1032 tests.\n<p>\nFor each archive there is a header file in the test directory similar to the one below.\nThe name of this archive is passed to the test program by setting the\nenvironmental variable <code style=\"white-space: normal\">BOOST_ARCHIVE_TEST</code>\nto the name of the header.  Here is the header file \n<code style=\"white-space: normal\">test_archive.hpp</code> . Test header files for\nother archives are similar.\n<pre><code>\n// text_archive test header\n// include output archive header\n#include &lt;boost/archive/text_oarchive.hpp&gt;\n// set name of test output archive\ntypedef boost::archive::text_oarchive test_oarchive;\n// set name of test output stream\ntypedef std::ofstream test_ostream;\n\n// repeat the above for input archive\n#include &lt;boost/archive/text_iarchive.hpp&gt;\ntypedef boost::archive::text_iarchive test_iarchive;\ntypedef std::ifstream test_istream;\n\n// define open mode for streams\n//   binary archives should use std::ios_base::binary\n#define TEST_STREAM_FLAGS (std::ios_base::openmode)0\n</code></pre>\n\nTo test a new archive, for example, portable binary archives, with the gcc compiler, \nmake a header file <code style=\"white-space: normal\">portable_binary_archive.hpp</code>\nand invoke <code style=\"white-space: normal\">bjam</code> with\n<pre><code> \n-sBOOST_ARCHIVE_LIST=portable_binary_archive.hpp\n</code></pre>\nThis process in encapsulated in the shell or cmd script \n<code style=\"white-space: normal\">library_test</code> whose command line is\n<pre><code>\nlibrary_test --toolset=gcc -sBOOST_ARCHIVE_LIST=portable_binary_archive.hpp\n</code></pre>\n<h3><a name=\"polymorphic\">Polymorphic Archives</a></h3>\n\n<h4>Motivation</h4>\n\nAll archives described so far are implemented as templates.  Code to save and load\ndata to archives is regenerated for each combination of archive class and data type.\nUnder these circumstances, a good optimizing compiler that can expand \n<code>inline</code> functions to enough depth will generate fast code.  \nHowever:\n<ul>\n<li>Much inline code may be replicated.\n<li>If there are several archive classes, code will be regenerated for each archive class.\n<li>If serialization code is placed in a library, that library must be rebuilt \neach time a new archive class is created.\n<li>If serialization code is placed in a DLL,\n  <ul>\n  <li>The DLL will contain versions of code for each known archive type.  \n    This would result in loading of DLLs which contain\n    much code that is not used - basically defeating one of the main motivations\n    for choosing to use a DLL in the first place.\n  <li>If a new archive is created and an application shipped, all DLLs have to be\n    rebuilt, and reshipped along with the application which uses the new archive.  Thus\n    the other main motivation for using a DLL is defeated.\n  </ul>\n</ul>\n\n<h4>Implementation</h4>\nThe solution is the pair <code>polymorphic_oarchive</code>\nand <code>polymorphic_iarchive</code>.  They present a common interface of virtual\nfunctions - no templates - that is equivalent to the standard templated one.\n\nThis is shown in the accompanying \n<a target=\"class_diagram\" href=\"class_diagram.html\">class diagram</a>\n<p>\nThe accompanying demo program in files\n\n<a target=demo_polymorphic_cp href=\"../example/demo_polymorphic.cpp\"><code style=\"white-space: normal\">demo_polymorphic.cpp</code></a>, \n<a target=demo_polymorphic_A_hpp href=\"../example/demo_polymorphic_A.hpp\"><code style=\"white-space: normal\">demo_polymorphic_A.hpp</code></a>, and \n<a target=demo_polymorphic_A_cpp href=\"../example/demo_polymorphic_A.cpp\"><code style=\"white-space: normal\">demo_polymorphic_A</code></a>\nshow how polymorphic archives are to be used. Note the following:\n<ul>\n  <li><a target=demo_polymorphic_A_hpp href=\"../example/demo_polymorphic_A.hpp\"><code style=\"white-space: normal\">demo_polymorphic_A.hpp</code></a> and\n<a target=demo_polymorphic_A_cpp href=\"../example/demo_polymorphic_A.cpp\"><code style=\"white-space: normal\">demo_polymorphic_A.cpp</code></a>\ncontain no templates and no reference to any specific archive implementation.  That is, they will\nonly have to be compiled once for all archive implementations.  This even applies to archives classes\ncreated in the future.\n  <li>The main program <a target=demo_polymorphic_cp href=\"../example/demo_polymorphic.cpp\"><code style=\"white-space: normal\">demo_polymorphic.cpp</code></a>\nspecifies a specific archive implementation.  \n</ul>\nAs can be seen in the\n<a target=\"class_diagram\" href=\"class_diagram.html\">class diagram</a>\nand the header files, this implementation is just a composition of the polymorphic\ninterface and the standard template driven implementation.  This composition is\naccomplished by the templates\n<a target=polymorphic_iarchive_route_hpp href=\"../../../boost/archive/detail/polymorphic_iarchive_route.hpp\"><code style=\"white-space: normal\">polymorphic_iarchive_route.hpp</code></a>\nand\n<a target=polymorphic_oarchive_route_hpp href=\"../../../boost/archive/detail/polymorphic_oarchive_route.hpp\"><code style=\"white-space: normal\">polymorphic_oarchive_route.hpp</code></a>\nwhich redirect calls to the polymorphic archives to the specific archive.\nAs these contain no code specific to the particular implementation archive, they can be used to create\na polymorphic archive implementation from any functioning templated archive implementation.\n<p>\nAs a convenience, small header files have been included which contain \na <code style=\"white-space: normal\">typedef</code> for a polymorphic implementation for each corresponding\ntemplated one.  For example, the headers\n<a target=polymorphic_text_iarchive_hpp href=\"../../../boost/archive/polymorphic_text_iarchive.hpp\"><code style=\"white-space: normal\">polymorphic_text_iarchive.hpp</code></a>\nand\n<a target=polymorphic_text_oarchive_hpp href=\"../../../boost/archive/polymorphic_text_oarchive.hpp\"><code style=\"white-space: normal\">polymorphic_text_oarchive.hpp</code></a>.\ncontain the <code style=\"white-space: normal\">typedef</code> for the polymorphic implementation\nof the standard text archive classes  \n<a target=text_iarchive_hpp href=\"../../../boost/archive/text_iarchive.hpp\"><code style=\"white-space: normal\">text_iarchive.hpp</code></a>\nand\n<a target=text_oarchive_hpp href=\"../../../boost/archive/text_oarchive.hpp\"><code style=\"white-space: normal\">text_oarchive.hpp</code></a>\nrespectively. All included polymorphic archives use the same naming scheme.\n\n<h4>Usage</h4>\nPolymorphic archives address the issues raised above regarding templated implementation.\nThat is, there is no replicated code, and no recompilation for new archives.  This will\nresult in smaller executables for program which use more than one type of archive, and \nsmaller DLLS. There is a penalty for calling archive functions through a virtual function \ndispatch table and there is no possibility for a compiler to <code style=\"white-space: normal\">inline</code> \narchive functions.  This will result in a detectable degradation in performance for \nsaving and loading archives.\n<p>\nNote that the concept of polymorphic archives is fundamentally incompatible with the\nserialization of new types that are marked \"primitive\" by the user with:\n<pre><code> \nBOOST_CLASS_IMPLEMENTATION(my_primitive_type, boost::serialization::primitive_type)\n</code></pre>\n\nCode to implement serialization for these types is instantiated \"on the fly\" in the user's program.\nBut this conflicts with the whole purpose of the polymorphic archive. An attempt to\nserialize such a primitive type will result in a compilation error since the common polymorphic\ninterface is static and cannot instantiate code for a new type.\n\n<p>\nThe main utility of polymorphic archives will be to permit the building of class DLLs that will\ninclude serialization code for all present and future archives with no redundant code.\n<hr>\n<p><i>&copy; Copyright <a href=\"http://www.rrsd.com\">Robert Ramey</a> 2002-2004. \nDistributed under the Boost Software License, Version 1.0. (See\naccompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n</i></p>\n</body>\n</html>\n"
  },
  {
    "path": "doc/archives.html",
    "content": "<!doctype HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">\n<html>\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\n<link rel=\"stylesheet\" type=\"text/css\" href=\"../../../boost.css\">\n<link rel=\"stylesheet\" type=\"text/css\" href=\"style.css\">\n<title>Serialization - Archives</title>\n</head>\n<body link=\"#0000ff\" vlink=\"#800080\">\n<table border=\"0\" cellpadding=\"7\" cellspacing=\"0\" width=\"100%\" summary=\"header\">\n  <tr> \n    <td valign=\"top\" width=\"300\"> \n      <h3><a href=\"../../../index.htm\"><img height=\"86\" width=\"277\" alt=\"C++ Boost\" src=\"../../../boost.png\" border=\"0\"></a></h3>\n    </td>\n    <td valign=\"top\"> \n      <h1 align=\"center\">Serialization</h1>\n      <h2 align=\"center\">Archive Concepts</h2>\n    </td>\n  </tr>\n</table>\n<hr>\n<dl class=\"page-index\">\n  <dt><a href=\"#saving_interface\">Saving Archive Concept</a>\n  <dt><a href=\"#loading_interface\">Loading Archive Concept</a>\n  <dt><a href=\"#archive_models\">Models</a>\n  <dt><a href=\"#exceptions\">Exceptions</a>\n  <dt><a href=\"#charactersets\">Character Sets</a>\n</dl>\n<h4>Notation</h4>\nIn the following descriptions\n<ul>\n  <li><code>SA</code> is an type modeling the <a href=\"#saving_interface\">Saving Archive Concept</a>.\n  <li><code>sa</code> is an instance of type SA.\n  <li><code>LA</code> is an type modeling the <a href=\"#loading_interface\">Loading Archive Concept</a>.\n  <li><code>la</code> is an instance of type LA.\n  <li><code>T</code> is an <a href=\"serialization.html\"><strong>Serializable</strong></a> Type.\n  <li><code>x</code> is an instance of type T Type.\n  <li><code>u,v</code> is a pointer to a an instance of type T.\n  <li><code>count</code> is an instance of a type that can be converted to <code>std::size_t</code>.\n</ul>\n<h4><a name=\"saving_interface\">Saving Archive Concept</a></h4>\n<h4>Associated Types</h4>\nIntuitively, a type modeling this concept will generate a sequence of bytes\ncorresponding to an arbitrary set of C++ data structures.  Each type modeling the\nSaving Archive concept (SA) may be associated with another type modeling the\n<a href=\"#loading_interface\">Loading Archive Concept</a>(LA).  \nThis associated type will perform the inverse operation.  \nThat is, given a sequence of bytes generated by SA, it will generate a set of \nC++ data structures that is equivalent to the original.  \nThe notion of equivalence is defined by the implementations of the pair of archives and the\nway the data are rendered <a href=\"serialization.html\">serializable</a>.\n<p>\n<h4>Valid Expressions</h4>\n<dl>\n  <dt><h4><code>\n    SA::is_saving\n  </code></h4></dt>\n  <dd>\n    Returns the Boost MPL Integral Constant type boost::mpl::bool_&lt;true&gt;\n  </dd>   \n  <dt><h4><code>\n    SA::is_loading\n  </code></h4></dt>\n  <dd>\n    Returns the Boost MPL Integral Constant type boost::mpl::bool_&lt;false&gt;\n  </dd>   \n  <dt><h4><code>\n    sa &lt;&lt; x\n    <br>\n    sa &amp; x\n  </code></h4></dt>\n  <dd>\n    These expressions must perform exactly the same function.  They append the\n    value of <code style=\"white-space: normal\">x</code> along with other information to <code>sa</code>.\n    This other information is defined by the implementation of the archive.\n    Typically this information is that which is required by a corresponding\n    Loading Archive type to properly restore the value of <code>x</code>.\n    <p>\n    Returns a reference to <code>sa</code>. \n  </dd>\n  <dt><h4><code>\n    sa.save_binary(u, count)\n  </code></h4></dt>\n  <dd>\n    Appends to the archive <code style=\"white-space: normal\">size_t(count)</code> bytes found at \n    <code style=\"white-space: normal\">u</code>.\n  </dd>\n  <dt><h4><code>\n    sa.register_type&lt;T&gt;()\n    <br>\n    sa.register_type(u)\n  </code></h4></dt>\n  <dd>\n    Appends information about class T to the archive.  This information is used to\n    construct the correct class when a derived pointer is loaded by a corresponding\n    Loading Archive type.  \n    Invocation of this member function is referred to as \"class registration\".  \n    This is explained in detail in\n    <a href=\"special.html#derivedpointers\">Special Considerations - Derived Pointers</a>.\n    The second syntax is included to permit this function to be called on non-conforming\n    compilers when <code style=\"white-space: normal\">sa</code> is a template argument.\n    For more information, see <a target=\"detail\" href=\"implementation.html#tempatesyntax\">Template Invocation syntax</a>\n  </dd>\n  <dt><h4><code>\n    sa.get_library_version()\n  </code></h4></dt>\n  <dd>\n    Returns an unsigned integer containing the current version number of the serialization\n    library. This number will be incremented each time the library is altered in such a \n    way that serialization could be altered for some type.  For example, suppose the type\n    used for a count of collection members is changed. The code that loads collections \n    might be conditioned on the library version to make sure that libraries created by \n    previous versions of the library can still be read.\n  </dd>\n  <dt><h4><code>\n    sa.get_helper&lt;Helper&gt;(void * const helper_instance_id = 0)\n  </code></h4></dt>\n  <dd>\n    See <code>la.get_helper&lt;Helper&gt;(void * const helper_instance_id = 0)</code>\n    below.\n  </dd>\n\n</dl>\n\n<h4><a name=\"loading_interface\">Loading Archive Concept</a></h4>\n<h4>Associated Types</h4>\nEach model of this concept presumes the\nexistence of a corresponding type modeling the \n<a href=\"#saving_interface\">Saving Archive Concept</a>.\nThe purpose of an instance of this concept is to convert a sequence of bytes\ngenerated by this corresponding type to a set of C++ data structures \nequivalent to the original.  \n<h4>Valid Expressions</h4>\n<dl>\n  <dt><h4><code>\n    LA::is_saving\n  </code></h4></dt>\n  <dd>\n    Returns the Boost MPL Integral Constant type boost::mpl::bool_&lt;false&gt;\n  </dd>   \n  <dt><h4><code>\n    LA::is_loading\n  </code></h4></dt>\n  <dd>\n    Returns the Boost MPL Integral Constant type boost::mpl::bool_&lt;true&gt;\n  </dd>   \n  <dt><h4><code>\n    la &gt;&gt; x\n    <br>\n    la &amp; x\n  </code></h4></dt>\n  <dd>\n    These expressions must perform exactly the same function.  \n    Sets <code>x</code> to a value retrieved from <code>la</code>.\n    <p>\n    Returns a reference to <code>la</code>. \n  </dd>\n  <dt><h4><code>\n    la.load_binary(u, count)\n  </code></h4></dt>\n  <dd>\n    Retrieves from <code style=\"white-space: normal\">la</code> <code style=\"white-space: normal\">size_t(count)</code> bytes and stores\n    them in memory starting at <code style=\"white-space: normal\">u</code>.\n  </dd>\n  <dt>\n  <dt><h4><code>\n    la.register_type&lt;T&gt;()\n    <br>\n    la.register_type(u)\n  </code></h4></dt>\n  <dd>\n    Retrieves information about class T from the archive.  This information is used to\n    construct the correct class when loading a pointer to a derived class not\n    otherwise referred to in the program by name.\n    Invocation of this member function is referred to as \"class registration\".  \n    This is explained in detail in\n    <a href=\"special.html#derivedpointers\">Special Considerations - Derived Pointers</a>.\n    The second syntax is included to permit this function to be called on non-conforming\n    compilers when <code style=\"white-space: normal\">la</code> is a template argument.\n    For more information, see <a target=\"detail\" href=\"implementation.html#tempatesyntax\">Template Invocation syntax</a>\n  </dd>\n  <dt><h4><code>\n    la.get_library_version()\n  </code></h4></dt>\n  <dd>\n    Returns an unsigned integer containing the version number of the serialization\n    library that created the archive. This number will be incremented each time the \n    library is altered in such a way that serialization could be altered for some type.  \n    For example, suppose the type used for a count of collection members is changed.  \n    The code that loads collections might be conditioned on the library version to make \n    sure that libraries created by previous versions of the library can still be read.\n  </dd>\n  <dt><h4><code>\n    la.get_helper&lt;Helper&gt;(void * const helper_instance_id)\n  </code></h4></dt>\n  <dd>\n    Some otherwise unserializable types can be made serializable by inclusion of\n    a helper object.  The iconic example of this is shared_ptr which needs this\n    helper object to keep track of previously loaded shared_ptr instances so they\n    can be \"matched up\" with subsequently loaded ones.\n    The first time <code  style=\"white-space: normal\">la.get_helper&lt;Helper&gt;(void * const helper_instance_id)</code>\n    is invoked for a given helper_instance_id, <code  style=\"white-space: normal\">Helper</code>, a default-constructed\n    <code style=\"white-space: normal\">Helper</code> object is created, attached to\n    <code  style=\"white-space: normal\">la</code> and a reference to it is returned. Subsequent\n    invocations of <code style=\"white-space: normal\">la.get_helper&lt;Helper&gt;(void * const helper_instance_id)</code> with the same id value return\n    a reference to the formerly constructed object. All objects created in this manner are\n    destroyed  upon <code style=\"white-space: normal\">la</code> destruction time. The purpose\n    of helper objects is discussed in\n    <a href=\"special.html#helpersupport\">Special Considerations - Helper Support</a>.\n  </dd>\n  <dt><h4><code>\n    la.reset_object_address(v, u)\n  </code></h4></dt>\n  <dd>\n    Communicates to the archive that the object originally at address u has been\n    moved to address v.\n    <p>\n    When an object is loaded to a temporary variable and later moved to another location,\n    this function must be called in order communicate this fact.  This permits the\n    archive to properly implement object tracking.  Object tracking is required in order\n    to correctly implement serialization of pointers to instances of derived classes.\n  </dd>  \n  <dt><h4><code>\n    la.delete_created_pointers()\n  </code></h4></dt>\n  <dd>\n    Deletes all objects created by the loading of pointers.  This can be used to\n    avoid memory leaks that might otherwise occur if pointers are being loaded\n    and the archive load encounters an exception.\n  </dd>\n</dl>\n\nThere are archives based on text, binary and XML file\nformats but all have the above interface.  Given that all archives present\nthe same public interface, specification of serialization is exactly the same\nfor all archives.  Archive classes have other members not mentioned here.\nHowever they are related to the internal functioning of the library and\nare not meant to be called by users of an archive.  Implementation of new\narchives is discussed in \n<a href=\"archive_reference.html#implementation\">New Archives - Implementation</a>.\n\n<p>\nThe existence of the <code style=\"white-space: normal\">&lt;&lt;</code> \nand <code style=\"white-space: normal\">&gt;&gt;</code> suggests\na relationship between archives and C++ i/o streams. <strong>Archives are not \nC++ i/o streams</strong>. All the archives included with this system take a stream\nas an argument in the constructor and that stream is used for output or input.\nHowever, this is not a requirement of the serialization functions or the\narchive interface. It just turns out that the archives written so far have\nfound it useful to base their implementation on streams.\n\n<h3><a name=\"archive_models\">Archive Models</a></h3>\nThis library includes various implementations of the Archive concept.\n\nAn archive is defined by two complementary classes.  One is for saving data while\nthe other is for loading it.\n\nThis library includes a number of archive implementations that are \"ready to go\" for the\nmost common requirements.  These classes implement the archive concept for differing data formats.\nThey can be used \"as is\" or as a basis for developing one's own particular type of archive. \nAn archive is defined by two complementary classes. One is for saving data while the other is for loading it.  \n\nTo invoke serialization using one of\nthese archives, one or more of the following header files must be\nincluded in the code module containing the serialization code.\n<pre><code>\n// a portable text archive</a>\n<a href=\"../../../boost/archive/text_oarchive.hpp\" target=\"text_oarchive_cpp\">boost::archive::text_oarchive</a> // saving\n<a href=\"../../../boost/archive/text_iarchive.hpp\" target=\"text_iarchive_cpp\">boost::archive::text_iarchive</a> // loading\n\n// a portable text archive using a wide character stream</a>\n<a href=\"../../../boost/archive/text_woarchive.hpp\">boost::archive::text_woarchive</a> // saving\n<a href=\"../../../boost/archive/text_wiarchive.hpp\">boost::archive::text_wiarchive</a> // loading\n\n// a portable XML archive</a>\n<a href=\"../../../boost/archive/xml_oarchive.hpp\" target=\"xml_oarchive_cpp\">boost::archive::xml_oarchive</a> // saving\n<a href=\"../../../boost/archive/xml_iarchive.hpp\" target=\"xml_iarchive_cpp\">boost::archive::xml_iarchive</a> // loading\n\n// a portable XML archive which uses wide characters - use for utf-8 output</a>\n<a href=\"../../../boost/archive/xml_woarchive.hpp\" target=\"xml_woarchive_cpp\">boost::archive::xml_woarchive</a> // saving\n<a href=\"../../../boost/archive/xml_wiarchive.hpp\" target=\"xml_wiarchive_cpp\">boost::archive::xml_wiarchive</a> // loading\n\n// a non-portable native binary archive</a>\n<a href=\"../../../boost/archive/binary_oarchive.hpp\" target=\"binary_oarchive_cpp\">boost::archive::binary_oarchive</a> // saving\n<a href=\"../../../boost/archive/binary_iarchive.hpp\" target=\"binary_iarchive_cpp\">boost::archive::binary_iarchive</a> // loading\n\n<!--\n// a non-portable native binary archive which use wide character streams\n<a href=\"../../../boost/archive/binary_woarchive.hpp\">boost::archive::binary_woarchive</a> // saving\n<a href=\"../../../boost/archive/binary_wiarchive.hpp\">boost::archive::binary_wiarchive</a> // loading\n-->\n\n</code></pre>\n\nAll of these archives implement the same interface. Hence, it should suffice to describe only one\nof them in detail.  For this purpose we will use the text archive.\n\n\n<pre><code>\nnamespace boost {\nnamespace archive {\n\nenum archive_flags {\n    no_header = 1,          // suppress archive header info\n    no_codecvt = 2,         // suppress alteration of codecvt facet\n    no_xml_tag_checking = 4 // suppress checking of xml tags - ignored on saving\n};\n\n} // archive\n} // boost\n</code></pre>\n\n<pre><code>\nnamespace boost {\nnamespace archive {\n\nclass text_oarchive : ...\n{\n    ...\npublic:\n    ... // implementation of the <strong>Saving Archive</strong> concept\n    text_oarchive(std::ostream &amp; os, unsigned int flags = 0);\n    ~text_oarchive();\n};\n\n} // archive\n} // boost\n</code></pre>\n\n<dl>\n\n<dt><h4><code>\ntext_oarchive(std::ostream &amp; os, unsigned int flags = 0);\n</code></h4></dt>\n<dd>\nConstructs an archive given an open <code style=\"white-space: normal\">stream</code> as \nan argument and optional flags. For most applications there will be no need to use flags. \nFlags are defined by <code style=\"white-space: normal\">enum archive_flags</code> enumerator. \nMultiple flags can be combined with the <code style=\"white-space: normal\">|</code> operator. \n\nBy default, archives prepend \noutput with initial data which helps identify them as archives produced by this system.  \nThis permits a more graceful handling of the case where an attempt is made to load an archive\nfrom an invalid file format. In addition to this, each type of archive might have \nits own information.  For example, native binary archives include information about \nsizes of native types and endianness to gracefully handle the case where it has been\nerroneously assumed that such an archive is portable across platforms.  In some cases, \nwhere this extra overhead might be considered objectionable, it can be suppressed with the\n<code style=\"white-space: normal\">no_header</code> flag.\n<p>\nIn some cases, an archive may alter (and later restore)\nthe codecvt facet of the stream locale.  To suppress this action,\ninclude the <code style=\"white-space: normal\">no_codecvt</code> flag.\n<p>\nXML archives contain nested tags signifying the start and end of data fields.\nThese tags are normally checked for agreement with the object name when\ndata is loaded.  If a mismatch occurs an exception is thrown.  It's possible\nthat this may not be desired behavior.  To suppress this checking of XML\ntags, use <code style=\"white-space: normal\">no_xml_tag_checking</code> flag.\n</dd>\n\n<dt><h4><code>\n~text_oarchive();\n</code></h4></dt>\n<dd>\nDestructor for an archive.  This should be called before the stream is\nclosed.  It restores any altered stream facets to their state before the\narchive was opened.\n</dd>\n\n</dl>\n\n<pre><code>\nnamespace boost {\nnamespace archive {\n\nclass text_iarchive : ...\n{\n    ...\npublic:\n    ... // implementation of the <strong>Loading Archive</strong> concept\n    text_iarchive(std::istream &amp; is, unsigned int flags = 0);\n    ~text_iarchive();\n};\n\n} //namespace archive\n) //namespace boost\n\n</code></pre>\n\n<dl>\n\n<dt><h4><code>\ntext_iarchive(std::istream &amp; is, unsigned int flags = 0);\n</code></h4></dt>\n<dd>\nConstructs an archive given an open <code style=\"white-space: normal\">stream</code> as \nan argument and optional flags. If flags are used, they should be the same\nas those used when the archive was created. Function and usage of flags is described\nabove.\n</dd>\n\n<dt><h4><code>\n~text_iarchive();\n</code></h4></dt>\n<dd>\nDestructor for an archive.  This should be called before the stream is\nclosed.  It restores any altered stream facets to their state before the\nthe archive was opened.\n</dd>\n</dl>\n<p>\nThe <code style=\"white-space: normal\">binary_oarchive</code> and\n<code style=\"white-space: normal\">binary_iarchive</code> classes are\nimplemented in terms of the more basic \n<code style=\"white-space: normal\">std::streambuf</code>.  So, in addition\nto the common class interface described above, they include the following\nconstructors:\n<dl>\n<dt><h4><code>\nbinary_oarchive(std::streambuf &amp; bsb, unsigned int flags = 0);\n</code></h4></dt>\nand\n<dt><h4><code>\nbinary_iarchive(std::streambuf &amp; bsb, unsigned int flags = 0);\n</code></h4></dt>\n</dl>\n\n<h3><a name=\"exceptions\">Exceptions</h3>\nAll of the archive classes included may throw exceptions.  The list of exceptions that might\nbe thrown can be found in section <a target=\"detail\" href=\"exceptions.html\">Archive Exceptions</a>\nof this documentation. \n\n<h3><a name=\"charactersets\">Character Sets</h3>\nThis library includes two archive classes for XML. The wide character\nversion (<code style=\"white-space: normal\">xml_w?archive</code>) renders its output as UTF-8 which can\nhandle any wide character without loss of information. \n<code style=\"white-space: normal\">std::string</code> data is converted from multi-byte format to wide\ncharacter format using the current <code style=\"white-space: normal\">\nlocale</code>.  Hence this version should give a fair rendering of all\nC++ data for all cases.  This could result in some unexpected behavior.\nSuppose an <code style=\"white-space: normal\">std::string</code> \nis created with the <code style=\"white-space: normal\">locale</code> character\nset to hebrew characters.  On output this is converted to wide characters.\nOn input however, there could be a problem if the <code style=\"white-space: normal\">locale</code> is\nnot set the same as when the archive is created.\n<p>\nThe normal character version (<code style=\"white-space: normal\">xml_?archive</code>) renders \n<code style=\"white-space: normal\">std::string</code> output without any conversion.  Though this may work \nfine for serialization,  it may create difficulties if the XML archive is used\nfor some other purpose.\n<hr>\n<p><i>&copy; Copyright <a href=\"http://www.rrsd.com\">Robert Ramey</a> 2002-2004. \nDistributed under the Boost Software License, Version 1.0. (See\naccompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n</i></p>\n</body>\n</html>\n"
  },
  {
    "path": "doc/bibliography.html",
    "content": "<!doctype HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">\n<html>\n<!--\n(C) Copyright 2002-4 Robert Ramey - http://www.rrsd.com . \nUse, modification and distribution is subject to the Boost Software\nLicense, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\nhttp://www.boost.org/LICENSE_1_0.txt)\n-->\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\n<link rel=\"stylesheet\" type=\"text/css\" href=\"../../../boost.css\">\n<link rel=\"stylesheet\" type=\"text/css\" href=\"style.css\">\n<title>Serialization - Bibliography</title>\n</head>\n<body link=\"#0000ff\" vlink=\"#800080\">\n<table border=\"0\" cellpadding=\"7\" cellspacing=\"0\" width=\"100%\" summary=\n    \"header\">\n  <tr> \n    <td valign=\"top\" width=\"300\"> \n      <h3><a href=\"../../../index.htm\"><img height=\"86\" width=\"277\" alt=\"C++ Boost\" src=\"../../../boost.png\" border=\"0\"></a></h3>\n    </td>\n    <td valign=\"top\"> \n      <h1 align=\"center\">Serialization</h1>\n      <h2 align=\"center\">Bibliography</h2>\n    </td>\n  </tr>\n</table>\n<hr>\n<ol><a name=\"1\"></a>\n    <li>David Sugar and Daniel Silverstone, \"CommonC++ Libraries\", <a href=\n    \"http://www.gnu.org/software/commoncpp/\">http://www.gnu.org/software/commoncpp/</a>\n    <a name=\"2\"></a>\n    <li>Nicola Santi, \"Eternity\", <a href=\n    \"http://www.sourceforge.net/projects/eternity-it/\">www.sourceforge.net/projects/eternity-it/</a>\n    <a name=\"3\"></a>\n    <li>Allen Holub, \"Roll Your Own Persistence\", <u>Microsoft\n    Systems Journal</u> vol 11, no 6 Jun 1996\n    <a name=\"4\"></a>\n    <li><a href=\"www.codefarms.com\">Code Farms, Inc.</a>\n    <li>Tasos Kontogiorgos &amp; Michael Kim, \"A C++\n    Template-Based Application Architecture\", <u>C++ Report</u>\n    <a name=\"5\"></a>\n    <li>Scott Meyers, <u>Effective C++</u>, Addison-Wesley, 1992\n    <a name=\"6\"></a>\n    <li>Bjarne Stroustrup, <u>The C++ Programming Language</u>, Addison-Wesley, 1997\n    <a name=\"7\"></a>\n    <li>Alexandrescu, Andrei, <u>Modern C++ Design</u>, Addison-Wesley, 2001\n    <a name=\"8\"></a>\n    <li>Jim Hyslop, and Herb Sutter, \"Factory Redux, Part2\",\n    <u>C/C++ User's Journal</u>, vol 21, No. 8, August 2003\n    <a name=\"9\"></a>\n    <li>David Vandevoorde and Nicolai M. Josuttis,\n    <u>C++ Templates - The Complete Guide</u>, Addison-Wesley, 2003\n    <a name=\"10\"></a>\n    <li>Herb Sutter, \"Pimpls--Beauty Marks You Can Depend On\",\n    <u>C++ Report</u>, from <u>More C++ Gems</u>, Cambridge University Press, 2000\n    <a name=\"11\"></a>\n    <li>James Coplien, \"Curiously Recurring Template Patterns\",\n    <u>C++ Report</u>, from <u>C++ Gems</u>, Cambridge University Press, 1998\n    <a name=\"12\"></a>\n    <li>Erich Gamma, Richard Helm, Ralph Johnson, and John Vlissides, \n    <u>Design Patterns</u>, Addison-Wesley Publishing Company, 1995\n    <a name=\"13\"></a>\n    <li>Stephan Beal, \"s11n serialization library\", <a href=\"http://www.s11n.net\">www.s11n.net</a>\n    <a name=\"14\"></a>\n    <li>Vandevoorde and Josuttis, <b>C++ Templates - A Complete Guide</b>, Addison-Wesley, 2003</a>\n</ol>\n<hr>\n<p><i>&copy; Copyright <a href=\"http://www.rrsd.com\">Robert Ramey</a> 2002-2004. \nDistributed under the Boost Software License, Version 1.0. (See\naccompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n</i></p>\n</body>\n</html>\n\n"
  },
  {
    "path": "doc/class_diagram.html",
    "content": "<!doctype HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">\n<!--\n(C) Copyright 2002-4 Robert Ramey - http://www.rrsd.com . \nUse, modification and distribution is subject to the Boost Software\nLicense, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\nhttp://www.boost.org/LICENSE_1_0.txt)\n-->\n<html>\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\n<link rel=\"stylesheet\" type=\"text/css\" href=\"../../../boost.css\">\n<link rel=\"stylesheet\" type=\"text/css\" href=\"style.css\">\n<title>Serialization - Archive Class Diagram</title>\n</head>\n<body link=\"#0000ff\" vlink=\"#800080\">\n<table border=\"0\" cellpadding=\"7\" cellspacing=\"0\" width=\"100%\" summary=\"header\">\n  <tr> \n    <td valign=\"top\" width=\"300\"> \n      <h3><a href=\"../../../index.htm\"><img height=\"86\" width=\"277\" alt=\"C++ Boost\" src=\"../../../boost.png\" border=\"0\"></a></h3>\n    </td>\n    <td valign=\"top\"> \n      <h1 align=\"center\">Serialization</h1>\n      <h2 align=\"center\">Text Archive Class Diagram</h2>\n    </td>\n  </tr>\n</table>\n<hr>\n\n<pre><code>\n\n\nbasic_oarchive <a href=\"../../../boost/archive/detail/basic_oarchive.hpp\">-&gt;</a>\n      |\n      |\n      |      interface_oarchive&lt;text_oarchive&gt; <a href=\"../../../boost/archive/detail/interface_oarchive.hpp\">-&gt;</a>\n      |                     /\n      |                   /\n      |        _________/\n      |      /\n      |    /\n      |  /\ncommon_oarchive&lt;text_oarchive&gt; <a href=\"../../../boost/archive/detail/common_oarchive.hpp\">-&gt;</a>\n      |\n      |\n<font color=\"blue\">basic_text_oarchive&lt;text_oarchive&gt;</font> <a href=\"../../../boost/archive/basic_text_oarchive.hpp\">-&gt;</a>\n      |\n      |\n      |     <font color=\"blue\">basic_text_oprimitive&lt;basic_ostream&gt;</font> <a href=\"../../../boost/archive/basic_text_oprimitive.hpp\">-&gt;</a>\n      |                    /\n      |                  /\n      |       _________/                  interface_oarchive&lt;polymorphic_oarchive&gt; <a href=\"../../../boost/archive/detail/interface_oarchive.hpp\">-&gt;</a>\n      |     /                                                |\n      |   /                                                  |\n      | /                                                    |\n<font color=\"blue\">text_oarchive_impl&lt;text_oarchive&gt;</font> <a href=\"../../../boost/archive/text_oarchive.hpp\">-&gt;</a>              polymorphic_oarchive_impl <a href=\"../../../boost/archive/polymorphic_oarchive.hpp\">-&gt;</a>\n      | \\                                                    |\n      |   \\                                                  |\n      |     \\_____________________________________    <font color=\"red\">polymorphic_oarchive</font> <a href=\"../../../boost/archive/polymorphic_oarchive.hpp\">-&gt;</a>\n      |                                           \\         /\n      |                                             \\     /\n      |                                               \\ /  \n<font color=\"red\">text_oarchive</font> <a href=\"../../../boost/archive/text_oarchive.hpp\">-&gt;</a>                 polymorphic_oarchive_route&lt;text_oarchive_impl&lt;text_oarchive&gt; &gt; <a href=\"../../../boost/archive/detail/polymorphic_oarchive_route.hpp\">-&gt;</a>\n                                                       |\n                                                       |\n                                                       |\n                                             <font color=\"red\">polymorphic_text_oarchive</font> <a href=\"../../../boost/archive/polymorphic_text_oarchive.hpp\">-&gt;</a>\n\n\n</code></pre>\nThis diagram shows the relationship between the various classes that implement saving (output\nserialization) for text archives.  The hierarchy and organization is similar for loading and for\nother types of archives as well.  In the diagram, classes written in <font color=\"blue\">blue</font> \nimplement saving for a given archive type. (in this case it's text archives).\nUsers include classes in <font color=\"red\">red</font> to save their data from a particular\ntype of archive.  Other classes whose names are in black implement the library and should\nnever change.  They are in <code>namespace boost::archive::detail</code>\n<dl>\n  <dt><code>\n  <a href=\"../../../boost/archive/detail/basic_oarchive.hpp\">basic_oarchive</a>\n  </code></dt>\n  <dd>\n  Implements the core library functions for class export, versioning, and object tracking.  It is compiled\n  into the library as it has no template parameters.\n  </dd>\n  <p><dt><code>\n  <a href=\"../../../boost/archive/detail/interface_oarchive.hpp\">interface_oarchive&lt;text_oarchive&gt;</a>\n  </code></dt>\n  <dd>\n  A class that declares the standard archive interface.  This has been factored out so that it\n  can be used as a base class for <code style=\"white-space: normal\">polymorphic_oarchive</code>\n  as well as for archive implementations.\n  \n  <p><dt><code>\n  <a href=\"../../../boost/archive/detail/common_oarchive.hpp\">common_oarchive&lt;text_oarchive&gt;</a>\n  </code></dt>\n  <dd>\n  The function of this class is to make the connection between the virtual function\n  interface used by <code>basic_oarchive</code> and the template interface used by archive\n  class implementations.\n  \n  <p><dt><code>\n  <a href=\"../../../boost/archive/basic_text_oarchive.hpp\">basic_text_oarchive&lt;text_oarchive&gt;</a>\n  </code></dt>\n  <dd>\n  Implements the basic functionality for simple text archives.  The primitive save functions have been \n  factored out so it can be used in other text based archives like XML archives.\n  \n  <p><dt><code>\n  <a href=\"../../../boost/archive/basic_text_oprimitive.hpp\">basic_text_oprimitive&lt;basic_ostream&gt;</a>\n  </code></dt>\n  <dd>\n  Implements the save oversaves for all primitive types.  This is a template with a parameter\n  which describes the stream.\n  \n  <p><dt><code>\n  <a href=\"../../../boost/archive/text_oarchive.hpp\">text_oarchive_impl&lt;text_oarchive&gt;</a>                 \n  </code></dt>\n  <dd>\n  Inherits from the above two classes to implement text archives.\n  </dd>\n\n  <p><dt><code>\n  <a href=\"../../../boost/archive/text_oarchive.hpp\">text_oarchive</a>\n  </code></dt>\n  <dd>\n  This is just a short hand for <code style=\"white-space: normal\">text_oarchive_impl&lt;text_oarchive&gt;</code> .\n  We can't use <code style=\"white-space: normal\">typedef</code> because  a \n  <code style=\"white-space: normal\">typedef</code> can't refer to it self in its definition.  \n  This is the class name that is used to serialize to a text archive.\n  </dd>\n\n  <p><dt><code>\n  <a href=\"../../../boost/archive/detail/interface_oarchive.hpp\">interface_oarchive&lt;polymorphic_oarchive&gt;</a>\n  </code></dt>\n  <dd>\n  Same template as above.  However, this time the Archive parameter refers to the polymorphic archive\n  with a virtual function interface rather than that the template interface that\n  <code style=\"white-space: normal\">common_oarchive</code> uses.\n  \n  <p><dt><code>\n  <a href=\"../../../boost/archive/polymorphic_oarchive.hpp\">polymorphic_oarchive</a>\n  </code></dt>\n  <dd>\n  A class with a list of virtual <code style=\"white-space: normal\">save(T &amp;t)</code>\n  for all primitive types T. This is the class that is used to do pre-compile serialization of classes\n  for all archives present and future.\n  \n  <p><dt><code>\n  <a href=\"../../../boost/archive/detail/polymorphic_oarchive_route.hpp\">polymorphic_oarchive_route&lt;text_oarchive_impl&lt;text_oarchive&gt; &gt;</a>\n  </code></dt>\n  <dd><p>\n  This class implements the <code style=\"white-space: normal\">polymorphic_oarchive</code> in terms of a specific \n  concrete class.  Virtual function calls are routed to the implementing class.  In this example, \n  that implementing class would be text_oarchive_impl.\n  \n  <p><dt><code>\n  <a href=\"../../../boost/archive/polymorphic_text_oarchive.hpp\">polymorphic_text_oarchive</a>\n  </code></dt>\n  <dd>\n  this is just a typedef so we can write <code style=\"white-space: normal\">polymorphic_text_archive</code> rather than\n  <code style=\"white-space: normal\">polymorphic_oarchive_route&lt;text_oarchive_impl&lt;text_oarchive&gt; &gt;</code>\n  \n</dl>\n<hr>\n<p><i>&copy; Copyright <a href=\"http://www.rrsd.com\">Robert Ramey</a> 2002-2004. \nDistributed under the Boost Software License, Version 1.0. (See\naccompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n</i></p>\n</body>\n</html>"
  },
  {
    "path": "doc/codecvt.html",
    "content": "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">\n<html>\n<!--\n  == Copyright (c) 2001 Ronald Garcia\n  ==\n  == Permission to use, copy, modify, distribute and sell this software\n  == and its documentation for any purpose is hereby granted without fee,\n  == provided that the above copyright notice appears in all copies and\n  == that both that copyright notice and this permission notice appear\n  == in supporting documentation.  Ronald Garcia makes no\n  == representations about the suitability of this software for any\n  == purpose.  It is provided \"as is\" without express or implied warranty.\n  -->\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\n<link rel=\"stylesheet\" type=\"text/css\" href=\"../../../boost.css\">\n<link rel=\"stylesheet\" type=\"text/css\" href=\"style.css\">\n<head>\n<title>UTF-8 Codecvt Facet</title>\n\n</head>\n\n<body bgcolor=\"#ffffff\" link=\"#0000ee\" text=\"#000000\" \n      vlink=\"#551a8b\" alink=\"#ff0000\">\n<img src=\"../../../boost.png\" alt=\"C++ Boost\" \nwidth=\"277\" height=\"86\"> <br clear=\"all\">\n\n\n<a name=\"sec:utf8-codecvt-facet-class\"></a>\n\n\n<h1><code>utf8_codecvt_facet</code></h1>\n\n\n<pre>\ntemplate&lt;\n    typename InternType = wchar_t, \n    typename ExternType = char\n&gt; utf8_codecvt_facet\n</pre>\n\n\n<h2>Rationale</h2>\n\n\n    UTF-8 is a method of encoding Unicode text in environments\n    where data is stored as 8-bit characters and some ascii characters \n    are considered special (i.e. Unix filesystem filenames) and tend\n    to appear more commonly than other characters.  While\n    UTF-8 is convenient and efficient for storing data on filesystems, \n    it was not meant to be manipulated in memory by\n    applications. While some applications (such as Unix's 'cat') can\n    simply ignore the encoding of data, others should convert \n    from UTF-8 to UCS-4 (the more canonical representation of Unicode) \n    on reading from file, and reversing the process on writing out to\n    file.\n    \n    <p>The C++ Standard IOStreams provides the <tt>std::codecvt</tt>\n    facet to handle specifically these cases.  On reading from or\n    writing to a file, the <tt>std::basic_filebuf</tt> can call out to\n    the codecvt facet to convert data representations from external\n    format (ie. UTF-8) to internal format (ie. UCS-4) and\n    vice-versa. <tt>utf8_codecvt_facet</tt> is a specialization of\n    <tt>std::codecvt</tt> specifically designed to handle the case\n    of translating between UTF-8 and UCS-4.\n\n\n<h2>Template Parameters</h2>\n\n<table border summary=\"template parameters\">\n<tr>\n<th>Parameter</th><th>Description</th><th>Default</th>\n</tr>\n\n<tr>\n<td><tt>InternType</tt></td>\n<td>The internal type used to represent UCS-4 characters.</td>\n<td><tt>wchar_t</tt></td>\n</tr>\n\n<tr>\n<td><tt>ExternType</tt></td>\n<td>The external type used to represent UTF-8 octets.</td>\n<td><tt>char_t</tt></td>\n</tr>\n</table>\n\n\n<h2>Requirements</h2>\n\n    <tt>utf8_codecvt_facet</tt> defaults to using <tt>char</tt> as\n    its external data type and <tt>wchar_t</tt> as its internal\n    datatype, but on some architectures <tt>wchar_t</tt> is\n    not large enough to hold UCS-4 characters.  In order to use\n    another internal type.You must also specialize <tt>std::codecvt</tt>\n    to handle your internal and external types.\n    (<tt>std::codecvt&lt;char,wchar_t,std::mbstate_t&gt;</tt> is required to be\n    supplied by any standard-conforming compiler).\n\n\n<h2>Example Use</h2>\n    The following is a simple example of using this facet:\n\n<pre>\n  //...\n  // My encoding type\n  typedef wchar_t ucs4_t;\n\n  std::locale old_locale;\n  std::locale utf8_locale(old_locale,new utf8_codecvt_facet&lt;ucs4_t&gt;);\n\n  // Set a New global locale\n  std::locale::global(utf8_locale);\n\n  // Send the UCS-4 data out, converting to UTF-8\n  {\n    std::wofstream ofs(\"data.ucd\");\n    ofs.imbue(utf8_locale);\n    std::copy(ucs4_data.begin(),ucs4_data.end(),\n          std::ostream_iterator&lt;ucs4_t,ucs4_t&gt;(ofs));\n  }\n\n  // Read the UTF-8 data back in, converting to UCS-4 on the way in\n  std::vector&lt;ucs4_t&gt; from_file;\n  {\n    std::wifstream ifs(\"data.ucd\");\n    ifs.imbue(utf8_locale);\n    ucs4_t item = 0;\n    while (ifs &gt;&gt; item) from_file.push_back(item);\n  }\n  //...\n</pre>\n\n\n<h2>History</h2>\n\n    This code was originally written as an iterator adaptor over\n    containers for use with UTF-8 encoded strings in memory.\n    Dietmar Kuehl suggested that it would be better provided as a\n    codecvt facet.\n\n<h2>Resources</h2>\n\n<ul>\n<li> <a href=\"http://www.unicode.org\">Unicode Homepage</a>\n<li> <a href=\"http://home.CameloT.de/langer/iostreams.htm\">Standard\n      C++ IOStreams and Locales</a>\n<li> <a href=\"http://www.research.att.com/~bs/3rd.html\">The C++\n      Programming Language Special Edition, Appendix D.</a> \n</ul>\n\n<br>\n<hr>\n<table summary=\"Copyright information\">\n<tr valign=\"top\">\n<td nowrap>Copyright &copy; 2001</td>\n<td><a href=\"http://www.osl.iu.edu/~garcia\">Ronald Garcia</a>,\nIndiana University \n(<a href=\"mailto:garcia@cs.indiana.edu\">garcia@osl.iu.edu</a>)<br>\n<a href=\"http://www.osl.iu.edu/~lums\">Andrew Lumsdaine</a>,\nIndiana University\n(<a href=\"mailto:lums@osl.iu.edu\">lums@osl.iu.edu</a>)</td>\n</tr>\n</table>\n<p><i>&copy; Copyright <a href=\"http://www.rrsd.com\">Robert Ramey</a> 2002-2004. \nDistributed under the Boost Software License, Version 1.0. (See\naccompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n</i></p>\n</body>\n</html>\n\n\n"
  },
  {
    "path": "doc/configuration.html",
    "content": "<!doctype HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">\n<html>\n<!--\n(C) Copyright 2002-4 Robert Ramey - http://www.rrsd.com . \nUse, modification and distribution is subject to the Boost Software\nLicense, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\nhttp://www.boost.org/LICENSE_1_0.txt)\n-->\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\n<link rel=\"stylesheet\" type=\"text/css\" href=\"../../../boost.css\">\n<link rel=\"stylesheet\" type=\"text/css\" href=\"style.css\">\n<title>Serialization - Configuration</title>\n</head>\n<body link=\"#0000ff\" vlink=\"#800080\">\n</body>\n</html>\n"
  },
  {
    "path": "doc/contents.html",
    "content": "<!doctype HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">\n<html>\n<!--\n(C) Copyright 2002-4 Robert Ramey - http://www.rrsd.com . \nUse, modification and distribution is subject to the Boost Software\nLicense, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\nhttp://www.boost.org/LICENSE_1_0.txt)\n-->\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\n<link rel=\"stylesheet\" type=\"text/css\" href=\"../../../boost.css\">\n<title>Serialization</title>\n\n<!-- Expanding Menu Script Starts Here -->\n<script language=\"JavaScript\">\n//<--!\n// netscape version\n\nfunction toggle(element) {\n  if (null == element){\n    return;\n  }\n  var targetId = element.id + \"_detail\";\n  targetElement = document.getElementById(targetId);\n  if (null != targetElement){\n    if (targetElement.style.display == \"none\") {\n      targetElement.style.display = \"\";\n      element.src=\"minus.gif\";\n    }\n    else{\n      targetElement.style.display = \"none\";\n      element.src=\"plus.gif\";\n    }\n  }\n}\n\nfunction clickHandlerNS(e) {\n  toggle(e.target);\n}\n\n// explorer version\nfunction clickHandlerIE() {\n  toggle(window.event.srcElement);\n}\n\nfunction collapse_all() {\n  var l = document.images;\n  var i = l.length;\n  while(i > 0){\n    i = i - 1;\n    var image = l[i];\n    image.style.display = \"\";\n    toggle(image);\n  }\n}\n\n\nfunction initialize() {\n  if(navigator.appName.indexOf(\"Netscape\") != -1){\n    document.onclick = clickHandlerNS;\n    collapse_all();\n  }\n  else\n  if(navigator.appName.indexOf(\"Microsoft\") != -1){\n    document.onclick = clickHandlerIE;\n    collapse_all();\n  }\n  else\n  if (navigator.appnName.indexOf(\"Konqueror\") >= 0){\n    document.onclick = clickHandlerIE;\n    collapse_all();\n  }\n}\n\n//-->\n</script>\n\n</head>\n<body onload=\"initialize()\">\n<h2>Contents</h2>\n<small>\n<!--\n<img src=\"dot.gif\" onclick=\"collapse_all()\">Collapse All\n-->\n<p>\n<dl class=\"page-index\">\n  <dt><img style=\"display:none\" src=\"dot.gif\" id=\"release_notes\"><a target=\"detail\" href=\"release.html\">Release Notes</a></dt>\n  <dt><img style=\"display:none\" src=\"plus.gif\" id=\"overview\"><a target=\"detail\" href=\"overview.html\">Overview</a></dt>\n  <dd><div id=\"overview_detail\"><dl class=\"page-index\">\n    <dt><img style=\"display:none\" src=\"dot.gif\"><a target=\"detail\" href=\"overview.html#Requirements\">Requirements</a></dt>\n    <dt><img style=\"display:none\" src=\"dot.gif\"><a target=\"detail\" href=\"overview.html#Otherimplementations\">Other Implementations</a></dt>\n  </dl></div></dd>\n  <dt><img style=\"display:none\" src=\"plus.gif\" id=\"tutorial\"><a target=\"detail\" href=\"tutorial.html\">Tutorial</a></dt>\n  <dd><div id=\"tutorial_detail\"><dl class=\"page-index\"> \n    <dt><img style=\"display:none\" src=\"dot.gif\"><a target=\"detail\" href=\"tutorial.html#simplecase\">A Very Simple Case</a>\n    <dt><img style=\"display:none\" src=\"dot.gif\"><a target=\"detail\" href=\"tutorial.html#nonintrusiveversion\">Non Intrusive Version</a>\n    <dt><img style=\"display:none\" src=\"dot.gif\"><a target=\"detail\" href=\"tutorial.html#serializablemembers\">Serializable Members</a>\n    <dt><img style=\"display:none\" src=\"dot.gif\"><a target=\"detail\" href=\"tutorial.html#derivedclasses\">Derived Classes</a>\n    <dt><img style=\"display:none\" src=\"dot.gif\"><a target=\"detail\" href=\"tutorial.html#pointers\">Pointers</a>\n    <dt><img style=\"display:none\" src=\"dot.gif\"><a target=\"detail\" href=\"tutorial.html#arrays\">Arrays</a>\n\n    <dt><img style=\"display:none\" src=\"dot.gif\"><a target=\"detail\" href=\"tutorial.html#stl\">STL Collections</a>\n    <dt><img style=\"display:none\" src=\"dot.gif\"><a target=\"detail\" href=\"tutorial.html#versioning\">Class Versioning</a>\n    <dt><img style=\"display:none\" src=\"dot.gif\">\n        <a target=\"detail\" href=\"tutorial.html#splitting\">\n            Splitting <code>serialize</code> into <code>save/load</code>\n        </a>\n    <dt><img style=\"display:none\" src=\"dot.gif\"><a target=\"detail\" href=\"tutorial.html#archives\">Archives</a>\n    <dt><img style=\"display:none\" src=\"dot.gif\"><a target=\"detail\" href=\"tutorial.html#examples\">List of Examples</a>\n  </dl></div></dd>\n\n  <dt><img style=\"display:none\" src=\"plus.gif\" id=\"reference\"><a target=\"detail\" href=\"reference.html\">Reference</a></dt>\n  <dd><div id=\"reference_detail\"><dl class=\"page-index\"> \n    <dt><img style=\"display:none\" src=\"plus.gif\" id=\"archive_concept\"><a target=\"detail\" href=\"archives.html\">Archive Concepts</a>\n    <dd><div id=\"archive_concept_detail\"><dl class=\"page-index\">\n      <dt><img style=\"display:none\" src=\"dot.gif\"><a target=\"detail\" href=\"archives.html#saving_interface\">Saving Archive Concept</a>\n      <dt><img style=\"display:none\" src=\"dot.gif\"><a target=\"detail\" href=\"archives.html#loading_interface\">Loading Archive Concept</a>\n      <dt><img style=\"display:none\" src=\"dot.gif\"><a target=\"detail\" href=\"archives.html#archive_models\">Archive Models</a>\n      <dt><img style=\"display:none\" src=\"dot.gif\"><a target=\"detail\" href=\"archives.html#exceptions\">Exceptions</a>\n      <dt><img style=\"display:none\" src=\"dot.gif\"><a target=\"detail\" href=\"archives.html#charactersets\">Character Sets</a>\n    </dl></div></dd>\n    <dt><img style=\"display:none\" src=\"plus.gif\" id=\"serialization\"><a target=\"detail\" href=\"serialization.html\">Serializable Concept</a>\n    <dd><div id=\"serialization_detail\"><dl class=\"page-index\">\n      <dt><img style=\"display:none\" src=\"dot.gif\"><a target=\"detail\" href=\"serialization.html#primitiveoperators\">Primitive Types</a>\n      <dt><img style=\"display:none\" src=\"dot.gif\" id=\"class\"><a target=\"detail\" href=\"serialization.html#classoperators\">Class Types</a>\n      <dd><div id=\"class_detail\"><dl class=\"page-index\">\n        <dt><img style=\"display:none\" src=\"dot.gif\"><a target=\"detail\" href=\"serialization.html#member\">Member Function</a>\n        <dt><img style=\"display:none\" src=\"plus.gif\" id=\"splitfree\"><a target=\"detail\" href=\"serialization.html#free\">Free Function</a>\n        <dd><div id=\"splitfree_detail\"><dl class=\"page-index\">\n          <dt><img style=\"display:none\" src=\"dot.gif\"><a target=\"detail\" href=\"serialization.html#namespaces\">Namespaces for Free Function Overrides</a>\n        </dl></div></dd>\n        <dt><img style=\"display:none\" src=\"plus.gif\" id=\"members\"><a target=\"detail\" href=\"serialization.html#classmembers\">Class Members</a>\n        <dd><div id=\"members_detail\"><dl class=\"page-index\">\n          <dt><img style=\"display:none\" src=\"dot.gif\"><a target=\"detail\" href=\"serialization.html#base\">Base Classes</a>\n          <dt><img style=\"display:none\" src=\"dot.gif\"><a target=\"detail\" href=\"serialization.html#const\"><code>const</code> Members</a>\n          <dt><img style=\"display:none\" src=\"dot.gif\"><a target=\"detail\" href=\"serialization.html#templates\">Templates</a>\n        </dl></div></dd>\n        <dt><img style=\"display:none\" src=\"dot.gif\"><a target=\"detail\" href=\"serialization.html#versioning\">Versioning</a>\n        <dt><img style=\"display:none\" src=\"dot.gif\"><a target=\"detail\" href=\"tutorial.html#splitting\">\n                Splitting <code>serialize</code> into <code>save/load</code>\n            </a>\n      </dl></div></dd>\n      <dt><img style=\"display:none\" src=\"plus.gif\" id=\"pointers\"><a target=\"detail\" href=\"serialization.html#pointeroperators\">Pointers</a>\n      <dd><div id=\"pointers_detail\"><dl class=\"page-index\">\n        <dt><img style=\"display:none\" src=\"dot.gif\"><a target=\"detail\" href=\"serialization.html#constructors\">Non-Default Constructors</a>\n        <dt><img style=\"display:none\" src=\"plus.gif\" id=\"derivedpointers\"><a target=\"detail\" href=\"serialization.html#derivedpointers\">Pointers to Objects of Derived Classes</a>\n        <dd><div id=\"derivedpointers_detail\"><dl class=\"page-index\">\n          <dt><img style=\"display:none\" src=\"dot.gif\"><a target=\"detail\" href=\"serialization.html#registration\">Registration</a>\n          <dt><img style=\"display:none\" src=\"dot.gif\"><a target=\"detail\" href=\"serialization.html#export\">Export</a>\n          <dt><img style=\"display:none\" src=\"dot.gif\"><a target=\"detail\" href=\"serialization.html#instantiation\">Instantiation</a>\n          <dt><img style=\"display:none\" src=\"dot.gif\"><a target=\"detail\" href=\"serialization.html#selectivetracking\">Selective Tracking</a>\n          <dt><img style=\"display:none\" src=\"dot.gif\"><a target=\"detail\" href=\"serialization.html#runtimecasting\">Runtime Casting</a>\n        </dl></div></dd>\n      </dl></div></dd>\n      <dt><img style=\"display:none\" src=\"dot.gif\"><a target=\"detail\" href=\"serialization.html#references\">References</a>\n      <dt><img style=\"display:none\" src=\"plus.gif\" id=\"traits\"><a target=\"detail\" href=\"traits.html\">Class Serialization Traits</a>\n      <dd><div id=\"traits_detail\"><dl class=\"page-index\">\n        <dt><img style=\"display:none\" src=\"dot.gif\"><a target=\"detail\" href=\"traits.html#version\">Version</a>\n        <dt><img style=\"display:none\" src=\"dot.gif\"><a target=\"detail\" href=\"traits.html#level\">Implementation Level</a>\n        <dt><img style=\"display:none\" src=\"dot.gif\"><a target=\"detail\" href=\"traits.html#tracking\">Object Tracking</a>\n        <dt><img style=\"display:none\" src=\"dot.gif\"><a target=\"detail\" href=\"traits.html#export\">Export Key</a>\n        <dt><img style=\"display:none\" src=\"dot.gif\"><a target=\"detail\" href=\"traits.html#Abstract\">Abstract</a>\n        <dt><img style=\"display:none\" src=\"dot.gif\"><a target=\"detail\" href=\"traits.html#typeinfo\">Type Information Implementation</a>\n        <dt><img style=\"display:none\" src=\"dot.gif\"><a target=\"detail\" href=\"traits.html#wrappers\">Wrappers</a>\n        <dt><img style=\"display:none\" src=\"dot.gif\"><a target=\"detail\" href=\"traits.html#bitwise\">Bitwise Serialization</a>\n        <dt><img style=\"display:none\" src=\"dot.gif\"><a target=\"detail\" href=\"traits.html#templates\">Template Serialization Traits</a>\n\n        <dt><img style=\"display:none\" src=\"plus.gif\" id=\"compiletimemessages\"><a target=\"detail\" href=\"traits.html#compiletime_messages\">Compile Time Warnings and Errors</a>\n        <dd><div id=\"compiletimemessages_detail\"><dl class=\"page-index\">\n          <dt><img style=\"display:none\" src=\"dot.gif\"><a target=\"detail\" href=\"traits.html#object_level\">object_level</a>\n          <dt><img style=\"display:none\" src=\"dot.gif\"><a target=\"detail\" href=\"traits.html#object_versioning\">object_versioning</a>\n          <dt><img style=\"display:none\" src=\"dot.gif\"><a target=\"detail\" href=\"traits.html#object_tracking\">object_tracking</a>\n          <dt><img style=\"display:none\" src=\"dot.gif\"><a target=\"detail\" href=\"traits.html#pointer_level\">pointer_level</a>\n          <dt><img style=\"display:none\" src=\"dot.gif\"><a target=\"detail\" href=\"traits.html#pointer_tracking\">pointer_tracking</a>\n          <dt><img style=\"display:none\" src=\"dot.gif\"><a target=\"detail\" href=\"traits.html#const_loading\">const_loading</a>\n        </dl></div></dd>\n      </dl></div></dd>\n      <dt><img style=\"display:none\" src=\"plus.gif\" id=\"wrappers\"><a target=\"detail\" href=\"wrappers.html\">Serialization Wrappers</a>\n      <dd><div id=\"wrappers_detail\"><dl class=\"page-index\">\n        <dt><img style=\"display:none\" src=\"dot.gif\"><a target=\"detail\" href=\"wrappers.html#binaryobjects\">Binary Objects</a>\n        <dt><img style=\"display:none\" src=\"dot.gif\"><a target=\"detail\" href=\"wrappers.html#arrays\">Arrays</a>\n        <dt><img style=\"display:none\" src=\"dot.gif\"><a target=\"detail\" href=\"wrappers.html#strong_type\"><code style=\"white-space: normal\">strong_type</code></a>\n        <dt><img style=\"display:none\" src=\"dot.gif\"><a target=\"detail\" href=\"wrappers.html#collection_size_type\">Collection Sizes</a>\n        <dt><img style=\"display:none\" src=\"dot.gif\"><a target=\"detail\" href=\"wrappers.html#nvp\">Name-Value Pairs</a>\n        <dt><img style=\"display:none\" src=\"dot.gif\"><a target=\"detail\" href=\"wrappers.html#composition\">Composition</a>\n      </dl></div></dd>\n      <dt><img style=\"display:none\" src=\"dot.gif\"><a target=\"detail\" href=\"serialization.html#models\">Models - Serialization Implementations Included in the Library</a>\n    </dl></div></dd>\n    <dt><img style=\"display:none\" src=\"plus.gif\" id=\"special\"><a target=\"detail\" href=\"special.html\">Special Considerations</a>\n    <dd><div id=\"special_detail\"><dl class=\"page-index\">\n      <dt><img style=\"display:none\" src=\"dot.gif\"><a target=\"detail\" href=\"special.html#objecttracking\">Object Tracking</a>\n      <dt><img style=\"display:none\" src=\"dot.gif\"><a target=\"detail\" href=\"special.html#classinfo\">Class Information</a>\n      <dt><img style=\"display:none\" src=\"dot.gif\"><a target=\"detail\" href=\"special.html#helpersupport\">Helper Support</a>\n      <dt><img style=\"display:none\" src=\"plus.gif\" id=\"portability\"><a target=\"detail\" href=\"special.html#portability\">Archive Portability</a>\n      <dd><div id=\"portability_detail\"><dl class=\"page-index\">\n        <dt><img style=\"display:none\" src=\"dot.gif\"><a target=\"detail\" href=\"special.html#numerics\">Numerics</a>\n        <dt><img style=\"display:none\" src=\"dot.gif\"><a target=\"detail\" href=\"special.html#traits\">Traits</a>\n      </dl></div></dd>\n      <dt><img style=\"display:none\" src=\"dot.gif\"><a target=\"detail\" href=\"special.html#binary_archives\">Binary Archives</a>\n      <dt><img style=\"display:none\" src=\"dot.gif\"><a target=\"detail\" href=\"special.html#xml_archives\">XML Archives</a>\n      <dt><img style=\"display:none\" src=\"dot.gif\"><a target=\"detail\" href=\"special.html#export\">Exporting Class Serialization</a>\n      <dt><img style=\"display:none\" src=\"dot.gif\"><a target=\"detail\" href=\"special.html#static_libraries\">Static Libraries and Serialization</a>\n      <dt><img style=\"display:none\" src=\"dot.gif\"><a target=\"detail\" href=\"special.html#dlls\">DLLS - Serialization and Runtime Linking</a>\n      <dt><img style=\"display:none\" src=\"dot.gif\"><a target=\"detail\" href=\"special.html#plugins\">Plugins</a>\n      <dt><img style=\"display:none\" src=\"dot.gif\"><a target=\"detail\" href=\"special.html#multi_threading\">Multi-Threading</a>\n      <dt><img style=\"display:none\" src=\"dot.gif\"><a target=\"detail\" href=\"special.html#optimizations\">Optimizations</a>\n      <dt><img style=\"display:none\" src=\"plus.gif\" id=\"exceptions\"><a target=\"detail\" href=\"exceptions.html\">Archive Exceptions</a>\n      <dd><div id=\"exceptions_detail\"><dl class=\"page-index\">\n        <dt><img style=\"display:none\" src=\"dot.gif\"><a target=\"detail\" href=\"exceptions.html#unregistered_class\"><code>unregistered_class</code></a>\n        <dt><img style=\"display:none\" src=\"dot.gif\"><a target=\"detail\" href=\"exceptions.html#invalid_signature\"><code>invalid_signature</code></a>\n        <dt><img style=\"display:none\" src=\"dot.gif\"><a target=\"detail\" href=\"exceptions.html#unsupported_version\"><code>unsupported_version</code></a>\n        <dt><img style=\"display:none\" src=\"dot.gif\"><a target=\"detail\" href=\"exceptions.html#pointer_conflict\"><code>pointer_conflict</code></a>\n        <dt><img style=\"display:none\" src=\"dot.gif\"><a target=\"detail\" href=\"exceptions.html#incompatible_native_format\"><code>incompatible_format</code></a>\n        <dt><img style=\"display:none\" src=\"dot.gif\"><a target=\"detail\" href=\"exceptions.html#array_size_too_short\"><code>array_size_too_short</code></a>\n        <dt><img style=\"display:none\" src=\"dot.gif\"><a target=\"detail\" href=\"exceptions.html#stream_error\"><code>stream_error</code></a>\n        <dt><img style=\"display:none\" src=\"dot.gif\"><a target=\"detail\" href=\"exceptions.html#invalid_class_name\"><code>invalid_class_name</code></a>\n        <dt><img style=\"display:none\" src=\"dot.gif\"><a target=\"detail\" href=\"exceptions.html#unregistered_cast\"><code>unregistered_cast</code></a>\n        <dt><img style=\"display:none\" src=\"dot.gif\"><a target=\"detail\" href=\"exceptions.html#xml_archive_parsing_error\"><code>xml_archive_parsing_error</code></a>\n        <dt><img style=\"display:none\" src=\"dot.gif\"><a target=\"detail\" href=\"exceptions.html#xml_archive_tag_mismatch\"><code>xml_archive_tag_mismatch</code></a>\n        <dt><img style=\"display:none\" src=\"dot.gif\"><a target=\"detail\" href=\"exceptions.html#xml_archive_tag_name_error\"><code>xml_archive_tag_name_error</code></a>\n      </dl></div></dd>\n      <dt><img style=\"display:none\" src=\"dot.gif\"><a target=\"detail\" href=\"exception_safety.html\">Exception Safety</a>\n    </dl></div></dd>\n    <dt><img style=\"display:none\" src=\"plus.gif\" id=\"archive_reference\"><a target=\"detail\" href=\"archive_reference.html\">Archive Class Reference</a>\n    <dd><div id=\"archive_reference_detail\"><dl class=\"page-index\">\n      <dt><img style=\"display:none\" src=\"dot.gif\"><a target=\"detail\" href=\"archive_reference.html#trivial\">Trivial Archive</a>\n      <dt><img style=\"display:none\" src=\"dot.gif\"><a target=\"detail\" href=\"archive_reference.html#implementation\">More Useful Archive Classes</a>\n      <dt><img style=\"display:none\" src=\"dot.gif\"><a target=\"detail\" href=\"archive_reference.html#usage\">Usage</a>\n      <dt><img style=\"display:none\" src=\"dot.gif\"><a target=\"detail\" href=\"archive_reference.html#testing\">Testing</a>\n      <dt><img style=\"display:none\" src=\"dot.gif\"><a target=\"detail\" href=\"archive_reference.html#polymorphic\">Polymorphic Archives</a>\n    </dl></div></dd>\n  </dl></div></dd>\n  <dt><img style=\"display:none\" src=\"plus.gif\" id=\"implementation\"><a target=\"detail\" href=\"implementation.html\">Implementation Notes</a>\n  <dd><div id=\"implementation_detail\"><dl class=\"page-index\">\n    <dt><img style=\"display:none\" src=\"dot.gif\"><a target=\"detail\" href=\"implementation.html#charencoding\">Character Encoding</a>\n    <dt><img style=\"display:none\" src=\"dot.gif\"><a target=\"detail\" href=\"implementation.html#tempatesyntax\">Template Invocation syntax</a>\n    <dt><img style=\"display:none\" src=\"dot.gif\"><a target=\"detail\" href=\"implementation.html#partialtemplatespecialization\">Partial Template Specialization</a>\n    <dt><img style=\"display:none\" src=\"plus.gif\" id=\"othercompilerissues\"><a target=\"detail\" href=\"implementation.html#othercompilerissues\">Specific Compiler/Library Issues</a>\n    <dd><div id=\"othercompilerissues_detail\"><dl class=\"page-index\">\n      <dt><img style=\"display:none\" src=\"dot.gif\"><a target=\"detail\" href=\"implementation.html#gcc3x\">GCC 3.X,4.X</a>\n      <dt><img style=\"display:none\" src=\"dot.gif\"><a target=\"detail\" href=\"implementation.html#gcc295\">GCC 2.95</a>\n      <dt><img style=\"display:none\" src=\"dot.gif\"><a target=\"detail\" href=\"implementation.html#intel80\">Intel 8.0</a>\n      <dt><img style=\"display:none\" src=\"dot.gif\"><a target=\"detail\" href=\"implementation.html#vc80\">Visual C++ 8.0</a>\n      <dt><img style=\"display:none\" src=\"dot.gif\"><a target=\"detail\" href=\"implementation.html#vc71\">Visual C++ 7.1</a>\n      <dt><img style=\"display:none\" src=\"dot.gif\"><a target=\"detail\" href=\"implementation.html#vc70\">Visual C++ 7.0</a>\n      <dt><img style=\"display:none\" src=\"dot.gif\"><a target=\"detail\" href=\"implementation.html#vc6\">Visual C++ 6.0</a>\n      <dt><img style=\"display:none\" src=\"dot.gif\"><a target=\"detail\" href=\"implementation.html#borland\">Borland 5.64 and 5.51</a>\n      <dt><img style=\"display:none\" src=\"dot.gif\"><a target=\"detail\" href=\"implementation.html#comeau\">Comeau 4.3.3</a>\n      <dt><img style=\"display:none\" src=\"dot.gif\"><a target=\"detail\" href=\"implementation.html#codewarrior\">Code Warrior 8.3</a>\n      <dt><img style=\"display:none\" src=\"dot.gif\"><a target=\"detail\" href=\"implementation.html#tru64\">TRU64</a>\n      <dt><img style=\"display:none\" src=\"dot.gif\"><a target=\"detail\" href=\"implementation.html#dinkumware\">Dinkumware Library</a>\n      <dt><img style=\"display:none\" src=\"dot.gif\"><a target=\"detail\" href=\"implementation.html#stlport\">STLPort 4.5.3</a>\n    </dl></div></dd>\n    <dt><img style=\"display:none\" src=\"plus.gif\" id=\"headers\"><a target=\"detail\" href=\"headers.html\">Code Structure</a>\n    <dd><div id=\"headers_detail\"><dl class=\"page-index\">\n      <dt><img style=\"display:none\" src=\"plus.gif\" id=\"userincludes\"><a target=\"detail\" href=\"headers.html#userincludes\">Files Included by User Programs</a>\n      <dd><div id=\"userincludes_detail\"><dl class=\"page-index\">\n        <dt><img style=\"display:none\" src=\"dot.gif\"><a target=\"detail\" href=\"headers.html#archiveimplementations\">Archive Implementations</a>\n        <dt><img style=\"display:none\" src=\"dot.gif\"><a target=\"detail\" href=\"headers.html#serializationdeclarations\">Serialization Declarations</a>\n        <dt><img style=\"display:none\" src=\"dot.gif\"><a target=\"detail\" href=\"headers.html#serializationimplementations\">Serialization Implementations</a>\n      </dl></div>\n      <dt><img style=\"display:none\" src=\"plus.gif\" id=\"libraryimplementation\"><a target=\"detail\" href=\"headers.html#libraryimplementation\">Files Which Implement the Library</a>\n      <dd><div id=\"libraryimplementation_detail\"><dl class=\"page-index\">\n        <dt><img style=\"display:none\" src=\"dot.gif\"><a target=\"detail\" href=\"headers.html#archivedevelopment\">Archive Development</a>\n        <dt><img style=\"display:none\" src=\"dot.gif\"><a target=\"detail\" href=\"headers.html#archiveinternals\">Archive Internals</a>\n        <dt><img style=\"display:none\" src=\"dot.gif\"><a target=\"detail\" href=\"headers.html#codemodules\">Archive Library Code Modules</a>\n        <dt><img style=\"display:none\" src=\"dot.gif\"><a target=\"detail\" href=\"headers.html#dataflowiterators\">Dataflow Iterators</a>\n      </dl></div></dd>\n    </dl></div></dd>\n  </dl></div></dd>\n  <dt><img style=\"display:none\" src=\"plus.gif\" id=\"case_studies\">Case Studies\n  <dd><div id=\"case_studies_detail\"><dl class=\"page-index\">\n    <dt><img style=\"display:none\" src=\"dot.gif\"><a target=\"detail\" href=\"shared_ptr.html\">Template serialization - <code>shared_ptr&lt;class T&gt;</code></a>\n    <dt><img style=\"display:none\" src=\"dot.gif\"><a target=\"detail\" href=\"shared_ptr2.html\"><code>shared_ptr&lt;class T&gt;</code>Revisited</a>\n    <dt><img style=\"display:none\" src=\"dot.gif\"><a target=\"detail\" href=\"pimpl.html\">PIMPL</a>\n    <dt><img style=\"display:none\" src=\"dot.gif\"><a target=\"detail\" href=\"private_base.html\">Private Base Classes</a>\n    <dt><img style=\"display:none\" src=\"dot.gif\"><a target=\"detail\" href=\"simple_log.html\">A Simple Logging Archive Class</a>\n    <dt><img style=\"display:none\" src=\"dot.gif\"><a target=\"detail\" href=\"derivation.html\">Derivation from an Existing Archive Class</a>\n  </dl></div></dd>\n  <dt><img style=\"display:none\" src=\"plus.gif\" id=\"otherclasses\">Other Classes\n  <dd><div id=\"otherclasses_detail\"><dl class=\"page-index\">\n    <dt><img style=\"display:none\" src=\"plus.gif\" id=\"extended_type_info\"><a target=\"detail\" href=\"extended_type_info.html\"><code>extended_type_info</code></a>\n    <dd><div id=\"extended_type_info_detail\"><dl class=\"page-index\">\n      <dt><img style=\"display:none\" src=\"dot.gif\"><a target=\"detail\" href=\"extended_type_info.html#motivation\">Motivation</a>\n      <dt><img style=\"display:none\" src=\"dot.gif\"><a target=\"detail\" href=\"extended_type_info.html#runtime\">Runtime Interface</a>\n      <dt><img style=\"display:none\" src=\"dot.gif\"><a target=\"detail\" href=\"extended_type_info.html#requirements\">Requirements</a>\n      <dt><img style=\"display:none\" src=\"dot.gif\"><a target=\"detail\" href=\"extended_type_info.html#models\">Models</a>\n    </dl></div></dd>\n    <dt><img style=\"display:none\" src=\"dot.gif\"><a target=\"detail\" href=\"void_cast.html\"><code>void_cast</code></a>\n    <dt><img style=\"display:none\" src=\"dot.gif\"><a target=\"detail\" href=\"codecvt.html\"><code>utf8_codecvt_facet</code></a>\n    <dt><img style=\"display:none\" src=\"dot.gif\"><a target=\"detail\" href=\"strong_typedef.html\"><code>BOOST_STRONG_TYPEDEF</code></a>\n    <dt><img style=\"display:none\" src=\"dot.gif\"><a target=\"detail\" href=\"state_saver.html\"><code>state_saver</code></a>\n    <dt><img style=\"display:none\" src=\"dot.gif\"><a target=\"detail\" href=\"dataflow.html\">Dataflow Iterators</a>\n    <dt><img style=\"display:none\" src=\"dot.gif\"><a target=\"detail\" href=\"smart_cast.html\"><code>smart_cast</code></a>\n    <dt><img style=\"display:none\" src=\"dot.gif\"><a target=\"detail\" href=\"static_warning.html\"><code>BOOST_STATIC_WARNING</code></a>\n    <dt><img style=\"display:none\" src=\"plus.gif\" id=\"singleton\"><a target=\"detail\" href=\"singleton.html\"><code>singleton</code></a>\n    <dd><div id=\"singleton_detail\"><dl class=\"page-index\">\n      <dt><img style=\"display:none\" src=\"dot.gif\"><a target=\"detail\" href=\"singleton.html#motivation\">Motivation</a>\n      <dt><img style=\"display:none\" src=\"dot.gif\"><a target=\"detail\" href=\"singleton.html#features\">Features</a>\n      <dt><img style=\"display:none\" src=\"dot.gif\"><a target=\"detail\" href=\"singleton.html#classinterface\">Class Interface</a>\n      <dt><img style=\"display:none\" src=\"dot.gif\"><a target=\"detail\" href=\"singleton.html#requirements\">Requirements</a>\n      <dt><img style=\"display:none\" src=\"dot.gif\"><a target=\"detail\" href=\"singleton.html#examples\">Examples</a>\n      <dt><img style=\"display:none\" src=\"dot.gif\"><a target=\"detail\" href=\"singleton.html#multithreading\">Multi-Threading</a>\n    </dl></div></dd>\n  </dl></div></dd>\n  <!--\n  <dt><img style=\"display:none\" src=\"dot.gif\"><a target=\"detail\" href=\"configuration.html\">Configuration Information</a></dt>\n    -->\n  <dt><img style=\"display:none\" src=\"dot.gif\"><a target=\"detail\" href=\"faq.html\">Tips and Tricks</a>\n  <dt><img style=\"display:none\" src=\"plus.gif\" id=\"rationale\"><a target=\"detail\" href=\"rationale.html\">Rationale</a></dt>\n  <dd><div id=\"rationale_detail\"><dl class=\"page-index\">\n    <dt><img style=\"display:none\" src=\"dot.gif\"><a target=\"detail\" href=\"rationale.html#serialization\">The term \"serialization\" is preferred to \"persistence\"</a></dt>\n    <dt><img style=\"display:none\" src=\"dot.gif\"><a target=\"detail\" href=\"rationale.html#archives\">Archives are not streams</a></dt>\n    <dt><img style=\"display:none\" src=\"dot.gif\"><a target=\"detail\" href=\"rationale.html#typeid\"><code style=\"white-space: normal\">typeid</code> information is not included in archives</a></dt>\n  </dl></div></dd>\n\n  <dt><img style=\"display:none\" src=\"plus.gif\" id=\"todo\"><a target=\"detail\" href=\"todo.html\">To Do</a></dt>\n  <dd><div id=\"todo_detail\"><dl class=\"page-index\">\n    <dt><img style=\"display:none\" src=\"dot.gif\"><a target=\"detail\" href=\"todo.html#portablebinaryarchive\">Portable Binary Archive</a></dt>\n    <dt><img style=\"display:none\" src=\"dot.gif\"><a target=\"detail\" href=\"todo.html#performancetesting\">Performance Testing and Profiling</a></dt>\n    <dt><img style=\"display:none\" src=\"dot.gif\"><a target=\"detail\" href=\"todo.html#backversioning\">Back Versioning</a></dt>\n    <dt><img style=\"display:none\" src=\"dot.gif\"><a target=\"detail\" href=\"todo.html#nortti\">Environments without RTTI</a></dt>\n\n    <dt><img style=\"display:none\" src=\"plus.gif\" id=\"newcasestudies\"><a target=\"detail\" href=\"new_case_studies.html\">Proposed Case Studies</a></dt>\n    <dd><div id=\"newcasestudies_detail\"><dl class=\"page-index\">\n      <dt><img style=\"display:none\" src=\"dot.gif\"><a target=\"detail\" href=\"new_case_studies.html#functionobject\">Serializing a Function Object</a></dt>\n      <dt><img style=\"display:none\" src=\"dot.gif\"><a target=\"detail\" href=\"new_case_studies.html#archiveadaptor\">Archive Adaptors</a></dt>\n      <dt><img style=\"display:none\" src=\"dot.gif\"><a target=\"detail\" href=\"new_case_studies.html#archivehelper\">Archive Helpers</a></dt>\n    </dl></div></dd>\n\n  </dl></div></dd>\n\n  <dt><img style=\"display:none\" src=\"dot.gif\"><a target=\"detail\" href=\"history.html\">History</a>\n  <!--\n  <dt><img style=\"display:none\" src=\"dot.gif\"><a target=\"detail\" href=\"definitions.html\">Definitions</a></dt>\n  <dt><img style=\"display:none\" src=\"dot.gif\"><a target=\"detail\" href=\"faq.html\">Frequently Asked Questions (FAQs)</a></dt>\n    -->\n  <dt><img style=\"display:none\" src=\"dot.gif\"><a target=\"detail\" href=\"bibliography.html\">Bibliography</a></dt>\n  <dt><img style=\"display:none\" src=\"dot.gif\"><a target=\"detail\" href=\"acknowledgments.html\">Acknowledgments</a></dt>\n</dl></div>\n</small>\n</body>\n</html>\n"
  },
  {
    "path": "doc/dataflow.html",
    "content": "<!doctype HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">\n<html>\n<!--\n(C) Copyright 2002-4 Robert Ramey - http://www.rrsd.com . \nUse, modification and distribution is subject to the Boost Software\nLicense, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\nhttp://www.boost.org/LICENSE_1_0.txt)\n-->\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\n<link rel=\"stylesheet\" type=\"text/css\" href=\"../../../boost.css\">\n<link rel=\"stylesheet\" type=\"text/css\" href=\"style.css\">\n<title>Serialization - Dataflow Iterators</title>\n</head>\n<body link=\"#0000ff\" vlink=\"#800080\">\n<table border=\"0\" cellpadding=\"7\" cellspacing=\"0\" width=\"100%\" summary=\"header\">\n  <tr> \n    <td valign=\"top\" width=\"300\"> \n      <h3><a href=\"../../../index.htm\"><img height=\"86\" width=\"277\" alt=\"C++ Boost\" src=\"../../../boost.png\" border=\"0\"></a></h3>\n    </td>\n    <td valign=\"top\"> \n      <h1 align=\"center\">Serialization</h1>\n      <h2 align=\"center\">Dataflow Iterators</h2>\n    </td>\n  </tr>\n</table>\n<hr>\n<h3>Motivation</h3>\nConsider the problem of translating an arbitrary length sequence of 8 bit bytes \nto base64 text. Such a process can be summarized as:\n<p>\nsource =&gt; 8 bit bytes =&gt; 6 bit integers =&gt; encode to base64 characters =&gt; insert line breaks =&gt; destination\n<p>\nWe would prefer the solution that is:\n<ul>\n  <li>Decomposable. so we can code, test, verify and use each (simple) stage of the conversion \n  independently.\n  <li>Composable. so we can use this composite as a new component somewhere else.\n  <li>Efficient, so we're not required to re-implement it again.\n  <li>Scalable, so that it works well for short and arbitrarily long sequences.\n</ul>\nThe approach that comes closest to meeting these requirements is that described\nand implemented with <a href=\"../../iterator/doc/index.html\">Iterator Adaptors</a>.\nThe fundamental feature of an Iterator Adaptor template that makes it interesting to\nus is that it takes as a parameter a base iterator from which it derives its\ninput. This suggests that something like the following might be possible.\n<pre><code>\ntypedef \n    insert_linebreaks&lt;         // insert line breaks every 76 characters\n        base64_from_binary&lt;    // convert binary values to base64 characters\n            transform_width&lt;   // retrieve 6 bit integers from a sequence of 8 bit bytes\n                const char *,\n                6,\n                8\n            &gt;\n        &gt; \n        ,76\n    &gt; \n    base64_text; // compose all the above operations in to a new iterator\n\nstd::copy(\n    base64_text(address),\n    base64_text(address + count),\n    ostream_iterator&lt;CharType&gt;(os)\n);\n</code></pre>\nIndeed, this seems to be exactly the kind of problem that iterator adaptors are \nintended to address.  The Iterator Adaptor library already includes\nmodules which can be configured to implement some of the operations above.  For example,\nincluded is <a target=\"transform_iterator\" href=\"../../iterator/doc/transform_iterator.html\">\ntransform_iterator</a>, which can be used to implement 6 bit integer =&gt; base64 code.\n\n<h3>Dataflow Iterators</h3>\nUnfortunately, not all iterators which inherit from Iterator Adaptors are guaranteed\nto meet the composability goals stated above.  To accomplish this purpose, they have\nto be written with some additional considerations in mind.\n\nWe define a Dataflow Iterator as an class inherited from <code style=\"white-space: normal\">iterator_adaptor</code> which\nfulfills a small set of additional requirements.\n\n<h4>Templated Constructors</h4>\n<p>\nTemplated constructor have the form:\n<pre><code>\ntemplate&lt;class T&gt;\ndataflow_iterator(T start) :\n    iterator_adaptor(Base(start))\n{}\n</code></pre>\nWhen these constructors are applied to our example of above, the following code is generated:\n<pre><code>\nstd::copy(\n    insert_linebreaks(\n        base64_from_binary(\n            transform_width(\n                address\n            ),\n        )\n    ),\n    insert_linebreaks(\n        base64_from_binary(\n            transform_width(\n                address + count\n            )\n        )\n    )\n    ostream_iterator&lt;char&gt;(os)\n);\n</code></pre>\nThe recursive application of this template is what automatically generates the\nconstructor <code style=\"white-space: normal\">base64_text(const char *)</code>  in our example above.  The original\nIterator Adaptors include a <code style=\"white-space: normal\">make_xxx_iterator</code> to fulfill this function.\nHowever, I believe these are unwieldy to use compared to the above solution using\nTemplated constructors.\n\n<h4>Dereferencing</h4>\nDereferencing some iterators can cause problems.  For example, a natural\nway to write a <code style=\"white-space: normal\">remove_whitespace</code> iterator is to increment past the initial \nwhitespaces when the iterator is constructed.  This will fail if the iterator passed to the\nconstructor \"points\" to  the end of a string.  The \n<a target=\"filter_iterator\" href=\"../../iterator/doc/filter_iterator.html\">\n<code style=\"white-space: normal\">filter_iterator</code></a> is implemented\nin this way so it can't be used in our context. So, for implementation of this iterator, \nspace removal is deferred until the iterator actually is dereferenced.\n\n<h4>Comparison</h4>\nThe default implementation of iterator equality of <code style=\"white-space: normal\">iterator_adaptor</code> just\ninvokes the equality operator on the base iterators.  Generally this is satisfactory.\nHowever, this implies that other operations (E. G. dereference) do not prematurely \nincrement the base iterator.  Avoiding this can be surprisingly tricky in some cases.\n(E.G. transform_width)\n\n<p>\nIterators which fulfill the above requirements should be composable and the above sample\ncode should implement our binary to base64 conversion.\n\n<h3>Iterators Included in the Library</h3>\nDataflow iterators for the serialization library are all defined in the namespace\n<code style=\"white-space: normal\">boost::archive::iterators</code> included here are:\n<dl class=\"index\">\n  <dt><a target=\"base64_from_binary\" href=\"../../../boost/archive/iterators/base64_from_binary.hpp\">\n  base64_from_binary</a></dt>\n  <dd>transforms a sequence of integers to base64 text</dd>\n\n  <dt><a target=\"base64_from_binary\" href=\"../../../boost/archive/iterators/binary_from_base64.hpp\">\n  binary_from_base64</a></dt>\n  <dd>transforms a sequence of base64 characters to a sequence of integers</dd>\n\n  <dt><a target=\"insert_linebreaks\" href=\"../../../boost/archive/iterators/insert_linebreaks.hpp\">\n  insert_linebreaks</a></dt>\n  <dd>given a sequence, creates a sequence with newline characters inserted</dd>\n\n  <dt><a target=\"mb_from_wchar\" href=\"../../../boost/archive/iterators/mb_from_wchar.hpp\">\n  mb_from_wchar</a></dt>\n  <dd>transforms a sequence of wide characters to a sequence of multi-byte characters</dd>\n\n  <dt><a target=\"remove_whitespace\" href=\"../../../boost/archive/iterators/remove_whitespace.hpp\">\n  remove_whitespace</a></dt>\n  <dd>given a sequence of characters, returns  a sequence with the white characters\n  removed.  This is  a derivation from the <code style=\"white-space: normal\">boost::filter_iterator</code></dd>\n\n  <dt><a target=\"transform_width\" href=\"../../../boost/archive/iterators/transform_width.hpp\">\n  transform_width</a></dt>\n  <dd>transforms a sequence of x bit elements into a sequence of y bit elements.  This\n  is a key component in iterators which translate to and from base64 text.</dd>\n\n  <dt><a target=\"wchar_from_mb\" href=\"../../../boost/archive/iterators/wchar_from_mb.hpp\">\n  wchar_from_mb</a></dt>\n  <dd>transform a sequence of multi-byte characters in the current locale to wide characters.</dd>\n\n  <dt><a target=\"xml_escape\" href=\"../../../boost/archive/iterators/xml_escape.hpp\">\n  xml_escape</a></dt>\n  <dd>escapes xml meta-characters from xml text</dd>\n\n  <dt><a target=\"xml_unescape\" href=\"../../../boost/archive/iterators/xml_unescape.hpp\">\n  xml_unescape</a></dt>\n  <dd>unescapes xml escape sequences to create a sequence of normal text<dd>\n</dl>\n<p>\nThe standard stream iterators don't quite work for us.  On systems which implement <code style=\"white-space: normal\">wchar_t</code>\nas unsigned short integers (E.G. VC 6) they didn't function as I expected. I also made some\nadjustments to be consistent with our concept of Dataflow Iterators.  Like the rest of our\niterators, they are found in the namespace <code style=\"white-space: normal\">boost::archive::interators</code> to avoid\nconflicts with the standard library versions.\n<dl class = \"index\">\n  <dt><a target=\"istream_iterator\" href=\"../../../boost/archive/iterators/istream_iterator.hpp\">\n  istream_iterator</a></dt>\n  <dt><a target=\"ostream_iterator\" href=\"../../../boost/archive/iterators/ostream_iterator.hpp\">\n  ostream_iterator</a></dt>\n</dl>\n\n<hr>\n<p><i>&copy; Copyright <a href=\"http://www.rrsd.com\">Robert Ramey</a> 2002-2004. \nDistributed under the Boost Software License, Version 1.0. (See\naccompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n</i></p>\n</body>\n</html>\n"
  },
  {
    "path": "doc/definitions.html",
    "content": "<!doctype HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">\n<html>\n<!--\n(C) Copyright 2002-4 Robert Ramey - http://www.rrsd.com . \nUse, modification and distribution is subject to the Boost Software\nLicense, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\nhttp://www.boost.org/LICENSE_1_0.txt)\n-->\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\n<link rel=\"stylesheet\" type=\"text/css\" href=\"../../../boost.css\">\n<link rel=\"stylesheet\" type=\"text/css\" href=\"style.css\">\n<title>Serialization - Definitions</title>\n</head>\n<body link=\"#0000ff\" vlink=\"#800080\">\n</body>\n</html>\n"
  },
  {
    "path": "doc/derivation.html",
    "content": "<!doctype HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">\n<html>\n<!--\n(C) Copyright 2002-4 Robert Ramey - http://www.rrsd.com .\nUse, modification and distribution is subject to the Boost Software\nLicense, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\nhttp://www.boost.org/LICENSE_1_0.txt)\n-->\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\n<link rel=\"stylesheet\" type=\"text/css\" href=\"../../../boost.css\">\n<link rel=\"stylesheet\" type=\"text/css\" href=\"style.css\">\n<title>Serialization - Derivation from an Existing Archive</title>\n</head>\n<body link=\"#0000ff\" vlink=\"#800080\">\n<table border=\"0\" cellpadding=\"7\" cellspacing=\"0\" width=\"100%\" summary=\"header\">\n  <tr> \n    <td valign=\"top\" width=\"300\"> \n      <h3><a href=\"../../../index.htm\"><img height=\"86\" width=\"277\" alt=\"C++ Boost\" src=\"../../../boost.png\" border=\"0\"></a></h3>\n    </td>\n    <td valign=\"top\"> \n      <h1 align=\"center\">Serialization</h1>\n      <h2 align=\"center\">Derivation from an Existing Archive</h2>\n    </td>\n  </tr>\n</table>\n<hr>\n<dl class=\"page-index\">\n</dl>\n\n<h3>Log Archive</h3>\nIt may happen that one wants to create a new archive class by derivation from one\nof the included ones. Included is a sample program that shows how to derive a \nnew archive from one of the ones included with the library.  The first example is\n<a href=\"../example/demo_log.cpp\" target=\"demo_log_cpp\">\ndemo_log.cpp</a>.\n<p>\nThis derivation from the xml archive writes output in xml without the extra\ninformation required to read the data back into the application.  It might be\nused to export one's data as simple xml for other applications or for logging\ndata while debugging.\n<p>\nTo this end it is derived from the included xml archive and the save functions for\nsome types are specialized for this application.  \n<p>\nThe serialization library is\nimplemented using the <b>C</b>uriously <b>R</b>ecurring <b>T</b>emplate \n<b>P</b>attern (<b>CRTP</b>).  Also, all common code is factored out into\nseparate modules to minimize code repetition. This makes derivation from\nan existing archive less straightforward than it would otherwise be.\n<p> \nThis example illustrates several issues that have to be addressed when doing\nsomething like this\n<ol>\n    <li><i>It is derived from</i> <code style=\"white-space: normal\">xml_oarchive_impl<log_archive></code> \n        <b>NOT</b> <code style=\"white-space: normal\">xml_oarchive</code> <br>\nAs described in the comments in\n<a href=\"../../../boost/archive/xml_oarchive.hpp\" target=\"xml_oarchive_hpp\">xml_oarchive.hpp</a>.\n<code style=\"white-space: normal\">xml_oarchive</code> really a shorthand name for \n<code style=\"white-space: normal\">xml_oarchive_impl&lt;xml_oarchive&gt;</code>.  So we should derive\nfrom <code style=\"white-space: normal\">xml_oarchive_impl&lt;log_archive&gt;</code> rather\nthan <code style=\"white-space: normal\">xml_oarchive</code>.\n<pre><code>\nclass log_archive :\n    // don't derive from xml_oarchive !!!\n    public xml_oarchive_impl&lt;log_archive&gt;\n{\n...\n</code></pre>\n    <li><i>Note the</i> <code style=\"white-space: normal\">log_archive</code> <i>between the</i> &lt;&gt;\nThis is required so that base classes can downcast their <code style=\"white-space: normal\">this</code> pointer\nto the most derived class.  This is referred to as <b>C</b>uriously <b>R</b>ecurring\n<b>T</b>emplate <b>P</b>attern (<b>CRTP</b>) <a href=\"bibliography.html#11\">[11]</a>.  \nIt is used to implement static polymorphism.\n    <li><i>Base classes need to be explicitly given access to the derived class.</i>\nThis can be done by making members public or by including friend declarations for\nthe base classes.\n<pre><code>\n    friend class detail::common_oarchive&lt;log_archive&gt;;\n    friend class basic_xml_oarchive&lt;log_archive&gt;;\n    friend class boost::serialization::save_access;\n</code></pre>\n\n    <li><i></i>Reread <a target=\"detail\" href=\"headers.html#archiveinternals\">Archive Internals</a>.\nThis describes the class hierarchy so that you know what to override.\n    <li><i>Base class functions will usually need to be explicitly invoked.</i>\nWe commonly specialize the function name <code style=\"white-space: normal\">save_override</code> \nfor saving primitives. Usage of a function name in a derived class\n\"hides\" similarly named functions of the base class.  That is, \nfunction name overloading doesn't automatically\ninclude base classes.  To address this, we can use:\n<pre><code>\n    using xml_oarchive_impl&lt;derived_t&gt;::save;\n    void save(const unsigned int t);\n    ...\n</code></pre>\nwhich should work on conforming compilers. However, I have found\nthat the following equivalent works on more compilers.\n<pre><code>\n    // default fall through for any types not specified here\n    template&lt;class T&gt;\n    void save(const T &amp; t){\n        xml_oarchive_impl&lt;derived_t&gt;::save(t);\n    }\n    void save(const unsigned int t);\n    ...\n</code></pre>\nso it's what I use.\n    <li><i>Template definitions of base classes may have to be explicitly instantiated.</i>\n    The demo includes\n<pre><code>\n// explicitly instantiate for this type of binary stream\n#include &lt;boost/archive/basic_binary_oprimitive.ipp&gt;\n</code></pre>\nfor just this purpose.  Failure to include required template definitions\nwill result in undefined symbol errors when the program is linked.\n    <li><i>Without alteration, this class cannot be further derived from.</i><br>\nBase classes using <b>CRTP</b> must be templates with a parameter corresponding to\nthe most derived class.  As presented here, this class doesn't qualify, so\nit cannot be used as a base class.  In order to derive further from this class,\nit would have to be reorganized along the lines of the original <code style=\"white-space: normal\">xml_oarchive</code>.\nSpecifically, it would look something like:\n<pre><code>\ntemplate&lt;class Archive&gt;\nclass log_archive_impl :\n    // don't derive from xml_oarchive !!!\n    public xml_oarchive_impl&lt;Archive&gt;\n{\n    ...\n};\n\n// do not derive from this class !!!\nclass log_archive : \n    public log_archive_impl&lt;log_archive&gt;\n{\npublic:\n    log_archive(std::ostream &amp; os, unsigned int flags = 0) :\n        log_archive_impl&lt;xml_oarchive&gt;(os, flags)\n    {}\n};\n</code></pre>\n\n</ol>  \n\n<hr>\n<p><i>&copy; Copyright <a href=\"http://www.rrsd.com\">Robert Ramey</a> 2002-2004. \nDistributed under the Boost Software License, Version 1.0. (See\naccompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n</i></p>\n</body>\n</html>\n"
  },
  {
    "path": "doc/exception_safety.html",
    "content": "<!doctype HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">\n<html>\n<!--\n(C) Copyright 2002-4 Robert Ramey - http://www.rrsd.com . \nUse, modification and distribution is subject to the Boost Software\nLicense, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\nhttp://www.boost.org/LICENSE_1_0.txt)\n-->\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\n<link rel=\"stylesheet\" type=\"text/css\" href=\"../../../boost.css\">\n<link rel=\"stylesheet\" type=\"text/css\" href=\"style.css\">\n<title>Serialization - Reference</title>\n</head>\n<body link=\"#0000ff\" vlink=\"#800080\">\n<table border=\"0\" cellpadding=\"7\" cellspacing=\"0\" width=\"100%\" summary=\"header\">\n  <tr> \n    <td valign=\"top\" width=\"300\"> \n      <h3><a href=\"../../../index.htm\"><img height=\"86\" width=\"277\" alt=\"C++ Boost\" src=\"../../../boost.png\" border=\"0\"></a></h3>\n    </td>\n    <td valign=\"top\"> \n      <h1 align=\"center\">Serialization</h1>\n      <h2 align=\"center\">Exception Safety</h2>\n    </td>\n  </tr>\n</table>\n<hr>\nThe process of loading an archive may result in the creation of new objects.  That\nsame process may throw an exception at some point. In order to prevent memory leaks\nand invalid pointers, these situations must be considered.  Unfortunately, there is\nno simple universal solution to this problem.  The manner of addressing this must\ndepend on the design of the data structures to be serialized.  Below, we discuss\nvarying scenarios in increasing order of difficulty.  This discussion presumes that\nthe class member functions are exception safe before considering serialization.  \nThat is, the destructor could be called at anytime without referencing \nan invalid pointer, or creating a memory leak.\n<ol>\n    <li><h4>class contains no pointers</h4>\n    No problem here.\n    <p>\n    <li><h4>class contains only <i>owned</i> pointers</h4>\n    From here on, we have to make a distinction between pointers used\n    to manage heap storage (<i>owned</i> pointers) and pointers used to refer\n    to related objects (<i>referenced</i> pointers).  Programs containing <i>owned</i>\n    pointers must contain code for deleting these objects and returning the\n    deallocated storage to the heap.  Programs containing <i>referenced</i> pointers\n    must be designed to ensure that no such <i>referenced</i> pointers are de-referenced\n    after the object pointed to has been destroyed and its storage returned\n    to the heap. If a pointer is stored in only one place, it must be an <i>owned</i>\n    pointer.\n    <p>\n    The load function traps any exceptions that occur between the time an object\n    is created and its pointer is stored.  Should an exception occur while\n    reading an archive, the created object is deleted and the de-serialized\n    pointer is set to NULL.  This ensures that there are no memory leaks.\n    The fact that there are no other copies of this pointer ensures that\n    no pointers are left invalid. The object's destructor should\n    be able to delete any other existing objects in the normal manner\n    without problem.\n    <a href=\"../test/test_delete_pointer.cpp\" target=\"test_delete_pointer.cpp\">test_delete_pointer.cpp</a>\n    illustrates this case.\n    <p>\n    <li><h4>class contains one or more <i>referenced</i> pointers</h4>\n    This situation can be further subdivided into two cases\n    <p>\n    <ol>\n        <li><h4><i>owned</i> pointers are always serialized before <i>referenced</i> pointers</h4>\n        Object tracking will ensure that no new objects will be created\n        by the loading of a <i>referenced</i> pointer.\n        If an exception occurs, <i>referenced</i> pointers will not need to be deleted\n        so there will be no memory leaks. The destructor of this class won't attempt to\n        delete these pointers so there will be no problem with dangling references.\n        <i>Owned</i> pointers are handled exactly as described above.\n        <p>\n        <li><h4>class contains <i>referenced</i> pointers which might be created by load</h4>\n        If a <i>referenced</i> pointer is loaded before its corresponding <i>owned</i>\n        pointer, the object will be allocated on the heap.  In certain cases\n        it cannot be known which pointers were created by their owners and which\n        were created by the load function.  To address this:\n        <ul>\n        <li>Trap exceptions with a <code style=\"white-space: normal\">try/catch</code> block.\n        <li>Within the catch part, invoke the archive function \n        <code style=\"white-space: normal\">delete_created_pointers()</code> to delete any pointers\n        created by the class load.  Without other action, objects created in\n        this way would end up as memory leaks as they are not considered <i>owned</i>\n        pointers and hence aren't destroyed.\n        <li>The object's destructor won't try\n        to delete <i>referenced</i> pointers so any dangling references will\n        cause no harm.\n    </ul>\n    <a href=\"../example/demo_exception.cpp\" target=\"demo_exception.cpp\">demo_exception.cpp</a>\n        is a program that illustrates this case.\n        <p>\n    </ol>\n    <p>\n    <li><h4>Other cases</h4>\n    Situations not covered above are pointers for which the classifications of \n    <i>referenced</i> and <i>owned</i> are not applicable.  This might occur where\n    pointers are created by one class but consumed and deleted by another.  These\n    may be addressed with an ad hoc analysis similar to the above.  As the\n    situation becomes more complex this becomes more difficult and error prone.\n    Eventually, it will be have to addressed by building heap management into the\n    pointer itself - that is into <code style=\"white-space: normal\">boost::shared_ptr</code>. \n    The library includes serialization of <code style=\"white-space: normal\">boost::shared_ptr</code>.  As\n    previously mentioned, this required a tiny alteration in one of the\n    <code style=\"white-space: normal\">boost::shared_ptr</code> implementation files in order to permit\n    access by the serialization system.\n</ol>\n<hr>\n<p><i>&copy; Copyright <a href=\"http://www.rrsd.com\">Robert Ramey</a> 2002-2004. \nDistributed under the Boost Software License, Version 1.0. (See\naccompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n</i></p>\n</body>\n</html>\n"
  },
  {
    "path": "doc/exceptions.html",
    "content": "<!doctype HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">\n<html>\n<!--\n(C) Copyright 2002-4 Robert Ramey - http://www.rrsd.com .\nUse, modification and distribution is subject to the Boost Software\nLicense, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\nhttp://www.boost.org/LICENSE_1_0.txt)\n-->\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\n<link rel=\"stylesheet\" type=\"text/css\" href=\"../../../boost.css\">\n<link rel=\"stylesheet\" type=\"text/css\" href=\"style.css\">\n<title>Serialization - Archive Exceptions</title>\n</head>\n<body link=\"#0000ff\" vlink=\"#800080\">\n<table border=\"0\" cellpadding=\"7\" cellspacing=\"0\" width=\"100%\" summary=\"header\">\n  <tr> \n    <td valign=\"top\" width=\"300\"> \n      <h3><a href=\"../../../index.htm\"><img height=\"86\" width=\"277\" alt=\"C++ Boost\" src=\"../../../boost.png\" border=\"0\"></a></h3>\n    </td>\n    <td valign=\"top\"> \n      <h1 align=\"center\">Serialization</h1>\n      <h2 align=\"center\">Archive Exceptions</h2>\n    </td>\n  </tr>\n</table>\n<hr>\n<dl class=\"page-index\">\n  <dt><a href=\"#unregistered_class\"><code style=\"white-space: normal\">unregistered_class</code></a>\n  <dt><a href=\"#invalid_signature\"><code style=\"white-space: normal\">invalid_signature</code></a>\n  <dt><a href=\"#unsupported_version\"><code style=\"white-space: normal\">unsupported_version</code></a>\n  <dt><a href=\"#unsupported_class_version\"><code style=\"white-space: normal\">unsupported_class_version</code></a>\n  <dt><a href=\"#pointer_conflict\"><code style=\"white-space: normal\">pointer_conflict</code></a>\n  <dt><a href=\"#incompatible_native_format\"><code style=\"white-space: normal\">incompatible_native_format</code></a>\n  <dt><a href=\"#array_size_too_short\"><code style=\"white-space: normal\">array_size_too_short</code></a>\n  <dt><a href=\"#input_stream_error\"><code style=\"white-space: normal\">input_stream_error</code></a>\n  <dt><a href=\"#output_stream_error\"><code style=\"white-space: normal\">output_stream_error</code></a>\n  <dt><a href=\"#invalid_class_name\"><code style=\"white-space: normal\">invalid_class_name</code></a>\n  <dt><a href=\"#unregistered_class\"><code style=\"white-space: normal\">unregistered_class</code></a>\n  <dt><a href=\"#multiple_code_instantiation\"><code style=\"white-space: normal\">multiple_code_instantiation</code></a>\n  <dt><a href=\"#xml_archive_parsing_error\"><code style=\"white-space: normal\">xml_archive_parsing_error</code></a>\n  <dt><a href=\"#xml_archive_tag_mismatch\"><code style=\"white-space: normal\">xml_archive_tag_mismatch</code></a>\n  <dt><a href=\"#xml_archive_tag_name_error\"><code style=\"white-space: normal\">xml_archive_tag_name_error</code></a>\n</dl>\n\nArchive operators can throw a <code style=\"white-space: normal\">boost::archive_exception</code>\nobject which can be caught by an application program.  These exceptions are defined\nin the files <a target=\"archive_exception_hpp\" href=\"../../../boost/archive/archive_exception.hpp\">\narchive_exception.hpp</a>\nand <a target=\"basic_xml_archive_hpp\" href=\"../../../boost/archive/basic_xml_archive.hpp\">\nbasic_xml_archive.hpp</a>.\n<pre><code>\nnamespace boost {\nnamespace archive {\n\nclass archive_exception  : public std::exception\n{\npublic:\n    typedef enum {\n        unregistered_class,     // attempt to serialize a pointer of\n                                // an unregistered class\n        invalid_signature,      // first line of archive does not contain\n                                // expected string\n        unsupported_version,    // archive created with library version subsequent\n                                // to this one\n        pointer_conflict        // an attempt has been made to directly serialize\n                                // an object after having already serialized the same\n                                // object through a pointer.  Were this permitted, \n                                // the archive load would result in the creation\n                                // of an extraneous object.\n        incompatible_native_format, // attempt to read native binary format\n                                // on incompatible platform\n        array_size_too_short,   // array being loaded doesn't fit in array allocated\n        input_stream_error      // error on stream input\n        invalid_class_name,     // class name greater than the maximum permitted.\n                                // most likely a corrupted archive or an attempt\n                                // to insert virus via buffer overrun method.\n        unregistered_cast,      // base - derived relationship not registered with \n                                // void_cast_register\n        unsupported_class_version, // type saved with a version # greater than the \n                            // one used by the program.  This indicates that the program\n                            // needs to be rebuilt.\n        multiple_code_instantiation, // code for implementing serialization for some\n                            // type has been instantiated in more than one module.\n        output_stream_error     // error on stream output\n    } exception_code;\n    exception_code code;\n    archive_exception(exception_code c) : code(c) {}\n    virtual const char *what( ) const throw();\n};\n\nclass xml_archive_exception : public virtual archive_exception\n{\npublic:\n    typedef enum {\n        xml_archive_parsing_error,  // archive doesn't contain expected data \n\txml_archive_tag_mismatch,   // start/end tag in archive doesn't match program\n        xml_archive_tag_name_error  // tag name contains invalid characters\n\n    } exception_code;\n    xml_archive_exception(exception_code c){}\n    virtual const char *what( ) const throw();\n};\n\n} // archive\n} // boost\n</code></pre>\n<p>\n<h3><a name=\"unregistered_class\"><code style=\"white-space: normal\">unregistered_class</code></a></h3>\nAn attempt has been made to serialize a polymorphic class through a pointer\nwithout either registering it or associating it with an export key.  This can also occur\nwhen using a new archive whose class name has not been added to the system with the \n<code style=\"white-space: normal\">BOOST_ARCHIVE_CUSTOM_ARCHIVE_TYPES</code> macro.\n\n<h3><a name=\"invalid_signature\"><code style=\"white-space: normal\">invalid_signature</code></a></h3>\nArchives are initiated with a known string.  If this string is not found when\nthe archive is opened, It is presumed that this file is not a valid archive and this\nexception is thrown.\n\n<h3><a name=\"unsupported_version\"><code style=\"white-space: normal\">unsupported_version</code></a></h3>\nThis system records the current library version number to all archives created.  Note that this is in\nno way related to version number of classes used by application programs. This refers\nto the version of the serialization system used to create the archive. Future versions\nof this serialization system will be able to identify archives created under a previous\n(i.e. this) system and alter the loading procedure accordingly.  Hence, future enhancements\nto this serialization system should not obsolete any existing archive files.  It is only\nnecessary to increment this version number when the newer system creates archives\nincompatible in format with the current one. \n<p>Should it ever occur that an older program attempts to read newer archives whose\nformat has changed, this exception is thrown.\n\n<h3><a name=\"unsupported_class_version\"><code style=\"white-space: normal\">unsupported_class_version</code></a></h3>\nAn attempt has been made to load a class whose version has been incremented since the\nprogram was written.  Suppose that a class has been assigned version number 3 and the program\nhas been built and sent to third parties.  Now suppose that the definition of that class\nhas been altered, the version number has been incremented to 4 and new archives have been\nbuilt.  If one attempts to load these new archives with the original program, this \nexception will be thrown.\n\n<h3><a name=\"pointer_conflict\"><code style=\"white-space: normal\">pointer_conflict</code></a></h3>\nTo understand what this exception means consider the following scenario\n<pre><code>\ntemplate&lt;class Archive&gt;\nvoid T::save(Archive &amp;ar) const\n{\n    const A * aptr = &amp;a;\n    ar &lt;&lt; aptr;          // save an instance of object of class A through a pointer\n    ...\n    ar &lt;&lt; a;             // save an instance of an object of class A\n    assert(aptr == &amp;a);  // this must be true\n}\n\ntemplate&lt;class Archive&gt;\nvoid T::load(Archive &amp;ar)\n{\n    A * aptr;\n    ar &gt;&gt; aptr;          // create and initialize a new instance of class A\n    ...\n    ar &gt;&gt; a;             // restore state of on object of class A\n    assert(aptr == &amp;a);  // this won't be true\n}\n</pre></code>\nAn object is saved first through a pointer then directly.  Upon loading back\nin the same sequence, we first create an new object and load in its data.  Then\nwe load the data into another existing object.  Where we started with one\nobject during save, we have two objects after restore.  In a more realistic\nsituation, it could be very difficult to find this error.  Fortunately, \nthese situations can be detected when the archive is created. When\nthis occurs, this exception is thrown.\n\n<h3><a name = \"incompatible_native_format\"><code style=\"white-space: normal\">incompatible_native_format</code></a></h3>\nThe library currently supports char text, wide char text and native binary\narchive files. At the beginning of every archive, a signature is written indicating\nthe type of archive.  This exception is thrown when an attempt is made to read\nan archive written in a different format.\n\n<h3><a name=\"array_size_too_short\"><code style=\"white-space: normal\">array_size_too_short</code></a></h3>\nAn attempt has been made to read an array that is larger than the array size.\nThis should only occur when the size of an array in code is reduced after an\narchive has already been created.\n\n<h3>\n<a name=\"input_stream_error\"><code style=\"white-space: normal\">input_stream_error</code></a>\n<br>\n<a name=\"output_stream_error\"><code style=\"white-space: normal\">output_stream_error</code></a>\n</h3>\nAn error has occurred during stream input or ouput.  Aside from the common \nsituations such as a corrupted or truncated input file, there are \nseveral less obvious ones that sometimes occur.\n<p>\nThis includes\nan attempt to read past the end of the file. Text files need a terminating\nnew line character at the end of the file which is appended when the\narchive destructor is invoked.  Be sure that an output archive on a stream\nis destroyed before opening an input archive on that same stream.  That is,\nrather than using something like:\n<pre><code>\nstd::stringstream ss;\nstd::vector&lt;V&gt; v;\nboost::archive::text_oarchive oa(ss);\noa &lt;&lt; v;\nboost::archive::text_iarchive ia(ss);\nia &gt;&gt; v;\n</code></pre>\nuse\n<pre><code>\nstd::stringstream ss;\nstd::vector&lt;V&gt; v;\n{\n    boost::archive::text_oarchive oa(ss);\n    oa &lt;&lt; v;\n}\n{\n    boost::archive::text_iarchive ia(ss);\n    ia &gt;&gt; v;\n}\n</code></pre>\n<p>\nAnother one is the passing of uninitialized data.  In general, the behavior\nof the serialization library when passed uninitialized data is undefined.\nIf it can be detected, it will invoke an assertion in debug builds.\nOtherwise, depending on the type of archive, it may pass through without\nincident or it may result in an archive with unexpected data in it.\nThis, in turn, can result in the throwing of this exception.\n\n<h3><a name=\"invalid_class_name\"><code style=\"white-space: normal\">invalid_class_name</code></a></h3>\nClass name length greater than the maximum permitted. Most likely cause is a corrupted \narchive  or an attempt to insert a virus via the buffer overrun method.\n\n<h3><a name=\"unregistered_cast\"><code style=\"white-space: normal\">unregistered_cast</code></a></h3>\nIn order to support casting between pointers of base and derived classes\nat runtime, a collection of legitimate conversions is maintained by the system.\nNormally this collection is maintained without any explicit action\non the part of the user of the library.  However, there are special cases\nwhere this might have to be done explicitly and could be overlooked. This\nis described in <a href=\"serialization.html#runtimecasting\">Runtime Casting</a>.\nThis exception is thrown if an attempt is made to convert between two pointers \nwhose relationship has not been registered,\n\n<h3><a name=\"multiple_code_instantiation\"><code style=\"white-space: normal\">multiple_code_instantiation</code></a></h3>\nThis exception is thrown when it is detected that the serialization of the same type \nhas been instantiated more than once.  This might occur when\nserialization code is instantiated in both the mainline and one or more DLLS.\n\n<h3><a name=\"xml_archive_parsing_error\"><code style=\"white-space: normal\">xml_archive_parsing_error</code></a></h3>\nThe XML generated by the serialization process is intimately coupled to the\nC++ class structure, relationships between objects and the serialization \nspecifications.  If these become out of sync in any way, the XML may not map\nto the loading serialization and this exception might be thrown.  This might\noccur for one of the following reasons:\n<ul>\n    <li>The archive has been edited outside the serialization system.  This might\nbe possible if only the data is changed and the XML attributes and nesting\nstructure are left unaltered.  But any other editing is likely to render the\narchive unreadable by the serialization library.\n    <li>The serialization has been altered and an archive generated by the old\ncode is being read.  That is, versioning has not been properly employed to\nproperly deserialize previously created archives.\n</ul>\n\n<h3><a name=\"xml_archive_tag_mismatch\"><code style=\"white-space: normal\">xml_archive_tag_mismatch</code></a></h3>\nThis exception will be thrown if the start or end tag of an XML element doesn't match\nthe name specified for the object in the program.\n\n<h3><a name=\"xml_archive_tag_name_error\"><code style=\"white-space: normal\">xml_archive_tag_name_error</code></a></h3>\nThis exception will be thrown if the tag name contains invalid characters.  Valid characters\nfor an XML tag are: upper and lower case letters, digits, and the following punctuation: .(period),\n_(underscore), :(colon), and -(hyphen).\n\n<hr>\n<p><i>&copy; Copyright <a href=\"http://www.rrsd.com\">Robert Ramey</a> 2002-2004. \nDistributed under the Boost Software License, Version 1.0. (See\naccompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n</i></p>\n</body>\n</html>\n"
  },
  {
    "path": "doc/extended_type_info.html",
    "content": "<!doctype HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">\n<html>\n<!--\n(C) Copyright 2002-4 Robert Ramey - http://www.rrsd.com . \nUse, modification and distribution is subject to the Boost Software\nLicense, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\nhttp://www.boost.org/LICENSE_1_0.txt)\n-->\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\n<link rel=\"stylesheet\" type=\"text/css\" href=\"../../../boost.css\">\n<link rel=\"stylesheet\" type=\"text/css\" href=\"style.css\">\n<title>Serialization - extended_type_info</title>\n</head>\n<body link=\"#0000ff\" vlink=\"#800080\">\n<table border=\"0\" cellpadding=\"7\" cellspacing=\"0\" width=\"100%\" summary=\"header\">\n  <tr> \n    <td valign=\"top\" width=\"300\"> \n      <h3><a href=\"../../../index.htm\"><img height=\"86\" width=\"277\" alt=\"C++ Boost\" src=\"../../../boost.png\" border=\"0\"></a></h3>\n    </td>\n    <td valign=\"top\"> \n      <h1 align=\"center\">Serialization</h1>\n      <h2 align=\"center\"><code style=\"white-space: normal\">extended_type_info</code></h2>\n    </td>\n  </tr>\n</table>\n<hr>\n<dl class=\"page-index\">\n  <dt><a href=\"#motivation\">Motivation</a>\n  <dt><a href=\"#runtime\">Runtime Interface</a>\n  <dt><a href=\"#requirements\">Requirements</a>\n  <dt><a href=\"#models\">Models</a>\n  <dt><a href=\"#example\">Example</a>\n</dl>\n\n<h3><a name=\"motivation\">Motivation</a></h3>\nThe serialization library needs a system like \n<code style=\"white-space: normal\">type_info/typeid()</code> to perform\nthe following functions\n<ol>\n  <li>\n     given a pointer to a type T discover the true type pointed to.\n  <li>\n     given an \"external\" key - determine what type of object to create.\n</ol>\n<h3>The problem with <code style=\"white-space: normal\">std::type_info</code></h3>\n<ul>\n  <li>\n    The main function we require - <code style=\"white-space: normal\">std::typeid()</code>\n    is not available in all environments. Support for this function depends upon\n    runtime typing(RTTI) support from the compiler.  This may be non-existent\n    or not enabled for reasons such as a perceived inefficiency.\n  <li>\n    <code style=\"white-space: normal\">std::type_info</code> includes a string\n    containing type name.  This would seem to satisfy 2) above.\n    But the format of this string is not consistent accross compilers, libraries, \n    and operating systems. This makes it unusable for support of portable archives.\n  <li>\n    Even if the type name string could somehow be made portable, there is no \n    guarantee that class headers would be included in the same namespace accross \n    different applications. In fact, including different headers in different\n    namespaces is an accepted method used to avoid namespace conflicts.\n    Thus the namespace::class_name can't be used as a key.\n  <li>\n    There exists the possibility that different classes use different type id \n    mechanisms.  The class header might include this information. If we want to \n    import class headers accross applications, it's convenient that the type id\n    mechanism support inter-operability accross different type id systems.\n</ul>\n<h3>Features</h3>\n<code style=\"white-space: normal\"><a target=\"extended_type_info.hpp\" href = \"../../../boost/serialization/extended_type_info.hpp\">\nextended_type_info</a></code> is an implementation\nof <code style=\"white-space: normal\">std::type_info</code> functionality with the \nfollowing features:\n<ul>\n  <li>\n    Builds a set of <a target=\"extended_type_info.hpp\" href = \"../../../boost/serialization/extended_type_info.hpp\">\n    <code style=\"white-space: normal\">extended_type_info</a></code> records - one for each type\n    serialized.\n  <li>\n    permits association of an arbitrary string key with a type.  Often this key would\n    be the class name - but it doesn't have to be.  This key is referred to as\n    a GUID - Globally Unique IDentifier.  Presumably it should be unique in the universe.\n    Typically this GUID would be in header files and be used to match type accross\n    applications.  The macro BOOST_CLASS_EXPORT can be invoked to associate a string\n    key with any known type.  We'll refer to these types as \"exported types\"\n  <li>\n    permits the \"mixing\" of type info systems.  For example, one class might use \n    <code style=\"white-space: normal\">typeid()</code> to find the external identifier \n    of a class while another might not.\n</ul>\n\nExported types are maintained in a global table so that given a string key, the\ncorresponding type can be found.  This facility is used by the serialization library\nin order to construct types serialized through a base class pointer.\n\n<h3><a name=\"runtime\">Runtime Interface</a></h3>\n<pre><code>\nnamespace boost { \nnamespace serialization {\n\nclass extended_type_info\n{\nprotected:\n    // this class can't be used as is. It's just the \n    // common functionality for all type_info replacement\n    // systems.  Hence, make these protected\n    extended_type_info(\n        const unsigned int type_info_key,\n        const char * key\n    );\n    ~extended_type_info();\n    void key_register();\n    void key_unregister();\npublic:\n    const char * get_key() const;\n    bool operator&lt;(const extended_type_info &amp;rhs) const;\n    bool operator==(const extended_type_info &amp;rhs) const;\n    bool operator!=(const extended_type_info &amp;rhs) const {\n        return !(operator==(rhs));\n    }\n    // for plugins\n    virtual void * construct(unsigned int count = 0, ...) const;\n    virtual void destroy(void const * const p) const;\n    static const extended_type_info * find(const char *key);\n};\n\n} // namespace serialization \n} // namespace boost\n</code></pre>\n<p>\nGenerally, there will be one and only one\n<code style=\"white-space: normal\"><a target=\"extended_type_info.hpp\" href = \"../../../boost/serialization/extended_type_info.hpp\">extended_type_info</a></code>\ninstance created for each type.  However, this is enforced only at the executable\nmodule level.  That is, if a program includes some shared libraries or DLLS,\nthere may be more than one instance of this class corresponding to a particular type.\nFor this reason the comparison functions below can't just compare the addresses of \nthis instance but rather must be programmed to compare the actual information \nthe instances contain.\n<dl>\n\n<dt><h4><pre><code>\nextended_type_info(unsigned int type_info_key, const char *key);\n</code></pre></h4></dt>\n<dd>\nThis constructor should be called by all derived classes.\nThe first argument should be the particular implementation. \nFor this default implementation base on typeid(), this is the \nvalue 1.  Each system must have its own integer.  This value\nis used to permit the inter-operability of different typeinfo\nsystems.\n<p>\nThe second argument is a const string which is the external\nname of the type to which this record corresponds.  \nIt may sometimes be referred to as a GUID - a <b>G</b>lobal <b>U</b>nique <b>ID</b>entifier.\nIt is passed through archives from one program invocation to\nanother to uniquely identify the types that the archive contains.\nIf the \"export\" facility is not going to be used, \nthis value may be NULL.\n</dd>\n\n<dt><h4><pre><code>\nvoid key_register();\nvoid key_unregister();\n</code></pre></h4></dt>\n<dd>\nThis system maintains a global table which relates\nexternal strings to \n<code style=\"white-space: normal\">extended_type_info</code> records.\nThis table is used when loading pointers to objects serialized\nthrough a base class pointer.  In this case, the archive \ncontains a string which is looked up in this table to\ndetermine which <code style=\"white-space: normal\">extended_type_info</code>\nto use for creating a new object.\n<p>\nThese functions are called by constructors and\ndestructors of classes which implement \n<code style=\"white-space: normal\">extended_type_info</code>\nto add and remove entries from this table.\n</dd>\n\n<dt><h4><pre><code>\nconst char *get_key() const;\n</code></pre></h4></dt>\n<dd>\nRetrieves the key for <code style=\"white-space: normal\"><a target=\"extended_type_info.hpp\" href = \"../../../boost/serialization/extended_type_info.hpp\">extended_type_info</a></code>\ninstance.  If no key has been associated with the instance, then a NULL is returned.\n</dd>\n\n<dt><h4><pre><code>\nbool operator<(const extended_type_info &amp; rhs) const;\nbool operator==(const extended_type_info &amp; rhs) const;\nbool operator!=(const extended_type_info &amp; rhs) const;\n</code></pre></h4></dt>\n<dd>\nThese functions are used to compare\n<a target=\"extended_type_info.hpp\" href = \"../../../boost/serialization/extended_type_info.hpp\">\n<code style=\"white-space: normal\">\nextended_type_info\n</code> \n</a>\nobjects. They impose a strict total ordering on all\n<code style=\"white-space: normal\">extended_type_info</code> records.\n</dd>\n\n<dt><h4><pre><code>\nvirtual void * construct(unsigned int count = 0, ...) const;\n</code></pre></h4></dt>\n<dd>\nConstruct a new instance of the type to which this\n<a target=\"extended_type_info.hpp\" href = \"../../../boost/serialization/extended_type_info.hpp\">\n<code style=\"white-space: normal\">\nextended_type_info\n</code>\n</a>\nrecord corresponds. This function takes a variable list of up to 4 arguments\nof any type.  These arguments are passed to the type's constructor\nat runtime.  In order to use the facility, \none must declare a type sequence for the constructor arguments.  \nArguments for this function must match in number and type\nwith those specified when the type was exported.  \nThis function permits one to create instances of\nany exported type given only the exported <strong>GUID</strong> assigned\nwith BOOST_CLASS_EXPORT.  \nIf these types are defined in DLLS or shared libraries loaded at runtime, \nthese constructors can be called until the module is unloaded.  \nSuch modules are referred to as <b>plugins</b>. \n</code>\n</dd>\n\n<dt><h4><pre><code>\nvirtual void destroy(void const * const p) const;\n</code></pre></h4></dt>\n<dd>\nDestroy an instance created by the above constructor.\n</dd>\n\n<dt><h4><pre><code>\nstatic const extended_type_info * find(const char *key);\n</code></pre></h4></dt>\n<dd>\nGiven a character string key or <strong>GUID</strong>, return the address of a \ncorresponding <code style=\"white-space: normal\"><a target=\"extended_type_info.hpp\" href = \"../../../boost/serialization/extended_type_info.hpp\">extended_type_info</a></code>\nobject. \n\n</dl>\n\n<h3><a name=\"requirements\">Requirements for an Implementation</a></h3>\nIn order to be used by the serialization library, an implementation of\n<code style=\"white-space: normal\">extended_type_info</code>, \n(referred to as ETI here), must be derived from \n<a target=\"extended_type_info.hpp\" href = \"../../../boost/serialization/extended_type_info.hpp\">\n<code style=\"white-space: normal\">\nextended_type_info\n</code> \n</a>\nand also implement the following:\n\n<dl>\n\n<dt><h4><code style=\"white-space: normal\"><pre>\ntemplate&lt;class ETI&gt;\nconst extended_type_info *\nETI::get_derived_extended_type_info(const T &amp; t) const;\n</pre></code></h4></dt>\n<dd>\nReturn a pointer to the \n<code style=\"white-space: normal\">extended_type_info</code>\ninstance that corresponds to\nthe \"true type\" of the type T.  The \"true type\" is the lowest type in the\nhierarchy of classes.  The type T can always be cast to the \"true type\" with\na static cast.  Implementation of this function will vary among type id systems\nand sometimes will make presumptions about the type T than can be identified\nwith a particular <code style=\"white-space: normal\">extended_type_info</code> implementation.\n</dd>\n\n<dt><h4><code style=\"white-space: normal\"><pre>\nvirtual bool ETI::is_less_than(const extended_type_info &amp;rhs) const;\n</pre></code></h4></dt>\n<dd>\nCompare this instance to another one using the same\n<code style=\"white-space: normal\">extended_type_info</code> implementation.\n</dd>\n\n<dt><h4><code style=\"white-space: normal\"><pre>\nvirtual bool ETI::is_equal(const extended_type_info &amp;rhs) const;\n</pre></code></h4></dt>\n<dd>\nCompare this instance to another one using the same\n<code style=\"white-space: normal\">extended_type_info</code> implementation.\nReturn <code style=\"white-space: normal\">true</code> if the types referred\nto are the same.  Otherwise return \n<code style=\"white-space: normal\">false</code>\n</dd>\n\n<dt><h4><code style=\"white-space: normal\"><pre>\nconst char ETI::get_key() const;\n</pre></code></h4></dt>\n<dd>\nRetrieve the external key (aka GUID) for this class.\n</dd>\n\n<dt><h4><code style=\"white-space: normal\"><pre>\nvirtual void * construct(unsigned int count, ...) const;\n</pre></code></h4></dt>\n<dd>\nConstruct an instance of the corresponding type\nwith the include argument list.\n</dd>\n\n<dt><h4><code style=\"white-space: normal\"><pre>\nvirtual void * destroy(void const * const ptr ) const;\n</pre></code></h4></dt>\n<dd>\nDestroy an instance of this type. This calls the\nproper destructor and recovers allocated memory.\n</dd>\n\n</dl>\n\n<h3><a name=\"models\">Models</a></h3>\nThe serialization library includes two distinct\n<code style=\"white-space: normal\"><a target=\"extended_type_info.hpp\" href=\"../../../boost/serialization/extended_type_info.hpp\">extended_type_info</a></code>\nimplementations.\n<p>\n<code style=\"white-space: normal\"><h4><a target=\"extended_type_info_typeid.hpp\" href = \"../../../boost/serialization/extended_type_info_typeid.hpp\">\nextended_type_info_typeid</a></h4></code>is implemented in terms of the standard typeid(). It presumes that RTTI support is enabled\nby the compiler.\n<p>\n<code style=\"white-space: normal\"><h4><a target=\"extended_type_info_no_rtti.hpp\" href=\"../../../boost/serialization/extended_type_info_no_rtti.hpp\">\nextended_type_info_no_rtti</a></h4></code>\nis implemented in a way that doesn't rely on the existence RTTI.\nInstead, it requires that all polymorphic types be explicitly exported.\nIn addition, if the export facility is to be used to serialize types\nthrough base class pointers, those types are required to implement\na virtual function with the signature:\n\n<code><pre>\nvirtual const char * get_key();\n</pre></code>\nwhich returns a unique string the most derived object this class.  \nThis function must be virtual in order to implement the functionality required by\n<code style=\"white-space: normal\">ETI::get_derived_extended_type_info</code>\nas described above.\n\n<h3><a name=\"example\">Example</a></h3>\nThe test program <code style=\"white-space: normal\"><a target=\"test_no_rtti\" href=\"../test/test_no_rtti.cpp\">test_no_rtti</a></code>\nimplements this function in terms of the <code style=\"white-space: normal\"><a target=\"extended_type_info_no_rtti.hpp\" href=\"../../../boost/serialization/extended_type_info_no_rtti.hpp\">\nextended_type_info</a></code> API above to return the export key associated with the class.  \nThis requires that non-abstract types be exported. It also demonstrates the\ninter-operability between two different implementations of\n<code style=\"white-space: normal\">extended_type_info</code>.\n\n<h3><a name=\"type_requirements\">Requirements for Each Type</a></h3>\nEach type to be managed by the system must be\n\"registered\" individually. This is accomplished by instantiating\ntemplates.  For example, if the type T is to use the <code style=\"white-space: normal\">type_info</code> system\none would include the following code:\n\n<code style=\"white-space: normal\"><pre>\nnamespace boost {\nnamespace serialization {\ntemplate\nstruct extended_type_info_typeid&lt;T&gt;;\ntemplate\nstruct extended_type_info_typeid&lt;const T&gt;;\n} // serialization\n} // boost\n</pre></code>\n\nFor those using the serialization library, this step can be skipped\nas it is done automatically.  The serialization library includes\nthe macro:\n\n<code style=\"white-space: normal\"><pre>\nBOOST_CLASS_TYPE_INFO(\n    my_type, \n    extended_type_info_typeid&lt;my_class&gt;\n)\n</pre></code>\n\nwhich is used to specify which <code>extended_type_info</code> system is to \nbe used for a given type.\n<p>\n<code>extended_type_info</code> includes a facility for constructing\ninstances of types without knowing what the exact types are. This is done\nwith the function \n<code>\nvirtual void * extended_type_info::construct(unsigned int count = 0, ...) const;\n</code>\n. For example:\n<br>\n<code><pre>\nstruct base {\n...\n};\nstruct derived : public base {\n...\n};\n...\nextended_type_info *eti = extended_type_info::find(\"my_class\")\nbase * b = eti-&gt;construct(...);\n</pre></code>\n<br>\nThe <code>construct</code> takes an argument count and up to\nfour parameters of any type.  The arguments are passed to the\nconstructor of \"my_class\".\n\n\nA complete example of this can be found\n<a target=\"test_dll_plugin.cpp\" href=\"../test/test_dll_plugin.cpp\">here</a>\n<hr>\n<p><i>&copy; Copyright <a href=\"http://www.rrsd.com\">Robert Ramey</a> 2005-2009. \nDistributed under the Boost Software License, Version 1.0. (See\naccompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n</i></p>\n</body>\n</html>\n"
  },
  {
    "path": "doc/faq.html",
    "content": "<!doctype HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">\n<html>\n<!--\n(C) Copyright 2002-4 Robert Ramey - http://www.rrsd.com . \nUse, modification and distribution is subject to the Boost Software\nLicense, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\nhttp://www.boost.org/LICENSE_1_0.txt)\n-->\n<head>\n    <meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\n    <link rel=\"stylesheet\" type=\"text/css\" href=\"../../../boost.css\">\n    <link rel=\"stylesheet\" type=\"text/css\" href=\"style.css\">\n    <title>Serialization - Tips and Tricks</title>\n</head>\n<body link=\"#0000ff\" vlink=\"#800080\">\n    <table border=\"0\" cellpadding=\"7\" cellspacing=\"0\" width=\"100%\" summary=\"header\">\n        <tr>\n            <td valign=\"top\" width=\"300\">\n                <h3>\n                    <a href=\"../../../index.htm\">\n                        <img height=\"86\" width=\"277\" alt=\"C++ Boost\" src=\"../../../boost.png\" border=\"0\"></a></h3>\n            </td>\n            <td valign=\"top\">\n                <h1 align=\"center\">\n                    Serialization</h1>\n                <h2 align=\"center\">\n                    Tips and Tricks</h2>\n            </td>\n        </tr>\n    </table>\n    <hr>\nThis section will be used to list answers to questions raised in the mailing\nlists.  Most of these are due to subtle aspects of the library which are\noverlooked even though they might be described in the documentation.  Often,\nthese issues are very easy to address - but can be excruciatingly difficult to\nfind.  Should you have such an experience, feel free to vent your frustration\nin a constructive way by adding in your own item.  The best way to do this\nis to create a <a href=\"http://svn.boost.org/trac/boost/browser\">\"TRAK\" item</a> \nwhich includes the text you want to add to this list.\n\n<ul>\n<li><h4>\n</h4></li>\n</ul>\n<hr>\n<p>\n<i>&copy; Copyright <a href=\"http://www.rrsd.com\">Robert Ramey</a> 2002-2009. Distributed\nunder the Boost Software License, Version 1.0. (See accompanying file LICENSE_1_0.txt\nor copy at http://www.boost.org/LICENSE_1_0.txt) </i></p>\n</body>\n</html>\n"
  },
  {
    "path": "doc/headers.html",
    "content": "<!doctype HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">\n<html>\n<!--\n(C) Copyright 2002-4 Robert Ramey - http://www.rrsd.com . \nUse, modification and distribution is subject to the Boost Software\nLicense, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\nhttp://www.boost.org/LICENSE_1_0.txt)\n-->\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\n<link rel=\"stylesheet\" type=\"text/css\" href=\"../../../boost.css\">\n<link rel=\"stylesheet\" type=\"text/css\" href=\"style.css\">\n<title>Serialization - Code Structure</title>\n</head>\n<body link=\"#0000ff\" vlink=\"#800080\">\n<table border=\"0\" cellpadding=\"7\" cellspacing=\"0\" width=\"100%\" summary=\"header\">\n  <tr> \n    <td valign=\"top\" width=\"300\"> \n      <h3><a href=\"../../../index.htm\"><img height=\"86\" width=\"277\" alt=\"C++ Boost\" src=\"../../../boost.png\" border=\"0\"></a></h3>\n    </td>\n    <td valign=\"top\"> \n      <h1 align=\"center\">Serialization</h1>\n      <h2 align=\"center\">Code Structure</h2>\n    </td>\n  </tr>\n</table>\n<hr>\n\n<dl class=\"page-index\">\n  <dt><a href=\"#userincludes\">Files Included by User Programs</a>\n  <dl class=\"page-index\">\n    <dt><a href=\"#archiveimplementations\">Archive Implementations</a>\n    <dt><a href=\"#serializationdeclarations\">Serialization Declarations</a>\n    <dt><a href=\"#serializationimplementations\">Serialization Implementations</a>\n  </dl>\n  <dt><a href=\"#libraryimplementation\">Files Which Implement the Library</a>\n  <dl class=\"page-index\">\n    <dt><a href=\"#archivedevelopment\">Archive Development</a>\n    <dt><a href=\"#archiveinternals\">Archive Internals</a>\n    <dt><a href=\"#codemodules\">Archive Library Code Modules</a>\n    <dt><a href=\"#dataflowiterators\">Dataflow Iterators</a>\n  </dl>\n</dl>\n\nThis library includes a large number of files. They are organized and classified\naccording to the purposes listed in the above index. \n<p>\n<code style=\"white-space: normal\">namespace</code> of classes and templates is synchronized\nwith the directory in which the file is found.  For example, the class declaration\n<pre><code>\nboost::archive::text_oarchive\n</code></pre>\nis included with the following declaration\n<pre><code>\n#include &lt;boost/archive/text_oarchive.hpp&gt;\n</code></pre>\n\n<a name=\"userincludes\">\n<h3>Files Included by User Programs</h3>\nUsing this library entails including headers listed in this section.\nIt should not be necessary to explicitly include any other header files.\n\n<a name=\"archiveimplementations\">\n<h4>Archive Implementations</h4>\nThese header files contain declarations used to save and restore data to each type\nof archive. Include the archives according to the facilities the code module requires.\n\n<dl>\n\n<dt><a target=\"archive_exception\" href=\"../../../boost/archive/archive_exception.hpp\">\nboost/archive/archive_exception.hpp\n</a>\n<dd>Exceptions which might be invoked by the library.</dd>\n\n<dt><a target=\"binary_iarchive\" href=\"../../../boost/archive/binary_iarchive.hpp\">\nboost/archive/binary_iarchive.hpp\n</a>\n<dd>native binary input archive used for loading.</dd>\n\n<dt><a target=\"binary_oarchive\" href=\"../../../boost/archive/binary_oarchive.hpp\">\nboost/archive/binary_oarchive.hpp\n</a>\n<dd>native binary output archive used for saving.</dd>\n\n<dt><a target=\"text_iarchive\" href=\"../../../boost/archive/text_iarchive.hpp\">\nboost/archive/text_iarchive.hpp\n</a>\n<dd>text input archive used for loading.</dd>\n\n<dt><a target=\"text_oarchive\" href=\"../../../boost/archive/text_oarchive.hpp\">\nboost/archive/text_oarchive.hpp\n</a>\n<dd>text output archive used for saving.</dd>\n\n<dt><a target=\"text_wiarchive\" href=\"../../../boost/archive/text_wiarchive.hpp\">\nboost/archive/text_wiarchive.hpp\n</a>\n<dd>wide character text input archive used for loading.</dd>\n\n<dt><a target=\"text_woarchive\" href=\"../../../boost/archive/text_woarchive.hpp\">\nboost/archive/text_woarchive.hpp\n</a>\n<dd>wide character text input archive used for saving.</dd>\n\n<dt><a target=\"xml_iarchive\" href=\"../../../boost/archive/xml_iarchive.hpp\">\nboost/archive/xml_iarchive.hpp\n</a>\n<dd>xml input archive used for loading.</dd>\n\n<dt><a target=\"text_oarchive\" href=\"../../../boost/archive/xml_oarchive.hpp\">\nboost/archive/xml_oarchive.hpp\n</a>\n<dd>xml output archive used for saving.</dd>\n\n<dt><a target=\"text_wiarchive\" href=\"../../../boost/archive/xml_wiarchive.hpp\">\nboost/archive/xml_wiarchive.hpp\n</a>\n<dd>wide character xml input archive used for loading.</dd>\n\n<dt><a target=\"text_woarchive\" href=\"../../../boost/archive/xml_woarchive.hpp\">\nboost/archive/xml_woarchive.hpp\n</a>\n<dd>wide character xml output archive used for saving.</dd>\n\n</dl>\n\n<a name=\"serializationdeclarations\">\n<h4>Serialization Declarations</h4>\nTo specify how a type is serialized, one codes templates for serialization functions.\nIn the simplest cases, this does not require the inclusion of any header files for this purpose.\nIn most cases one or more of the following header files will have to be included in order\nto complete or refine the description of the serializaition implementation for a given class.\n\n<dl>\n\n<dt><a target=\"base_object\" href=\"../../../boost/serialization/base_object.hpp\">\nboost/serialization/base_object.hpp\n</a>\n<dd>For serialization of base classes.</dd>\n\n<dt><a target=\"nvp\" href=\"../../../boost/serialization/nvp.hpp\">\nboost/serialization/nvp.hpp\n</a>\n<dd>To associate a name tag with a serializable object.  This is necessary to\nproperly render an xml archive which includes the object name.</dd>\n\n<dt><a target=\"split_free\" href=\"../../../boost/serialization/split_free.hpp\">\nboost/serialization/split_free.hpp\n</a>\n<dd>To divide implementation of <em>non-intrusive</em> serialization into separate\nsave and load functions.</dd>\n\n<dt><a target=\"split_member\" href=\"../../../boost/serialization/split_member.hpp\">\nboost/serialization/split_member.hpp\n</a>\n<dd>To divide implementation of <em>intrusive</em> serialization into separate\nsave and load functions.</dd>\n\n<dt><a target=\"export\" href=\"../../../boost/serialization/export.hpp\">\nboost/serialization/export.hpp\n</a>\n<dd>For serialization of pointers to derived classes via key export.</dd>\n\n<dt><a target=\"assume_abstract\" href=\"../../../boost/serialization/assume_abstract.hpp\">\nboost/serialization/assume_abstract.hpp\n</a>\n<dd>This is just a thin wrapper which permits one to explicitly specify that a \nparticular type is an abstract base class.  It is necessary to use this\nfor compilers which don't support the boost type traits implementation of\nis_abstact.\n</dd>\n\n</dl>\n\nThis group will be required less frequently.  The are used to override aspects of\nthe default implementation of the serialization process for specified types.\n\n<dl>\n\n<dt><a target=\"version\" href=\"../../../boost/serialization/version.hpp\">\nboost/serialization/version.hpp\n</a>\n<dd>To override the default version index (0) assigned to a class.</dd>\n\n<dt><a target=\"level\" href=\"../../../boost/serialization/level.hpp\">\nboost/serialization/level.hpp\n</a>\n<dd>To override the default implementation level trait for a type.</dd>\n\n<dt><a target=\"tracking\" href=\"../../../boost/serialization/tracking.hpp\">\nboost/serialization/tracking.hpp\n</a>\n<dd>To override the default tracking trait for a type.</dd>\n\n<dt><a target=\"type_info_implementation\" href=\"../../../boost/serialization/type_info_implementation.hpp\">\nboost/serialization/type_info_implementation.hpp\n</a>\n<dd>By default, the library uses RTTI, to identify types at runtime. In some cases, E.G.\nsuch as a platform which doesn't implement RTTI, this header can be included to permit\nthe override of the default runtime type identification system.</dd>\n\n</dl>\n\n<a name=\"serializationimplementations\">\n<h4>Serialization Implementations</h4>\nThis group of headers includes templates which implement serialization for Standard\nLibrary or Boost Library templates.  Any program which uses these templates can\ninvoke serialization of objects of these types just by including the corresponding header.\n<p>\nBy convention these header files are named:\n\nboost/serialization/xxx.hpp\n\nwhere xxx is the name of the header file which contains the type to be serialized.\nFor example, the declaration\n<pre><code>\n#include &lt;boost/serialization/list.hpp&gt;\n</code></pre>\n\nincludes the code to implement serialization of the STL\n<code style=\"white-space: normal\">std::list</code> type. While\n\n<pre><code>\n#include &lt;boost/serialization/shared_ptr.hpp&gt;\n</code></pre>\n\nincludes code to implement serialization of the BOOST <code style=\"white-space: normal\">boost::shared_ptr</code> type.\n\nNote that including the serialization header for a type automatically includes the \nappropriate header of the type to be serialized.\n\nAs of this writing, the library includes templates of all STL library templates as well\nas templates for <code style=\"white-space: normal\">boost::optional</code>, \n<code style=\"white-space: normal\">boost::shared_ptr</code>, and \n<code style=\"white-space: normal\">boost::scoped_ptr</code>.  \nPresumably, this list will expand with the passage of time.\n\n<a name=\"libraryimplementation\">\n<h3>Files Which Implement the Library</h3>\n\n<a name=\"archivedevelopment\">\n<h4>Archive Development</h4>\nThese header files contain declarations for basic types used to create\nconcrete archive types that are made available to users above. Users wishing\nto make their own type of archive may want to examine these headers to\nsee how the archives included with the libary have been constructed.\n\n<dl>\n\n<dt><a target=\"basic_archive\" href=\"../../../boost/archive/basic_archive.hpp\">\nboost/archive/basic_archive.hpp\n</a>\n</dt>\n<dd>\nThis file includes declarations for certain types that have to be accounted\nfor in all archive implementations.  The serialization system relies on \ncertain special types such as <code style=\"white-space: normal\">class_id_type</code> and others to \nrecord information in archives that is required to reconstruct the original\ndata structure.  These are handled exactly as any other serializable type.\nThat is, they can be handled as simple primitives such as they are in simple\ntext files, or with special code as they are in xml archives.\n</dd>\n\n<dt><a target=\"basic_text_oprimitive\" href=\"../../../boost/archive/basic_text_oprimitive.hpp\">\nboost/archive/basic_text_oprimitive.hpp\n</a>\n<dt><a target=\"basic_text_iprimitive\" href=\"../../../boost/archive/basic_text_iprimitive.hpp\">\nboost/archive/basic_text_iprimitive.hpp\n</a>\n</dt>\n<dd>\nImplementation of serialization of primitive types in terms of character\nor wide character text streams. This is used in the implementation of text and\nxml archives.  Presumably this would be useful for implementations of other variations\nof text archives such as user friendly text or windows ini files.\n</dd>\n\n<dt><a target=\"basic_binary_oprimitive\" href=\"../../../boost/archive/basic_binary_oprimitive.hpp\">\nboost/archive/basic_binary_oprimitive.hpp\n</a>\n<dt><a target=\"basic_binary_iprimitive\" href=\"../../../boost/archive/basic_binary_iprimitive.hpp\">\nboost/archive/basic_binary_iprimitive.hpp\n</a>\n</dt>\n<dd>\nImplementation of serialization of primitive types in terms of character\nor wide character binary streams. \n</dd>\n\n<dt><a target=\"basic_binary_oarchive\" href=\"../../../boost/archive/basic_binary_oarchive.hpp\">\nboost/archive/basic_binary_oarchive.hpp\n</a>\n<dt><a target=\"basic_binary_iarchive\" href=\"../../../boost/archive/basic_binary_iarchive.hpp\">\nboost/archive/basic_binary_iarchive.hpp\n</a>\n<dd>\nImplementation of serialization of all types in terms of character\nor wide character binary streams.  This is factored out separately from the\nimplementation of binary primitives above.  This may facilitate the creation of\nother types of binary archives in the future. It also preserves analogy and symmetry with\nthe rest of the library which aids in understanding.\n</dd>\n<dt><a target=\"basic_text_oarchive\" href=\"../../../boost/archive/basic_text_oarchive.hpp\">\nboost/archive/basic_text_oarchive.hpp\n</a>\n<dt><a target=\"basic_te't_iarchive\" href=\"../../../boost/archive/basic_text_iarchive.hpp\">\nboost/archive/basic_text_iarchive.hpp\n</a>\n</dt>\n<dt><a target=\"basic_xml_oarchive\" href=\"../../../boost/archive/basic_xml_oarchive.hpp\">\nboost/archive/basic_xml_oarchive.hpp\n</a>\n<dt><a target=\"basic_xml_iarchive\" href=\"../../../boost/archive/basic_xml_iarchive.hpp\">\nboost/archive/basic_xml_iarchive.hpp\n</a>\n</dt>\n<dd>\nImplementation of serialization of all types in terms of character\nor wide character text streams. These classes specify archive type specific\nbehavior on a type by type basis.  For example, <code style=\"white-space: normal\">basic_xml_oarchive.hpp</code>\nincludes code to guarantee that any object not attached to a name will \ntrap during compile time. On the other hand, <code style=\"white-space: normal\">basic_text_oarchive.hpp</code>\ncontains code to strip out and ignore any names attached to objects.\n<p>\n<dt><a target=\"common_iarchive\" href=\"../../../boost/archive/detail/common_iarchive.hpp\">\nboost/archive/detail/common_iarchive.hpp\n</a>\n<dt><a target=\"common_oarchive\" href=\"../../../boost/archive/detail/common_oarchive.hpp\">\nboost/archive/detail/common_oarchive.hpp\n</a>\n<dd>\nAll archive implementations are derived from these header files.  They provide\nthe interface to the internal implementation details of the library.\n</dd>\n\n</dl>\n\n<a name=\"archiveinternals\">\n<h4>Archive Internals</h4>\n \nThe interface (see <a target=\"detail\" href=\"archives.html\">Archive Concepts</a>) \nand implementation are factored out into separate classes to minimize code duplication.\n\nThese files are found in the directory\n<a target=\"boost_archive_detail\" href=\"../../../boost/archive/detail\">boost/archive/detail</a>.  \nThese are included as necessary by the archive class implementations listed above.\nThis has the unfortunate side effect of making the implementation less transparent.\nUsers should never find it necessary to change these files.\n<p>\nThe following discussion is based on the\n<a target=\"class_diagram\" href=\"class_diagram.html\">class diagram</a>.\n<p>\n<dt><a target=\"interface_iarchive\" href=\"../../../boost/archive/detail/interface_iarchive.hpp\">\nboost/archive/detail/interface_iarchive.hpp</a>\n<dt><a target=\"interface_iarchive\" href=\"../../../boost/archive/detail/interface_iarchive.hpp\">\nboost/archive/detail/interface_iarchive.hpp</a>\n<dd>\nHere are the declarations and definitions for the \n<a href=\"archives.html\">archive_concept</a>. This class redirects calls to the \narchive interface to a function named <code>save_override</code> in the most derived\narchive class. \n</dd>\n<code>save_override</code> is declared and implemented in each class in\nthe archive hierarchy.\n\n<pre><code>\ntemplate&lt;class T&gt;\nvoid save_override(T &amp; t, BOOST_PFTO int){\n    // All for otherwise unhandled types are forwarded to the base class.\n    // This emulates behavior for function overloading.\n    this-&gt;base::save_override(t, 0);\n}\nvoid save_override(const some_type &amp; t, int){\n    // any special handling for some type\n    // this will usually entail forwarding some other operation\n    // in the most derived class.\n    this-&gt;This()-&gt;...\n    // or in one of its parents basic_text_oprimitive\n    this-&gt;This()-&gt;save(static_cast&lt;int&gt;(t));\n}\n... // other special type handling\n</code></pre>\n\nNote the usage of\n<a target=\"detail\" href=\"implementation.html#functiontemplateordering\">Partial Function Template Ordering</a>\nto permit the correct save implementation to be selected.  \n</dd>\n\n<a name=\"codemodules\">\n<h4>Archive Library Code Modules</h4>\nParts of the library are implemented as library code. All of this code is to be found in\n<a target=\"src\" href=\"../../../libs/serialization/src\">libs/serialization/src</a>. \nin the form of *.cpp.  The directory\n<a target=\"src\" href=\"../../../boost/archive/impl\">boost/archive/impl</a>\ncontains *.ipp files which implement templates. These templates are instantiated\nonly by archive implementation so are generally not included in user code modules.\n<p>\nThe trade offs related to library implementation via pre-compiled code and templated\nheaders are well known.  This library uses both.  It uses templated headers\nto generate code to serialize user and primitive types and it uses pre-compiled\nlibrary code for that part of the code which only depends upon the archive type.\nBuilding of the library generates and compiles code for all archives implemented.\n\n<ul>\n  <li>Serialization of user and primitive types runs at top speed. This is a noticeable\n  difference with a previous version of the library which did not use templates for archives.\n  <li>Library implementation code that never changes need only be compiled once\n  rather than each time a user's program is recompiled.  This can save much\n  development time.\n  <li>Headers which solely related to implementation need only be included\n  in the library code modules. This prevents a user program from accidentally \n  depending on an implementation feature of the serialization library.\n  <li>In building the library I came to the conclusions that there can arise\n  situations regarding static code/data instantiation that could not be \n  satisfactorily addressed without a code module.  Unfortunately, I've forgotten\n  the circumstances which led me to this conclusion.\n</ul>\t\nAn example of this is the usage of the spirit library in the library.\nIt takes a long time to compile and includes lots of other files. Having this\nonly in the library is much more convenient that having to include it in every\nprogram which uses xml serialization.\n\n<a name=\"dataflowiterators\">\n<h4>Dataflow Iterators</h4>\nIn the course of developing this library, it became convenient to make a set\nof composable iterator adaptors for handling archive text.  Applications include\nescaping and unescaping xml text and implementing to/from base64 conversion among\nothers.\n<p>\nThis is a ripe topic in itself. It's touched upon by the \n<a href=\"../../../libs/iterator/doc/index.html\">boost iterator</a> libraries, \n<a href=\"http://www.zib.de/weiser/vtl/index.html\">View Template Library</a>, and others. \n<p>\nThe code for these iterators is really independent of this library.  But since it\nhasn't been and probably won't be reviewed outside of this context. I've left it in a directory \nlocal to the serialization library:\n<a target=\"archiveiterators\" href=\"../../../boost/archive/iterators\">boost/archive/iterators</a>.\nThese iterators are described in \n<a href=\"dataflow.html\">Dataflow Iterators</a>.\n<hr>\n<p><i>&copy; Copyright <a href=\"http://www.rrsd.com\">Robert Ramey</a> 2002-2004. \nDistributed under the Boost Software License, Version 1.0. (See\naccompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n</i></p>\n</body>\n</html>\n"
  },
  {
    "path": "doc/history.html",
    "content": "<!doctype HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">\n<html>\n<!--\n(C) Copyright 2002-4 Robert Ramey - http://www.rrsd.com . \nUse, modification and distribution is subject to the Boost Software\nLicense, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\nhttp://www.boost.org/LICENSE_1_0.txt)\n-->\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\n<link rel=\"stylesheet\" type=\"text/css\" href=\"../../../boost.css\">\n<link rel=\"stylesheet\" type=\"text/css\" href=\"style.css\">\n<title>Serialization - History</title>\n</head>\n<body link=\"#0000ff\" vlink=\"#800080\">\n<table border=\"0\" cellpadding=\"7\" cellspacing=\"0\" width=\"100%\" summary=\"header\">\n  <tr> \n    <td valign=\"top\" width=\"300\"> \n      <h3><a href=\"../../../index.htm\"><img height=\"86\" width=\"277\" alt=\"C++ Boost\" src=\"../../../boost.png\" border=\"0\"></a></h3>\n    </td>\n    <td valign=\"top\"> \n      <h1 align=\"center\">Serialization</h1>\n      <h2 align=\"center\">History</h2>\n    </td>\n  </tr>\n</table>\n<hr>\n<ol>\n  <li>26 Feb 2002 initial version uploaded to boost\n  <li>27 Feb 2002\n    <ul>\n      <li>divide interface from implementation for class \n          serialization to permit compilation on gcc\n      <li>improved template instantantation for type templates\n    </ul>\n  <li>18 Mar 2002 - draft #2 uploaded to boost\n    <ul>\n      <li>elminated locale effects on archives\n      <li>added signature and library version to archive header\n      <li>improved detection of errors when objects are serialized \n          as pointers and subsequently serialized as objects\n      <li>permit non-portable binary archives\n      <li>implement workaround for systems such as MSVC 6.0 that\n          don't support partial ordering\n    </ul>\n  <li>16 May 2002 - draft #3 uploaded to boost\n    <ul>\n      <li>Ability to specify serialization of other templates in a\n          non-intrusive way.\n      <li>Included an example which uses boost::shared_ptr.\n      <li>improved documentation\n      <li>More test cases\n      <li>More testing and documentation of obscure situtations\n      <li>Better code organization for transparency\n      <li>Wide character support implemented and tested with unicode.\n    </ul>\n  <li>28 Jun 2002 - #4 library submission\n    <ul>\n      <li>minor corrections\n      <li>replaced erroneous shared_ptr example with std::auto_ptr example\n      <li>prevention of memory leaks when exceptions are invoked\n    </ul>\n  <li>30 Aug 2002 - #5 library submission\n    <ul>\n      <li>minor corrections\n      <li>Additions to documentation to explicitly address issues of\n          exception safety.\n      <li>More test cases/demos to illustrate handling of the above issues.\n      <li>Additions to documentation to include rationale for not depending\n          on type_id\n      <li>Implementation of serialization of boost::shared_ptr.\n          This is included as a demo as it depends upon a minor alteration\n          of boost::shared_count.\n    </ul>\n  <li>08 Nov 2002   - #6 library submission\n    <ul>\n      <li>minor corrections\n      <li>corrected error which manifested itself when serializing\n          polymorphic pointers to obects derived from multiple\n          base classes\n      <li>minor adjustments to support plug-ins via virtual\n          save/load/version functions\n      <li>test cases to support the above\n    </ul>\n  <li>08 September 2003- version # 12 library submission\n    <ul>\n      <li>attempts to address all issues raised during the November 2002 review\n    </ul>\n  <li>November 2003 - draft #13 uploaded\n    <ul>\n      <li>corrections, enhancements, change in api for pointer overload\n    </ul>\n  <li>28 December 2003\n    <ul>\n       <li>implementation of save/loadbinary\n       <li>enhancements included archives to permit derivation\n    </ul>\n  <li>1 March 2004 - draft # 17 upload\n    <ul>\n       <li>portability to intel 8.0, and VC 6.0\n       <li>Alter archive implementation to permit derivation.  Make tests.\n       <li>Implement serialize/save/load binary for text and XML archives\n       using <code>base64</code> character encoding.\n       <li>Added documentation and test for serialization of large binary objects.\n       <li>Added \"Derivation from an Existing Archive Class\" to documentation along\n       with example program.\n       <li>Added PIMPL example\n       <li>certain special situations are now detected and addressed at\n       compile time to generate all in-line code.  For example, for types\n       serialized without class information, and without memory tracking,\n       the serialization process can be reduced to a minimal amount of inline\n       code.\n       <li>All tests have been run in release as well as debug mode\n       <li>Many improvements in code and documentation to improve accuracy and completeness.\n    </ul>\n  <li>11 April 2004 - draft # 18 upload\n    <ul>\n       <li>Reorganization of header and template files.\n       <li>Enhanced documentation to help explain implementation issues.\n       <li>Adjustments to improve support for less conformant compilers.\n       <li>A few bug fixes.\n    </ul>\n  <li>31 May 2004 - draft # 20 upload\n    <ul>\n       <li>Polymorphic archives.\n       <li>A few bug fixes.\n    </ul>\n  <li>1 November 2004 - final changes for first boost official release 1.32 .\n    <ul>\n       <li>Adjustments to address package compatible with two-phase lookup.\n       <li>Many small adjustments to accommodate quirks of various compilers.\n       <li>A few bug fixes.\n    </ul>\n</ol>\n<hr>\n<p><i>&copy; Copyright <a href=\"http://www.rrsd.com\">Robert Ramey</a> 2002-2004. \nDistributed under the Boost Software License, Version 1.0. (See\naccompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n</i></p>\n</body>\n</html>\n"
  },
  {
    "path": "doc/implementation.html",
    "content": "<!doctype HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">\n<html>\n<!--\n(C) Copyright 2002-4 Robert Ramey - http://www.rrsd.com . \nUse, modification and distribution is subject to the Boost Software\nLicense, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\nhttp://www.boost.org/LICENSE_1_0.txt)\n-->\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\n<link rel=\"stylesheet\" type=\"text/css\" href=\"../../../boost.css\">\n<link rel=\"stylesheet\" type=\"text/css\" href=\"style.css\">\n<title>Serialization - Implementation Notes</title>\n</head>\n<body link=\"#0000ff\" vlink=\"#800080\">\n<table border=\"0\" cellpadding=\"7\" cellspacing=\"0\" width=\"100%\" summary=\"header\">\n  <tr> \n    <td valign=\"top\" width=\"300\"> \n      <h3><a href=\"../../../index.htm\"><img height=\"86\" width=\"277\" alt=\"C++ Boost\" src=\"../../../boost.png\" border=\"0\"></a></h3>\n    </td>\n    <td valign=\"top\"> \n      <h1 align=\"center\">Serialization</h1>\n      <h2 align=\"center\">Implementation Notes</h2>\n    </td>\n  </tr>\n</table>\n<hr>\n<dl class=\"page-index\">\n  <dt><a href=\"#charencoding\">Character Encoding</a>\n  <dt><a href=\"#othercompilerissues\">Specific Compiler/Library Issues</a>\n  <dl class=\"page-index\">\n    <dt><a href=\"#gcc4x\">44.X</a>\n    <dt><a href=\"#intel80\">Intel 8.0</a>\n    <dt><a href=\"#vc80\">Visual C++ 8.0</a>\n    <dt><a href=\"#vc71\">Visual C++ 7.1</a>\n    <dt><a href=\"#comeau\">Comeau 4.3.3</a>\n    <dt><a href=\"#codewarrior9\">Code Warrior 9.x</a>\n    <dt><a href=\"#codewarrior\">Code Warrior 8.3</a>\n    <dt><a href=\"#tru64\">TRU64</a>\n    <dt><a href=\"#dinkumware\">Dinkumware Library</a>\n    <dt><a href=\"#stlport\">STLPort 4.5.3</a>\n  </dl>\n</dl>\n\n<h3><a name=\"charencoding\">Character Encoding</a></h3>\nThe whole question of character encoding combined with wide characters\nis much more complicated than it would seem to be. The current library\ndefines in 3 formats (text, binary, and XML), wide and narrow characters, \nand attempts to be portable between compiler libraries.  The results of \na rather long consideration of all these factors has been to set\ndefault encoding according to the following rules.\n<ul>\n  <li>All text archives (i.e. <code style=\"white-space: normal\">text_?archive</code>) will produce\n      text output in the current stream <code style=\"white-space: normal\">locale</code>.  Generally this will\n      produce no changes in string data.\n  <li>To produce binary output with Microsoft compilers, the stream\n      will have to be opened with mode <code style=\"white-space: normal\">ios::binary</code>.\n      Failure to do so will result in 0x0d characters (carriage-return)\n      characters being removed from the input stream if they are followed\n      by a 0x0a character (line-feed).  This could corrupt the input\n      and make the file unreadable.  On UNIX systems the <code style=\"white-space: normal\">ios::binary</code>\n      is not required and is ignored if used.\n  <li>character XML archives (i.e. xml_oarchive) will produce XML output\n      with characters encoded according to the current stream <code style=\"white-space: normal\">locale</code>.\n  <li>wide character XML archives (i.e. xml_woarchive) will produce\n      files encoded in UTF-8.\n</ul>\nThis character encoding is implemented by changing the <code style=\"white-space: normal\">locale</code> of the\ni/o stream used by an archive when the archive is constructed, the stream\nlocale is changed back to its original value. This action can be overridden \nby specifying <code style=\"white-space: normal\">boost::archive::no_codecvt</code>\nwhen the archive is opened.  In this case, the stream <code style=\"white-space: normal\">locale</code> will\nnot be changed by the serialization library.\n<p>\nNote that the code conversion included for wide character text and XML\narchives could alter <code style=\"white-space: normal\">std::string</code> data stored in archives.\nSuppose a normal (multi-byte) character string\nis written to a wide character stream.  Our system uses the current <code style=\"white-space: normal\">locale</code>\nto translate it to a wide character string before writing it out.  \nUpon reading, it is translated back to a (multi-byte)string. \nIf the <code style=\"white-space: normal\">locale</code> on the platform that reads the archive is different than \nthe <code style=\"white-space: normal\">locale</code> on the platform that wrote the stream, the actual string data\nmay be altered by the serialization process. To avoid this, either\navoid usage of <code style=\"white-space: normal\">locale</code> dependent multi-byte strings or be sure that\nthe <code style=\"white-space: normal\">locale</code> is set correctly before reading the archive.\n<p>\nTo produce wide character text output (i.e. 16 bit characters on Win32 systems),\ndo the following.\n<ul>\n  <li>Open a wide character stream.\n  <li>Alter the stream <code style=\"white-space: normal\">locale</code> to use \n     <code style=\"white-space: normal\">boost::archive::codecvt_null&lt;OStream::char_type&gt;</code>\n  <li>Create the archive with the flag <code style=\"white-space: normal\">no_codecvt</code>.\n</ul>\nNaturally, the input process has to be symmetrical.\n<h3><a name=\"othercompilerissues\">Specific Compiler/Library Issues</a></h3>\n<h4><a name=\"gcc4x\">GCC 4.X</a></h4>\n<ul>\n    <li>GCC versions for Cygwin and MinGW fail to support wide character I/O.  \n    So all tests using wide char I/O fail.  Note that if wide character I/O support\n    is added with STLPort, all tests complete successfully.\n    <li>This compiler generates long warning messages related to the usage of\n    non virtual destructors in polymorphic classes.  These warnings have been\n    carefully considered and the code that generates these warning has been \n    unchanged.  In this case the warning should should be ignored as in certain\n    usages of the library, making the destructors virtual could lead to problems.\n    As an alternative, base class destructors have been made \"protected\" to\n    address the concerns that motivate these warning messages.  When building\n    the serialization library and tests with bjam, these warnings are suppressed. \n    When building one's own applications, these warnings can be suppressed by\n    adding the following to the compiler command line:\n    <pre><code>\n    -Wno-non-virtual-dtor\n    -Wno-ctor-dtor-privacy\n    </code></pre>\n</ul>\n<h4><a name=\"intel80\">Intel C++ 8.0</a></h4>\nNo known issues. All tests compile and run in debug and release modes.\n\n<h4><a name=\"vc80\">Visual C++ 8.0</a></h4>\nThis compiler emits warnings for calls to functions from the standard\nlibrary which are deemed security risks.  The serialization depends upon\nmaking some of these calls so programs which use the serialization library\nwill get warning messages.  These messages can be suppressed from the command \nline by including the following switch:\n    <pre><code>\n    /wd4996\n    </code></pre>\n\n<h4><a name=\"vc71\">Visual C++ 7.1</a></h4>\nDerivation from an archive class defined in a DLL as described in ... will not work.\nThis is due to the way that VC++ handles templated code with __decl(dllexport) and\n__decl(dllimport) specifications.  Basically, this compiler requires that all the\ninstantiations have the same specification - even though they have different\ntemplate arguments. The example <code style=\"white-space: normal\">\ndemo_portable_iarchive.cpp</code> would have to be reformulated as a library or dll\nsimilar to the pre-defined archives in order to function.\n<p>\nThis compiler does not have RTTI or exception handling turned on by default.  Although\nthey are not strictly necessary to use the serialization package, the example and test\nprograms presume that they are enabled.  So be sure your command line or IDE settings \nenable these features if you want to build and run these programs.\n<p>\nThis compiler can treat <code style=\"white-space: normal\">wchar_t</code> as either\na short integer or an intrinsic type.\nIf <code style=\"white-space: normal\">/Zc:wchar_t</code> is specified on the\ncompile command line, <code style=\"white-space: normal\">wchar_t</code> will be \nconsidered an intrinsic type - otherwise\nit will be treated as a synonym for a 16 bit integer.  The library can be used\neither way - <strong>BUT</strong> - both the library <strong>AND</strong> the application \nmust be  compiled with the same switch settings.  Note that <code style=\"white-space: normal\">BJAM</code>\nincludes this switch by default.  So if want to use the libraries that\n<code style=\"white-space: normal\">BJAM</code> builds, you should include this switch\nwhen you compile your own applications.\n<h5>Using the Visual C++ IDE</h5>\nThe library includes a VC++ 7.1 \"Solution\" - <code style=\"white-space: normal\">BoostSerializationLibrary</code>\nalong with a set of project files - one for each demo and test. Consider the following if you\ndecide to use these configurations.\n<ul>\n    <li>The projects assume that the tests have been built with bjam using the default\n    locations.  This will result in a <code style=\"white-space: normal\">bin</code> subdirectory\n    within one's main boost directory.  Below this there is a whole structure which maintains \n    object and library files according to the type of build.  The easiest way to build this is to\n    invoke the runtest script which uses bjam (see below).  If the libraries are not in these locations,\n    the projects will have to be modified accordingly.\n    <li>There are project configurations for all the combinations of build variants that boost\n    supports. That is for release, debug, static, static multi-threading, etc..\n    <li>If you want to use/debug the DLL versions of libraries and corresponding tests, alter\n    the project file to define <code style=\"white-space: normal\">BOOST_ALL_DYN_LINK=1</code>.\n    Note that for the executables to run, the <code style=\"white-space: normal\">PATH</code>\n    environmental variable will have to include the directories that contain the DLL versions of\n    the boost libraries.\n    <li>If you have difficulties building your own projects and linking with the boost libraries, \n    compare the project settings of your own projects with the ones here.  VC sometimes requires\n    consistent settings between projects and the libraries they use in order to link properly.\n    In particular, check support for exceptions, runtime typing(RTTI), and intrinsic support for\n    wide characters.  The standard version of this library presumes that these facilities are\n    enabled.  Projects generated by the IDE wizard do not have these features enabled by default.\n    <li>Frequently when trying to build a project or view project properties, one is presented with\n    a message box with the message \"unspecified error\".  This seems to occur when one changes the\n    build configuration selection.  It turns out this can be \"fixed\" by going to the \"Build\" \n    menu item, selecting \"Configuration Manager\" and selecting a build configuration for the project\n    you're working with.\n    <li>To test that boost libraries are built correctly, one can build and test them the way we do.\n    This entails:\n    <ol>\n        <li>downloading a copy of bjam.exe\n        <li>building process_jam_log\n        <li>building compiler_status\n\t<li>invoking runtest.bat\n    </ol>\n    This will build the serialization library and run the tests on your system. If there are more than a\n    a couple of test failures, you likely won't be able to get your own projects working.  If most of the\n    tests pass, you can be confident that your own projects will work once you get your project settings\n    in sync with those included here.\n</ul>\n\n<h4><a name=\"comeau\">Comeau 4.3.3</a></h4>\n<ul>\n    <li>This compiler fails to make a DLL with export under windows.\n    <li>The associated library - libcomo fails when using a codecvt facet.\n    This generates a failure with all wide character archives.\n    <li>the test_set fails by going into an infinite memory leak.\n</ul>\n\n<h4><a name=\"codewarrior9\">Code Warrior 9.x</a></h4>\n<ul>\n    <li>Some tests and demos fail - still under investigation\n</ul>\n\n<h4><a name=\"codewarrior\">Code Warrior 8.3</a></h4>\nall the above issues for Code Warrior 9.x plus:\n<ul>\n    <li>This compiler only supports templated streams with the static library version.\n    <li>The above inhibits the build of DLL versions of the library.\n    <li>Some demos fail - still under investigation\n</ul>\n\n<h4><a name=\"tru64\">TRU64</a></h4>\nAll tests and demos pass except for test_variant.  Boost Variant doesn't function\nwih this compiler\n\n<h4><a name=\"dinkumware\">Dinkumware Library</a></h4>\nSeveral compilers, including Visual C++ 6.0, use an older dinkumware library.  \nThese platforms have several issues: \n<ul>\n    <li>The dinkumware library shipped with this compiler does not change the locale facet\n    of an i/o stream unless the <code style=\"white-space: normal\">imbue</code> function is called before the\n    stream is opened.  In order to use this library with this environment to generate UTF-8\n    files, one cannot depend on the \"automatic\" setting of locale that archives implement. The\n    stream locale must be set explicitly on the stream before an archive is opened on it.  The\n    archive should be opened with the <code style=\"white-space: normal\">no_codecvt</code> flag.  Note this problem will\n    occur on all compilers shipped with this library.\n    <li>Other issues have been worked around in the file.\n    <a href=\"../../../boost/archive/dinkumware.hpp\" target=\"dinkumware_hpp\">dinkumware.hpp</a>\n</ul>\n\n<h4><a name=\"stlport\">STLPort 4.5.3</a></h4>\n<ul>\n    <li>when built to use the dynamic linking versions of the C++ runtime code (<runtime-link>dynamic)\n    all tests fail to link.  This is due to a missing symbol in the stlport library related\n    to custom codecvt facets.\n    <li>the test_set fails to run correctly. It seems the hashed set iterator doesn't\n    implement the ++ operator correctly.  This causes the test to fail by consuming all available\n    memory.  Given this, this test is commented out.\n</ul>\n\n<hr>\n<p>Revised 1 November, 2004 \n<p><i>&copy; Copyright <a href=\"http://www.rrsd.com\">Robert Ramey</a> 2002-2015.\nDistributed under the Boost Software License, Version 1.0. (See\naccompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n</i></p>\n</body>\n</html>\n"
  },
  {
    "path": "doc/index.html",
    "content": "<!doctype HTML PUBLIC \"-//W3C//DTD HTML 4.01 Frameset//EN\"\n   \"http://www.w3.org/TR/html4/frameset.dtd\"><html>\n<head>\n<!--\nRevised 1 November, 2004 \n&copy; Copyright <a href=\"http://www.rrsd.com\">Robert Ramey</a> 2002-2004. \nDistributed under the Boost Software License, Version 1.0. (See\naccompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n-->\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\n<link rel=\"stylesheet\" type=\"text/css\" href=\"../../../boost.css\">\n<title>Serialization</title>\n</head>\n<frameset cols=\"30%, 70%\">\n  <frame name=\"contents\" src=\"contents.html\" scrolling = \"yes\">\n  <frame name=\"detail\" src=\"overview.html\" scrolling = \"yes\">\n  <noframes><a href=\"overview.html\"</a></noframes>\n</frameset>\n</html>\n"
  },
  {
    "path": "doc/new_case_studies.html",
    "content": "﻿<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">\n<html>\n<!--\n(C) Copyright 2002-4 Robert Ramey - http://www.rrsd.com . \nUse, modification and distribution is subject to the Boost Software\nLicense, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\nhttp://www.boost.org/LICENSE_1_0.txt)\n-->\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\n<link rel=\"stylesheet\" type=\"text/css\" href=\"../../../boost.css\">\n<link rel=\"stylesheet\" type=\"text/css\" href=\"style.css\">\n<title>Serialization - Proposed Case Studies</title>\n</head>\n<body link=\"#0000ff\" vlink=\"#800080\">\n<table border=\"0\" cellpadding=\"7\" cellspacing=\"0\" width=\"100%\" summary=\"header\">\n  <tr> \n    <td valign=\"top\" width=\"300\"> \n      <h3><a href=\"../../../index.htm\"><img height=\"86\" width=\"277\" alt=\"C++ Boost\" src=\"../../../boost.png\" border=\"0\"></a></h3>\n    </td>\n    <td valign=\"top\"> \n      <h1 align=\"center\">Serialization</h1>\n      <h2 align=\"center\">Proposed Case Studies</h2>\n    </td>\n  </tr>\n</table>\n<hr>\n<dl class=\"index\">\n  <dt><a href=\"#functionobject\">Serializing a Function Object</a></dt>\n  <dt><a href=\"#archiveadaptor\">Archive Adaptors</a></dt>\n  <dt><a href=\"#archivehelper\">Archive Helpers</a></dt>\n</dl>\n\nThese are not part of the library itself, but rather\ntechniques on how to use the library to address specific situations.\n\n<h2><a name=\"functionobject\"></a>Serializing a Function Object</h2>\nAn example on how to serialize a function object.  I believe this\ncould be done by serializing a pointer to the object in question.  Since\nthe Serialization library resurrects a pointer of the correct type\nthis should be easily implementable.\n<p>\nIf a group of function objects were all derived from the\nsame polymorphic base class - perhaps via multiple inheritance,\nthen the function object effectively becomes a \"variable\" which\nencapsulates code.\n<p>\nThis case study would show how to do this.\n\n<h2><a name=\"archiveadaptor\"></a>Archive Adaptors</h2>\n\nOften users want to add their own special functionality to an\nexisting archive.  Examples of this are performance enhancements\nfor specific types, adjustment of output syntax for xml archives,\nand logging/debug output as archives are written and/or read.\nIf this functionality is implemented as an \"adaptor\" template\nwhich takes the base class as a template argument, such functionality could be\nappended to any archive for which that functionality makes sense.\nFor example, an adaptor for generating an xml schema could be\nappended to both wide and narrow character versions of xml archives.\n<p>\nThis case study would show how to make a useful archive adaptor.\n\n<h2><a name=\"archivehelper\"></a>Archive Helpers</h2>\nSome types are not serializable as they stand.  That is - they\ndo not fulfill the requirements of the \"Serializable Concept\".\nThe iconic example of this is boost::shared_ptr.  Sometimes\nthese types could be made serializable by adding code inside\nthe library.  Of course, doing that would create a lifetime\nof unpaid employment for the library author. Rather than\nadding a bunch of special code to the library itself, this\ncode can packaged as a \"helper\" or \"mix-in\" class.  Then\na new archive is derived from both the \"base\" archive class\nAND the \"helper\" class.  This is how boost::shared_ptr\nhas been implemented.\n<p>\nIt would also be possible to make a \"generic runtime helper\"\nwhich would effectively extend the API of the library.  Previously\nthe library included such a helper class.  It was removed\nin favor of the current implementation.  But this functionality\nshould be added back in with another adaptor which would\nbecome part of the library.\n\n<hr>\n<p>Revised 1 November, 2008 \n<p><i>&copy; Copyright <a href=\"http://www.rrsd.com\">Robert Ramey</a> 2002-2008. \nDistributed under the Boost Software License, Version 1.0. (See\naccompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n</i></p>\n</body>\n</html>\n"
  },
  {
    "path": "doc/overview.html",
    "content": "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">\n<html>\n<!--\n(C) Copyright 2002-4 Robert Ramey - http://www.rrsd.com . \nUse, modification and distribution is subject to the Boost Software\nLicense, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\nhttp://www.boost.org/LICENSE_1_0.txt)\n-->\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\n<link rel=\"stylesheet\" type=\"text/css\" href=\"../../../boost.css\">\n<link rel=\"stylesheet\" type=\"text/css\" href=\"style.css\">\n<title>Serialization - Overview</title>\n</head>\n<body link=\"#0000ff\" vlink=\"#800080\">\n<table border=\"0\" cellpadding=\"7\" cellspacing=\"0\" width=\"100%\" summary=\"header\">\n  <tr> \n    <td valign=\"top\" width=\"300\"> \n      <h3><a href=\"../../../index.htm\"><img height=\"86\" width=\"277\" alt=\"C++ Boost\" src=\"../../../boost.png\" border=\"0\"></a></h3>\n    </td>\n    <td valign=\"top\"> \n      <h1 align=\"center\">Serialization</h1>\n      <h2 align=\"center\">Overview</h2>\n    </td>\n  </tr>\n</table>\n<hr>\n<dl class=\"index\">\n  <dt><a href=\"#Requirements\">Requirements</a></dt>\n  <dt><a href=\"#otherimplementations\">Other Implementations</a></dt>\n</dl>\n<p>Here, we use the term <strong>\"serialization\"</strong> to mean\nthe reversible deconstruction of an arbitrary set of C++ data structures\nto a sequence of bytes.  Such a system can be used to reconstitute\nan equivalent structure in another program context.  Depending on\nthe context, this might used implement object persistence, remote\nparameter passing or other facility. In this system we use the term\n<strong>\"archive\"</strong> to refer to a specific rendering of this\nstream of bytes.  This could be a file of binary data, text data, \nXML, or some other created by the user of this library.\n<h2><a name=\"Requirements\"></a>Our goals for such a system are:</h2>\n   <ol>\n      <li>Code portability - depend only on ANSI C++ facilities.\n\n      <li>Code economy - exploit features of C++ such as RTTI,\n      templates, and multiple inheritance, etc. where appropriate to\n      make code shorter and simpler to use.\n\n      <li>Independent versioning for each class definition. That\n      is, when a class definition changed, older files can still be\n      imported to the new version of the class.\n\n      <li>Deep pointer save and restore. That is, save and restore\n      of pointers saves and restores the data pointed to.\n\n      <li>Proper restoration of pointers to shared data.\n\n      <li>Serialization of STL containers and other commonly used\n      templates.\n\n      <li>Data Portability - Streams of bytes created on one platform\n      should be readable on any other.\n\n      <li>Orthogonal specification of class serialization and archive format.\n      That is, any file format should be able to store serialization\n      of any arbitrary set of C++ data structures without having to\n      alter the serialization of any class.\n\n      <li>Non-intrusive. Permit serialization to be applied to\n      unaltered classes. That is, don't require that classes to be\n      serialized be derived from a specific base class or implement\n      specified member functions. This is necessary to easily\n      permit serialization to be applied to classes from class\n      libraries that we cannot or don't want to have to alter.\n\n      <li> The <strong>archive</strong> interface must be simple\n      enough to easily permit creation of a new type of archive.\n\n      <li> The <strong>archive</strong> interface must be rich\n      enough to permit the creation of an <strong>archive</strong>\n      that presents serialized data as XML in a useful manner.\n   </ol>\n\n<h2><a name=\"otherimplementations\"></a>Other implementations</h2>\n    Before getting started I searched around for current\n    implementations. I found several. \n\n    <ul>\n      <li><u>MFC</u> This is the one that I am very familiar with.\n      I have used it for several years and have found it very useful.\n      However it fails requirements 1, 2, 3, 6, 7, and 9. In spite\n      of all the requirements not fulfilled, this is the most\n      useful implementation I've found. It turns out that class\n      versioning - partially implemented in MFC - really is\n      indispensable for my applications. Inevitably, version 1.x of\n      a shipping program needs to store more information in files\n      than was originally provided for. MFC is the only one of these\n      implementations that supports this - though only for the most\n      derived class. Still it's better than nothing and does the\n      job. MFC doesn't implement serialization of STL collections.\n      Though it does so for MFC collections.\n\n      <li><u>CommonC++ libraries</u> <a href=\"bibliography.html#1\">[1]</a>\n      As far as I can tell, this\n      closely follows the MFC implementation but does address a few\n      of the issues. It is portable and creates portable archives but\n      skips versioning. It does support proper and complete\n      restoration of pointers and STL collections. It does address\n      compression though not in the way that I would prefer. The\n      package would also benefit from having better documentation.\n      So it fails to address 2, 3, 7, 8, and 9.\n\n      <li><u>Eternity</u> <a href=\"bibliography.html#2\">[2]</a> \n      This is a bare bones package. It\n      seems well coded but it really needs documentation and\n      examples. It's not obvious how to use it without time\n      consuming study of the source code. Recent versions do support\n      files in XML format.  This Fails 3, 6, 7?, 8, and 9. \n\n      <li><u>Holub's implementation</u> <a href=\"bibliography.html#3\">[3]</a> This is the article that\n      first got me thinking about my own requirements for\n      a serialization implementation. Interesting and worth\n      the read if you can overlook the arrogant tone of the prose.\n      This implementation fails 2, 3, 4, 5, and 6.\n\n      <li><u>s11n</u> <a href=\"bibliography.html#13\">[13]</a>\n      This library has similar goals to this one. Some aspects of the\n      implemenation are also similar.  As of this writing, it would seem that:\n      <ul>\n          <li>Portability(1) is guaranteed only for recent versions of GCC.\n          <li>Versioning(3) of class definitions is not explicitly supported by\n          the library.\n          <li>it doesn't seem to automatically account for shared pointers(5).\n          I concluded this from the documentation as well as the statement that\n          serialization of graph like structures is not supported.\n      </ul>\n      Its has lots of differences - and lots in common with this implementation. \n    </ul>\n<hr>\n<p>Revised 1 November, 2004 \n<p><i>&copy; Copyright <a href=\"http://www.rrsd.com\">Robert Ramey</a> 2002-2004. \nDistributed under the Boost Software License, Version 1.0. (See\naccompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n</i></p>\n</body>\n</html>\n"
  },
  {
    "path": "doc/performance_status.html",
    "content": "<html>\n<head>\n<title>Boost Library Status Automatic Test</title>\n</head>\n<body bgcolor=\"#ffffff\" text=\"#000000\">\n<table border=\"0\">\n<tr>\n<td><img border=\"0\" src=\"../../../boost.png\" width=\"277\" height=\"86\"></td>\n<td>\n<h1>Library Status: serialization</h1>\n<b>Run Date:</b> 02:42:48 UTC, Tuesday 10 June 2008\n</td>\n</table>\n<br>\n<table border=\"1\" cellspacing=\"0\" cellpadding=\"5\">\n<tr>\n<td rowspan=\"2\">Test Name</td>\n<td align=\"center\" >gcc-3.4.4</td>\n</tr><tr>\n<td align=\"center\" >profile</td>\n</tr><tr><td>peformance_array_binary_archive</a></td><td align=\"right\">Pass <a href=\"profile1.txt\"><i>Profile</i></a></td></tr>\n<tr><td>peformance_array_text_archive</a></td><td align=\"right\">Pass <a href=\"profile1.txt\"><i>Profile</i></a></td></tr>\n<tr><td>peformance_array_text_warchive</a></td><td align=\"right\"><i>Missing</i></td></tr>\n<tr><td>peformance_array_xml_archive</a></td><td align=\"right\">Pass <a href=\"profile1.txt\"><i>Profile</i></a></td></tr>\n<tr><td>peformance_array_xml_warchive</a></td><td align=\"right\"><i>Missing</i></td></tr>\n<tr><td>performance_iterators</a></td><td align=\"right\">Pass <a href=\"profile2.txt\"><i>Profile</i></a></td></tr>\n<tr><td>performance_iterators_base64</a></td><td align=\"right\">Pass <a href=\"profile3.txt\"><i>Profile</i></a></td></tr>\n</table>\n</body>\n</html>\n"
  },
  {
    "path": "doc/pimpl.html",
    "content": "<!doctype HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">\n<html>\n<!--\n(C) Copyright 2002-4 Robert Ramey - http://www.rrsd.com . \nUse, modification and distribution is subject to the Boost Software\nLicense, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\nhttp://www.boost.org/LICENSE_1_0.txt)\n-->\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\n<link rel=\"stylesheet\" type=\"text/css\" href=\"../../../boost.css\">\n<link rel=\"stylesheet\" type=\"text/css\" href=\"style.css\">\n<title>Serialization - PIMPL</title>\n</head>\n<body link=\"#0000ff\" vlink=\"#800080\">\n<table border=\"0\" cellpadding=\"7\" cellspacing=\"0\" width=\"100%\" summary=\"header\">\n  <tr> \n    <td valign=\"top\" width=\"300\"> \n      <h3><a href=\"../../../index.htm\"><img height=\"86\" width=\"277\" alt=\"C++ Boost\" src=\"../../../boost.png\" border=\"0\"></a></h3>\n    </td>\n    <td valign=\"top\"> \n      <h1 align=\"center\">Serialization</h1>\n      <h2 align=\"center\">PIMPL</h2>\n    </td>\n  </tr>\n</table>\n<hr>\nPIMPL is a C++ programming idiom described by Herb Sutter <a href=\"bibliography.html#10\">[10]</a>\nwhich stands for \"Private Implementation\".  It is also referred to as\nthe \"Handle Body Idiom\". Included in this library is a program called \n<a href=\"../example/demo_pimpl.cpp\" target=\"demo_impl_cpp\">demo_pimpl.cpp</a> \nwhich illustrates how this is used. The file \n<a href=\"../example/demo_pimpl_A.cpp\" target=\"demo_impl__Acpp\">demo_pimpl_A.hpp</a>\ncontains the declaration of the A class that hides its implementation\nby including a pointer to struct B that is only defined as a pointer.\n<pre><code>\n// class whose declaration is hidden by a pointer\nstruct B;\n\nstruct A {\n    // class a contains a pointer to a \"hidden\" declaration\n    B *pimpl;\n    template&lt;class Archive&gt;\n    void serialize(Archive &amp; ar, const unsigned int file_version);\n    A();\n};\n</code></pre>\nSerialization of A requires access to the definition of B. But that doesn't mean\nthat it requires the this access from the header file.  Since B is a pointer,\na declaration of class B is sufficient.  The implemenation of the serialization\nof A includes the definition of class B defined in the separately compiled module:\n\n<a href=\"../example/demo_pimpl_A.cpp\" target=\"demo_impl_A_cpp\">demo_pimpl_A.cpp</a>\nby:\n<pre><code>\n#include \"demo_pimpl_A.hpp\"\n\n// \"hidden\" definition of class B\nstruct B {\n    int b;\n    template&lt;class Archive&gt;\n    void serialize(Archive &amp; ar, const unsigned int file_version){\n        ar &amp; b;\n    }\n};\n\nA::A() :\n    pimpl(new B)\n{}\n\nA::~A(){\n    delete pimpl;\n}\n\n// now we can define the serialization for class A\ntemplate&lt;class Archive&gt;\nvoid A::serialize(Archive &amp; ar, const unsigned int file_version){\n    ar &amp; pimpl;\n}\n</code></pre>\nAs described in <a href=\"bibliography.html#10\">[10]</a> this brings the\nfollowing advantages:\n<ul>\n    <li>type \"B\" can be used without using its header.\n    <li>implementation of B can be changed without generating a \n    cascade of recompilations.\n</ul>\nSo, we compile the modules and everything is fine.  However when we\nlink, we get an error.  Two symbols are undefined:\n<pre><code>\nvoid A::serialize(boost::archive::text_oarchive &amp; ar, const unsigned int file_version);\nvoid A::serialize(boost::archive::text_iarchive &amp; ar, const unsigned int file_version);\n</code></pre>\nThe problem is that when compiling the above code, \nthere is no instantiation of the <code style=\"white-space: normal\">serialize</code> template.\nThere can't be as it's not \"known\" what types of archives\nthe serialization is going to be used with.  So these functions are \"missing\"\nwhen an attempt to link is made.  The solution is to explicitly instantiate\nserialization code for those archives which are going to be used.  In this\nexample, including the the following code in any *.cpp file does just that:\n<pre></code>\n#include &lt;boost/archive/text_iarchive.hpp&gt;\n#include &lt;boost/archive/text_oarchive.hpp&gt;\n\ntemplate void A::serialize&lt;boost::archive::text_iarchive&gt;(\n    boost::archive::text_iarchive &amp; ar, \n    const unsigned int file_version\n);\ntemplate void A::serialize&lt;boost::archive::text_oarchive&gt;(\n    boost::archive::text_oarchive &amp; ar, \n    const unsigned int file_version\n);\n</code></pre>\nThe program should now link as well as compile.\n<p>\nThe downside of this is that one has to know which archives are going \nto be used with hidden serializations.  This is an effect of using template\ndriven code.  One can invoke explicitly instantiation for all known templates and\npresume that the linker will exclude unreferenced code.  This should\nwork but is platform dependent.\n<hr>\n<p><i>&copy; Copyright <a href=\"http://www.rrsd.com\">Robert Ramey</a> 2002-2004. \nDistributed under the Boost Software License, Version 1.0. (See\naccompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n</i></p>\n</body>\n</html>\n"
  },
  {
    "path": "doc/private_base.html",
    "content": "<!doctype HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">\n<html>\n<!--\n(C) Copyright 2002-4 Robert Ramey - http://www.rrsd.com . \nUse, modification and distribution is subject to the Boost Software\nLicense, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\nhttp://www.boost.org/LICENSE_1_0.txt)\n-->\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\n<link rel=\"stylesheet\" type=\"text/css\" href=\"../../../boost.css\">\n<link rel=\"stylesheet\" type=\"text/css\" href=\"style.css\">\n<title>Serialization - Private Base Classes</title>\n</head>\n<body link=\"#0000ff\" vlink=\"#800080\">\n<table border=\"0\" cellpadding=\"7\" cellspacing=\"0\" width=\"100%\" summary=\"header\">\n  <tr> \n    <td valign=\"top\" width=\"300\"> \n      <h3><a href=\"../../../index.htm\"><img height=\"86\" width=\"277\" alt=\"C++ Boost\" src=\"../../../boost.png\" border=\"0\"></a></h3>\n    </td>\n    <td valign=\"top\"> \n      <h1 align=\"center\">Serialization</h1>\n      <h2 align=\"center\">Private Base Classes</h2>\n    </td>\n  </tr>\n</table>\n<hr>\nIn many cases, serialization of private or protected base classes present no special problems.\nThis is true for both simple classes and types as well as pointers to those\nclasses and types. That is, the following program compiles and runs exactly as one would expect.\n<pre><code>\n/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// test_private_base.cpp\n\n// (C) Copyright 2009 Eric Moyer - http://www.rrsd.com . \n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n#include &lt;fstream&gt;\n#include &lt;boost/config.hpp&gt;\n#if defined(BOOST_NO_STDC_NAMESPACE)\nnamespace std{ \n    using ::remove;\n}\n#endif\n\n#include &lt;boost/serialization/access.hpp&gt;\n#include &lt;boost/serialization/base_object.hpp&gt;\n#include &lt;boost/serialization/export.hpp&gt;\n\nclass Base {\n    friend class boost::serialization::access;\n    int m_i;\n    template&lt;class Archive&gt;\n    void serialize(Archive &amp; ar, const unsigned int version){\n        ar &amp; BOOST_SERIALIZATION_NVP(m_i);\n    }\nprotected:\n    bool equals(const Base &amp;rhs) const {\n        return m_i == rhs.m_i;\n    }\n    Base(int i = 0) :\n        m_i(i)\n    {}\n};\n\nclass Derived : private Base {\n    friend class boost::serialization::access;\nprivate:\n    Base &amp; base_cast(){\n        return static_cast&lt;Base &amp;&gt;(*this);\n    }\n    template&lt;class Archive&gt;\n    void serialize(Archive &amp; ar, const unsigned int version){\n        ar &amp; BOOST_SERIALIZATION_BASE_OBJECT_NVP(Base);\n    }\npublic:\n    bool operator==(const Derived &amp;rhs) const {\n        return Base::equals(static_cast&lt;const Base &amp;&gt;(rhs));\n    }\n    Derived(int i = 0) :\n        Base(i)\n    {}\n};\n\nint\nmain( int /* argc */, char* /* argv */[] )\n{\n    const char * testfile = boost::archive::tmpnam(NULL);\n\n    // serialize Derived and Base\n    Derived a(1), a1(2);\n    {   \n        test_ostream os(testfile);\n        test_oarchive oa(os);\n        oa &lt;&lt; boost::serialization::make_nvp(\"a\", a);\n    }\n    {\n        test_istream is(testfile, TEST_STREAM_FLAGS);\n        test_iarchive ia(is, TEST_ARCHIVE_FLAGS);\n        ia &gt;&gt; boost::serialization::make_nvp(\"a\", a1);\n    }\n    std::remove(testfile);\n\n    if(a != a1)\n        return 1;\n\n    // serialize Derived and Base\n    Derived *ta = &amp;a;\n    Derived *ta1 = NULL;\n    {   \n        test_ostream os(testfile);\n        test_oarchive oa(os);\n        oa &lt;&lt; boost::serialization::make_nvp(\"ta\", ta);\n    }\n    {\n        test_istream is(testfile, TEST_STREAM_FLAGS);\n        test_iarchive ia(is, TEST_ARCHIVE_FLAGS);\n        ia &gt;&gt; boost::serialization::make_nvp(\"ta\", ta1);\n    }\n    std::remove(testfile);\n    if(*ta != *ta1)\n        return 1;\n\n    return 0;\n}\n</code></pre>\nDifficulties start to occur when the base class is made polymorphic by the designation\nof one or more functions as \"virtual\".  If a class is polymorphic, the library\npresumes that one will want the ability to serialize a derived class through\na pointer to the base class.  Included in the macro\n<code>\nBOOST_SERIALIZATION_BASE_OBJECT_NVP\n</code>\nis code which links derived and base class definitions in tables used to serialize\nderived classes through pointers to a polymorphic base class.  This code requires\nthe ability to invoke\n<code>\nstatic_cast&lt;Base &amp;&gt;(Derived &amp;)\n</code>\nwhich C++ will only permit from within the derived class if the base class is \nprivate or protected. The program will fail to compile with an error message \nindicating invalid cast.\n<p>\nIn order for this\ncode compiler the following alteration must be made:\n<pre><code>\n    template&lt;class Archive&gt;\n    void serialize(Archive &amp; ar, const unsigned int version){\n        //ar &amp; BOOST_SERIALIZATION_BASE_OBJECT_NVP(Base);\n        ar &amp; boost::serialization::make_nvp(\n            \"Base\",\n            static_cast&lt;Base &amp;&gt;(*this)\n        );\n    }\n</code></pre>\nWith this change the program will now compile.\n<p>\nIf we made one of the functions of <code>Base</code> <code>virtual</code>\nin order to use the \"export\" functionality of the serialization library and permit serialization through\na pointer the the base class, we'll be disappointed. Without the ability to\ncast to the base class, we can't use the functionality.\n<hr>\n<p><i>&copy; Copyright <a href=\"http://www.rrsd.com\">Robert Ramey</a> 2015.\nDistributed under the Boost Software License, Version 1.0. (See\naccompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n</i></p>\n</body>\n</html>\n"
  },
  {
    "path": "doc/profile1.txt",
    "content": "Flat profile:\n\nEach sample counts as 0.01 seconds.\n no time accumulated\n\n  %   cumulative   self              self     total           \n time   seconds   seconds    calls  Ts/call  Ts/call  name    \n  0.00      0.00     0.00      200     0.00     0.00  void accumulate<unsigned long>(unsigned int&, unsigned long const&)\n  0.00      0.00     0.00      150     0.00     0.00  _pei386_runtime_relocator\n  0.00      0.00     0.00        1     0.00     0.00  std::ostream::operator<<(void const*)\n  0.00      0.00     0.00        1     0.00     0.00  __divdi3\n\n %         the percentage of the total running time of the\ntime       program used by this function.\n\ncumulative a running sum of the number of seconds accounted\n seconds   for by this function and those listed above it.\n\n self      the number of seconds accounted for by this\nseconds    function alone.  This is the major sort for this\n           listing.\n\ncalls      the number of times this function was invoked, if\n           this function is profiled, else blank.\n \n self      the average number of milliseconds spent in this\nms/call    function per call, if this function is profiled,\n\t   else blank.\n\n total     the average number of milliseconds spent in this\nms/call    function and its descendents per call, if this \n\t   function is profiled, else blank.\n\nname       the name of the function.  This is the minor sort\n           for this listing. The index shows the location of\n\t   the function in the gprof listing. If the index is\n\t   in parenthesis it shows where it would appear in\n\t   the gprof listing if it were to be printed.\n\f\n\t\t     Call graph (explanation follows)\n\n\ngranularity: each sample hit covers 4 byte(s) no time propagated\n\nindex % time    self  children    called     name\n                0.00    0.00     200/200         setvbuf [1286]\n[4]      0.0    0.00    0.00     200         void accumulate<unsigned long>(unsigned int&, unsigned long const&) [4]\n-----------------------------------------------\n                0.00    0.00     150/150         _cygwin_crt0_common@8 [1230]\n[5]      0.0    0.00    0.00     150         _pei386_runtime_relocator [5]\n-----------------------------------------------\n                0.00    0.00       1/1           _lseek64 [1234]\n[6]      0.0    0.00    0.00       1         std::ostream::operator<<(void const*) [6]\n-----------------------------------------------\n                0.00    0.00       1/1           __tcf_1 [1221]\n[7]      0.0    0.00    0.00       1         __divdi3 [7]\n-----------------------------------------------\n                                   2             main [1263]\n[1263]   0.0    0.00    0.00       0+2       main [1263]\n                                   2             main [1263]\n-----------------------------------------------\n\n This table describes the call tree of the program, and was sorted by\n the total amount of time spent in each function and its children.\n\n Each entry in this table consists of several lines.  The line with the\n index number at the left hand margin lists the current function.\n The lines above it list the functions that called this function,\n and the lines below it list the functions this one called.\n This line lists:\n     index\tA unique number given to each element of the table.\n\t\tIndex numbers are sorted numerically.\n\t\tThe index number is printed next to every function name so\n\t\tit is easier to look up where the function in the table.\n\n     % time\tThis is the percentage of the `total' time that was spent\n\t\tin this function and its children.  Note that due to\n\t\tdifferent viewpoints, functions excluded by options, etc,\n\t\tthese numbers will NOT add up to 100%.\n\n     self\tThis is the total amount of time spent in this function.\n\n     children\tThis is the total amount of time propagated into this\n\t\tfunction by its children.\n\n     called\tThis is the number of times the function was called.\n\t\tIf the function called itself recursively, the number\n\t\tonly includes non-recursive calls, and is followed by\n\t\ta `+' and the number of recursive calls.\n\n     name\tThe name of the current function.  The index number is\n\t\tprinted after it.  If the function is a member of a\n\t\tcycle, the cycle number is printed between the\n\t\tfunction's name and the index number.\n\n\n For the function's parents, the fields have the following meanings:\n\n     self\tThis is the amount of time that was propagated directly\n\t\tfrom the function into this parent.\n\n     children\tThis is the amount of time that was propagated from\n\t\tthe function's children into this parent.\n\n     called\tThis is the number of times this parent called the\n\t\tfunction `/' the total number of times the function\n\t\twas called.  Recursive calls to the function are not\n\t\tincluded in the number after the `/'.\n\n     name\tThis is the name of the parent.  The parent's index\n\t\tnumber is printed after it.  If the parent is a\n\t\tmember of a cycle, the cycle number is printed between\n\t\tthe name and the index number.\n\n If the parents of the function cannot be determined, the word\n `<spontaneous>' is printed in the `name' field, and all the other\n fields are blank.\n\n For the function's children, the fields have the following meanings:\n\n     self\tThis is the amount of time that was propagated directly\n\t\tfrom the child into the function.\n\n     children\tThis is the amount of time that was propagated from the\n\t\tchild's children to the function.\n\n     called\tThis is the number of times the function called\n\t\tthis child `/' the total number of times the child\n\t\twas called.  Recursive calls by the child are not\n\t\tlisted in the number after the `/'.\n\n     name\tThis is the name of the child.  The child's index\n\t\tnumber is printed after it.  If the child is a\n\t\tmember of a cycle, the cycle number is printed\n\t\tbetween the name and the index number.\n\n If there are any cycles (circles) in the call graph, there is an\n entry for the cycle-as-a-whole.  This entry shows who called the\n cycle (as parents) and the members of the cycle (as children.)\n The `+' recursive calls entry shows the number of function calls that\n were internal to the cycle, and the calls entry for each member shows,\n for that member, how many times it was called from other members of\n the cycle.\n\n\f\nIndex by function name\n\n   [4] void accumulate<unsigned long>(unsigned int&, unsigned long const&) [7] __divdi3\n   [6] std::ostream::operator<<(void const*) [5] _pei386_runtime_relocator\n"
  },
  {
    "path": "doc/profile2.txt",
    "content": "Flat profile:\n\nEach sample counts as 0.01 seconds.\n  %   cumulative   self              self     total           \n time   seconds   seconds    calls  Ts/call  Ts/call  name    \n100.00      0.01     0.01                             __gnu_cxx::__atomic_add(int volatile*, int)\n  0.00      0.01     0.00       51     0.00     0.00  boost::archive::iterators::transform_width<char*, 6, 8, char>::fill()\n  0.00      0.01     0.00       36     0.00     0.00  boost::archive::iterators::transform_width<__gnu_cxx::__normal_iterator<char*, std::vector<char, std::allocator<char> > >, 8, 6, char>::fill()\n  0.00      0.01     0.00       30     0.00     0.00  std::vector<char, std::allocator<char> >::_M_insert_aux(__gnu_cxx::__normal_iterator<char*, std::vector<char, std::allocator<char> > >, char const&)\n  0.00      0.01     0.00       11     0.00     0.00  boost::archive::iterators::xml_escape<char const*>::fill(char const*&, char const*&)\n  0.00      0.01     0.00        9     0.00     0.00  void test_transform_width<6, 8>(unsigned int)\n  0.00      0.01     0.00        9     0.00     0.00  boost::archive::iterators::xml_unescape<char const*>::drain()\n  0.00      0.01     0.00        5     0.00     0.00  boost::archive::iterators::xml_unescape<char const*>::drain_residue(char const*)\n  0.00      0.01     0.00        2     0.00     0.00  __static_initialization_and_destruction_0(int, int)\n  0.00      0.01     0.00        1     0.00     0.00  void test_xml_escape<char const>(char const*, char const*, unsigned int)\n  0.00      0.01     0.00        1     0.00     0.00  void test_xml_unescape<char const>(char const*, char const*, unsigned int)\n  0.00      0.01     0.00        1     0.00     0.00  void test_stream_iterators<char>(char const*, unsigned int)\n  0.00      0.01     0.00        1     0.00     0.00  test_main(int, char**)\n  0.00      0.01     0.00        1     0.00     0.00  char* std::string::_S_construct<char*>(char*, char*, std::allocator<char> const&, std::forward_iterator_tag)\n  0.00      0.01     0.00        1     0.00     0.00  std::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string<char*>(char*, char*, std::allocator<char> const&)\n\n %         the percentage of the total running time of the\ntime       program used by this function.\n\ncumulative a running sum of the number of seconds accounted\n seconds   for by this function and those listed above it.\n\n self      the number of seconds accounted for by this\nseconds    function alone.  This is the major sort for this\n           listing.\n\ncalls      the number of times this function was invoked, if\n           this function is profiled, else blank.\n \n self      the average number of milliseconds spent in this\nms/call    function per call, if this function is profiled,\n\t   else blank.\n\n total     the average number of milliseconds spent in this\nms/call    function and its descendents per call, if this \n\t   function is profiled, else blank.\n\nname       the name of the function.  This is the minor sort\n           for this listing. The index shows the location of\n\t   the function in the gprof listing. If the index is\n\t   in parenthesis it shows where it would appear in\n\t   the gprof listing if it were to be printed.\n\f\n\t\t     Call graph (explanation follows)\n\n\ngranularity: each sample hit covers 4 byte(s) for 100.00% of 0.01 seconds\n\nindex % time    self  children    called     name\n                                                 <spontaneous>\n[1]    100.0    0.01    0.00                 __gnu_cxx::__atomic_add(int volatile*, int) [1]\n-----------------------------------------------\n                0.00    0.00      51/51          void test_transform_width<6, 8>(unsigned int) [9]\n[5]      0.0    0.00    0.00      51         boost::archive::iterators::transform_width<char*, 6, 8, char>::fill() [5]\n-----------------------------------------------\n                0.00    0.00      36/36          void test_transform_width<6, 8>(unsigned int) [9]\n[6]      0.0    0.00    0.00      36         boost::archive::iterators::transform_width<__gnu_cxx::__normal_iterator<char*, std::vector<char, std::allocator<char> > >, 8, 6, char>::fill() [6]\n-----------------------------------------------\n                0.00    0.00      30/30          void test_transform_width<6, 8>(unsigned int) [9]\n[7]      0.0    0.00    0.00      30         std::vector<char, std::allocator<char> >::_M_insert_aux(__gnu_cxx::__normal_iterator<char*, std::vector<char, std::allocator<char> > >, char const&) [7]\n-----------------------------------------------\n                0.00    0.00      11/11          void test_xml_escape<char const>(char const*, char const*, unsigned int) [13]\n[8]      0.0    0.00    0.00      11         boost::archive::iterators::xml_escape<char const*>::fill(char const*&, char const*&) [8]\n-----------------------------------------------\n                0.00    0.00       9/9           test_main(int, char**) [16]\n[9]      0.0    0.00    0.00       9         void test_transform_width<6, 8>(unsigned int) [9]\n                0.00    0.00      51/51          boost::archive::iterators::transform_width<char*, 6, 8, char>::fill() [5]\n                0.00    0.00      36/36          boost::archive::iterators::transform_width<__gnu_cxx::__normal_iterator<char*, std::vector<char, std::allocator<char> > >, 8, 6, char>::fill() [6]\n                0.00    0.00      30/30          std::vector<char, std::allocator<char> >::_M_insert_aux(__gnu_cxx::__normal_iterator<char*, std::vector<char, std::allocator<char> > >, char const&) [7]\n-----------------------------------------------\n                0.00    0.00       9/9           void test_xml_unescape<char const>(char const*, char const*, unsigned int) [14]\n[10]     0.0    0.00    0.00       9         boost::archive::iterators::xml_unescape<char const*>::drain() [10]\n                0.00    0.00       5/5           boost::archive::iterators::xml_unescape<char const*>::drain_residue(char const*) [11]\n-----------------------------------------------\n                0.00    0.00       5/5           boost::archive::iterators::xml_unescape<char const*>::drain() [10]\n[11]     0.0    0.00    0.00       5         boost::archive::iterators::xml_unescape<char const*>::drain_residue(char const*) [11]\n-----------------------------------------------\n                0.00    0.00       1/2           global constructors keyed to main [38]\n                0.00    0.00       1/2           global destructors keyed to main [35]\n[12]     0.0    0.00    0.00       2         __static_initialization_and_destruction_0(int, int) [12]\n-----------------------------------------------\n                0.00    0.00       1/1           test_main(int, char**) [16]\n[13]     0.0    0.00    0.00       1         void test_xml_escape<char const>(char const*, char const*, unsigned int) [13]\n                0.00    0.00      11/11          boost::archive::iterators::xml_escape<char const*>::fill(char const*&, char const*&) [8]\n-----------------------------------------------\n                0.00    0.00       1/1           test_main(int, char**) [16]\n[14]     0.0    0.00    0.00       1         void test_xml_unescape<char const>(char const*, char const*, unsigned int) [14]\n                0.00    0.00       9/9           boost::archive::iterators::xml_unescape<char const*>::drain() [10]\n-----------------------------------------------\n                0.00    0.00       1/1           test_main(int, char**) [16]\n[15]     0.0    0.00    0.00       1         void test_stream_iterators<char>(char const*, unsigned int) [15]\n                0.00    0.00       1/1           std::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string<char*>(char*, char*, std::allocator<char> const&) [18]\n-----------------------------------------------\n                0.00    0.00       1/1           main [1211]\n[16]     0.0    0.00    0.00       1         test_main(int, char**) [16]\n                0.00    0.00       9/9           void test_transform_width<6, 8>(unsigned int) [9]\n                0.00    0.00       1/1           void test_xml_escape<char const>(char const*, char const*, unsigned int) [13]\n                0.00    0.00       1/1           void test_xml_unescape<char const>(char const*, char const*, unsigned int) [14]\n                0.00    0.00       1/1           void test_stream_iterators<char>(char const*, unsigned int) [15]\n-----------------------------------------------\n                0.00    0.00       1/1           std::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string<char*>(char*, char*, std::allocator<char> const&) [18]\n[17]     0.0    0.00    0.00       1         char* std::string::_S_construct<char*>(char*, char*, std::allocator<char> const&, std::forward_iterator_tag) [17]\n-----------------------------------------------\n                0.00    0.00       1/1           void test_stream_iterators<char>(char const*, unsigned int) [15]\n[18]     0.0    0.00    0.00       1         std::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string<char*>(char*, char*, std::allocator<char> const&) [18]\n                0.00    0.00       1/1           char* std::string::_S_construct<char*>(char*, char*, std::allocator<char> const&, std::forward_iterator_tag) [17]\n-----------------------------------------------\n\n This table describes the call tree of the program, and was sorted by\n the total amount of time spent in each function and its children.\n\n Each entry in this table consists of several lines.  The line with the\n index number at the left hand margin lists the current function.\n The lines above it list the functions that called this function,\n and the lines below it list the functions this one called.\n This line lists:\n     index\tA unique number given to each element of the table.\n\t\tIndex numbers are sorted numerically.\n\t\tThe index number is printed next to every function name so\n\t\tit is easier to look up where the function in the table.\n\n     % time\tThis is the percentage of the `total' time that was spent\n\t\tin this function and its children.  Note that due to\n\t\tdifferent viewpoints, functions excluded by options, etc,\n\t\tthese numbers will NOT add up to 100%.\n\n     self\tThis is the total amount of time spent in this function.\n\n     children\tThis is the total amount of time propagated into this\n\t\tfunction by its children.\n\n     called\tThis is the number of times the function was called.\n\t\tIf the function called itself recursively, the number\n\t\tonly includes non-recursive calls, and is followed by\n\t\ta `+' and the number of recursive calls.\n\n     name\tThe name of the current function.  The index number is\n\t\tprinted after it.  If the function is a member of a\n\t\tcycle, the cycle number is printed between the\n\t\tfunction's name and the index number.\n\n\n For the function's parents, the fields have the following meanings:\n\n     self\tThis is the amount of time that was propagated directly\n\t\tfrom the function into this parent.\n\n     children\tThis is the amount of time that was propagated from\n\t\tthe function's children into this parent.\n\n     called\tThis is the number of times this parent called the\n\t\tfunction `/' the total number of times the function\n\t\twas called.  Recursive calls to the function are not\n\t\tincluded in the number after the `/'.\n\n     name\tThis is the name of the parent.  The parent's index\n\t\tnumber is printed after it.  If the parent is a\n\t\tmember of a cycle, the cycle number is printed between\n\t\tthe name and the index number.\n\n If the parents of the function cannot be determined, the word\n `<spontaneous>' is printed in the `name' field, and all the other\n fields are blank.\n\n For the function's children, the fields have the following meanings:\n\n     self\tThis is the amount of time that was propagated directly\n\t\tfrom the child into the function.\n\n     children\tThis is the amount of time that was propagated from the\n\t\tchild's children to the function.\n\n     called\tThis is the number of times the function called\n\t\tthis child `/' the total number of times the child\n\t\twas called.  Recursive calls by the child are not\n\t\tlisted in the number after the `/'.\n\n     name\tThis is the name of the child.  The child's index\n\t\tnumber is printed after it.  If the child is a\n\t\tmember of a cycle, the cycle number is printed\n\t\tbetween the name and the index number.\n\n If there are any cycles (circles) in the call graph, there is an\n entry for the cycle-as-a-whole.  This entry shows who called the\n cycle (as parents) and the members of the cycle (as children.)\n The `+' recursive calls entry shows the number of function calls that\n were internal to the cycle, and the calls entry for each member shows,\n for that member, how many times it was called from other members of\n the cycle.\n\n\f\nIndex by function name\n\n  [13] void test_xml_escape<char const>(char const*, char const*, unsigned int) [16] test_main(int, char**) [5] boost::archive::iterators::transform_width<char*, 6, 8, char>::fill()\n  [14] void test_xml_unescape<char const>(char const*, char const*, unsigned int) [8] boost::archive::iterators::xml_escape<char const*>::fill(char const*&, char const*&) [1] __gnu_cxx::__atomic_add(int volatile*, int)\n   [9] void test_transform_width<6, 8>(unsigned int) [11] boost::archive::iterators::xml_unescape<char const*>::drain_residue(char const*) [17] char* std::string::_S_construct<char*>(char*, char*, std::allocator<char> const&, std::forward_iterator_tag)\n  [15] void test_stream_iterators<char>(char const*, unsigned int) [10] boost::archive::iterators::xml_unescape<char const*>::drain() [18] std::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string<char*>(char*, char*, std::allocator<char> const&)\n  [12] __static_initialization_and_destruction_0(int, int) (performance_iterators.cpp) [6] boost::archive::iterators::transform_width<__gnu_cxx::__normal_iterator<char*, std::vector<char, std::allocator<char> > >, 8, 6, char>::fill() [7] std::vector<char, std::allocator<char> >::_M_insert_aux(__gnu_cxx::__normal_iterator<char*, std::vector<char, std::allocator<char> > >, char const&)\n"
  },
  {
    "path": "doc/profile3.txt",
    "content": "Flat profile:\n\nEach sample counts as 0.01 seconds.\n no time accumulated\n\n  %   cumulative   self              self     total           \n time   seconds   seconds    calls  Ts/call  Ts/call  name    \n  0.00      0.00     0.00      200     0.00     0.00  boost::archive::iterators::transform_width<char*, 6, 8, char>::fill()\n  0.00      0.00     0.00      150     0.00     0.00  boost::archive::iterators::transform_width<boost::archive::iterators::binary_from_base64<boost::archive::iterators::remove_whitespace<std::_List_iterator<char> >, char>, 8, 6, char>::fill()\n  0.00      0.00     0.00        2     0.00     0.00  __static_initialization_and_destruction_0(int, int)\n  0.00      0.00     0.00        1     0.00     0.00  void test_base64<char>()\n  0.00      0.00     0.00        1     0.00     0.00  std::_List_base<char, std::allocator<char> >::_M_clear()\n\n %         the percentage of the total running time of the\ntime       program used by this function.\n\ncumulative a running sum of the number of seconds accounted\n seconds   for by this function and those listed above it.\n\n self      the number of seconds accounted for by this\nseconds    function alone.  This is the major sort for this\n           listing.\n\ncalls      the number of times this function was invoked, if\n           this function is profiled, else blank.\n \n self      the average number of milliseconds spent in this\nms/call    function per call, if this function is profiled,\n\t   else blank.\n\n total     the average number of milliseconds spent in this\nms/call    function and its descendents per call, if this \n\t   function is profiled, else blank.\n\nname       the name of the function.  This is the minor sort\n           for this listing. The index shows the location of\n\t   the function in the gprof listing. If the index is\n\t   in parenthesis it shows where it would appear in\n\t   the gprof listing if it were to be printed.\n\f\n\t\t     Call graph (explanation follows)\n\n\ngranularity: each sample hit covers 4 byte(s) no time propagated\n\nindex % time    self  children    called     name\n                0.00    0.00     200/200         void test_base64<char>() [7]\n[4]      0.0    0.00    0.00     200         boost::archive::iterators::transform_width<char*, 6, 8, char>::fill() [4]\n-----------------------------------------------\n                0.00    0.00     150/150         void test_base64<char>() [7]\n[5]      0.0    0.00    0.00     150         boost::archive::iterators::transform_width<boost::archive::iterators::binary_from_base64<boost::archive::iterators::remove_whitespace<std::_List_iterator<char> >, char>, 8, 6, char>::fill() [5]\n-----------------------------------------------\n                0.00    0.00       1/2           global constructors keyed to main [27]\n                0.00    0.00       1/2           global destructors keyed to main [24]\n[6]      0.0    0.00    0.00       2         __static_initialization_and_destruction_0(int, int) [6]\n-----------------------------------------------\n                0.00    0.00       1/1           main [1156]\n[7]      0.0    0.00    0.00       1         void test_base64<char>() [7]\n                0.00    0.00     200/200         boost::archive::iterators::transform_width<char*, 6, 8, char>::fill() [4]\n                0.00    0.00     150/150         boost::archive::iterators::transform_width<boost::archive::iterators::binary_from_base64<boost::archive::iterators::remove_whitespace<std::_List_iterator<char> >, char>, 8, 6, char>::fill() [5]\n                0.00    0.00       1/1           std::_List_base<char, std::allocator<char> >::_M_clear() [8]\n-----------------------------------------------\n                0.00    0.00       1/1           void test_base64<char>() [7]\n[8]      0.0    0.00    0.00       1         std::_List_base<char, std::allocator<char> >::_M_clear() [8]\n-----------------------------------------------\n\n This table describes the call tree of the program, and was sorted by\n the total amount of time spent in each function and its children.\n\n Each entry in this table consists of several lines.  The line with the\n index number at the left hand margin lists the current function.\n The lines above it list the functions that called this function,\n and the lines below it list the functions this one called.\n This line lists:\n     index\tA unique number given to each element of the table.\n\t\tIndex numbers are sorted numerically.\n\t\tThe index number is printed next to every function name so\n\t\tit is easier to look up where the function in the table.\n\n     % time\tThis is the percentage of the `total' time that was spent\n\t\tin this function and its children.  Note that due to\n\t\tdifferent viewpoints, functions excluded by options, etc,\n\t\tthese numbers will NOT add up to 100%.\n\n     self\tThis is the total amount of time spent in this function.\n\n     children\tThis is the total amount of time propagated into this\n\t\tfunction by its children.\n\n     called\tThis is the number of times the function was called.\n\t\tIf the function called itself recursively, the number\n\t\tonly includes non-recursive calls, and is followed by\n\t\ta `+' and the number of recursive calls.\n\n     name\tThe name of the current function.  The index number is\n\t\tprinted after it.  If the function is a member of a\n\t\tcycle, the cycle number is printed between the\n\t\tfunction's name and the index number.\n\n\n For the function's parents, the fields have the following meanings:\n\n     self\tThis is the amount of time that was propagated directly\n\t\tfrom the function into this parent.\n\n     children\tThis is the amount of time that was propagated from\n\t\tthe function's children into this parent.\n\n     called\tThis is the number of times this parent called the\n\t\tfunction `/' the total number of times the function\n\t\twas called.  Recursive calls to the function are not\n\t\tincluded in the number after the `/'.\n\n     name\tThis is the name of the parent.  The parent's index\n\t\tnumber is printed after it.  If the parent is a\n\t\tmember of a cycle, the cycle number is printed between\n\t\tthe name and the index number.\n\n If the parents of the function cannot be determined, the word\n `<spontaneous>' is printed in the `name' field, and all the other\n fields are blank.\n\n For the function's children, the fields have the following meanings:\n\n     self\tThis is the amount of time that was propagated directly\n\t\tfrom the child into the function.\n\n     children\tThis is the amount of time that was propagated from the\n\t\tchild's children to the function.\n\n     called\tThis is the number of times the function called\n\t\tthis child `/' the total number of times the child\n\t\twas called.  Recursive calls by the child are not\n\t\tlisted in the number after the `/'.\n\n     name\tThis is the name of the child.  The child's index\n\t\tnumber is printed after it.  If the child is a\n\t\tmember of a cycle, the cycle number is printed\n\t\tbetween the name and the index number.\n\n If there are any cycles (circles) in the call graph, there is an\n entry for the cycle-as-a-whole.  This entry shows who called the\n cycle (as parents) and the members of the cycle (as children.)\n The `+' recursive calls entry shows the number of function calls that\n were internal to the cycle, and the calls entry for each member shows,\n for that member, how many times it was called from other members of\n the cycle.\n\n\f\nIndex by function name\n\n   [7] void test_base64<char>() [5] boost::archive::iterators::transform_width<boost::archive::iterators::binary_from_base64<boost::archive::iterators::remove_whitespace<std::_List_iterator<char> >, char>, 8, 6, char>::fill() [8] std::_List_base<char, std::allocator<char> >::_M_clear()\n   [6] __static_initialization_and_destruction_0(int, int) (performance_iterators_base64.cpp) [4] boost::archive::iterators::transform_width<char*, 6, 8, char>::fill()\n"
  },
  {
    "path": "doc/rationale.html",
    "content": "<!doctype HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">\n<html>\n<!--\n(C) Copyright 2002-4 Robert Ramey - http://www.rrsd.com . \nUse, modification and distribution is subject to the Boost Software\nLicense, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\nhttp://www.boost.org/LICENSE_1_0.txt)\n-->\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\n<link rel=\"stylesheet\" type=\"text/css\" href=\"../../../boost.css\">\n<link rel=\"stylesheet\" type=\"text/css\" href=\"style.css\">\n<title>Serialization - Rationale</title>\n</head>\n<body link=\"#0000ff\" vlink=\"#800080\">\n<table border=\"0\" cellpadding=\"7\" cellspacing=\"0\" width=\"100%\" summary=\n    \"header\">\n  <tr> \n    <td valign=\"top\" width=\"300\"> \n      <h3><a href=\"http://www.boost.org\"><img height=\"86\" width=\"277\" alt=\"C++ Boost\" src=\"../../../boost.png\" border=\"0\"></a></h3>\n    </td>\n    <td valign=\"top\"> \n      <h1 align=\"center\">Serialization</h1>\n      <h2 align=\"center\">Rationale</h2>\n    </td>\n  </tr>\n</table>\n<hr>\n<dl class=\"index\">\n  <dt><a href=\"#serialization\">The term \"serialization\" is preferred to \"persistence\"</a></dt>\n  <dt><a href=\"#archives\">Archives are not streams</a></dt>\n  <dt><a href=\"#strings\">Strings are treated specially in text archives</a></dt>\n  <dt><a href=\"#typeid\"><code style=\"white-space: normal\">typeid</code> information is not included in archives</a></dt>\n  <!--\n  <dt><a href=\"#footnotes\">Footnotes</a></dt>\n  -->\n</dl>\n<h2><a name=\"serialization\"></a>The term \"serialization\" is preferred to \"persistence\"</h2>\n<p>\nI found that persistence is often used to refer\nto something quite different. Examples are storage of class\ninstances (objects) in database schema <a href=\"bibliography.html#4\">[4]</a>\nThis library will be useful in other contexts besides implementing persistence. The\nmost obvious case is that of marshalling data for transmission to another system.\n<h2><a name=\"archives\"></a>Archives are not streams</h2>\n<p>\nArchive classes are <strong>NOT</strong> derived from\nstreams even though they have similar syntax rules.\n<ul>\n    <li>Archive classes are not kinds of streams though they\n    are implemented in terms of streams. This\n    distinction is addressed in <a href=\"bibliography.html#5\">[5]</a> item number 41.\n    <li>We don't want users to insert/extract&nbsp;data\n    directly into/from &nbsp;the stream .&nbsp; This could\n    create a corrupted archive. Were archives\n    derived from streams, it would possible to\n    accidentally do this. So archive classes\n    only define operations which are safe and necessary.\n    <li>The usage of streams to implement the archive classes that\n    are included in the library is merely convenient - not necessary.\n    Library users may well want to define their own archive format\n    which doesn't use streams at all.\n</ul>\n<h2><a name=\"primitives\"></a>Archive Members are Templates \nRather than Virtual Functions</h2>\nThe previous version of this library defined virtual functions for all\nprimitive types.  These were overridden by each archive class.  There were\ntwo issues related to this:\n</ul>\n    <li>Some disliked virtual functions because of the added execution time\n    overhead.\n    <li>This caused implementation difficulties since the set of primitive\n    data types varies between platforms.  Attempting to define the correct\n    set of virtual functions, (think <code style=\"white-space: normal\">long long</code>, \n    <code style=\"white-space: normal\">__int64</code>, \n    etc.) resulted in messy and fragile code.  Replacing this with templates\n    and letting the compiler generate the code for the primitive types actually\n    used, resolved this problem.  Of course, the ripple effects of this design\n    change were significant, but in the end led to smaller, faster, more\n    maintainable code.\n</ul>\n<h2><a name=\"strings\"></a><code style=\"white-space: normal\">std::strings</code> are treated specially in text files</h2>\n<p>\nTreating strings as STL vectors would result in minimal code size. This was\nnot done because:\n<ul>\n     <li>In text archives it is convenient to be able to view strings.  Our text\n     implementation stores single characters as integers.  Storing strings\n     as a vector of characters would waste space and render the archives\n     inconvenient for debugging.\n     <li>Stream implementations have special functions for <code style=\"white-space: normal\">std::string</code>\n     and <code style=\"white-space: normal\">std::wstring</code>.\n     Presumably they optimize appropriately.\n     <li>Other specializations of <code style=\"white-space: normal\">std::basic_string</code> are in fact handled\n     as vectors of the element type.\n</ul>\n</p>\n<h2><a name=\"typeid\"></a><code style=\"white-space: normal\">typeid</code> information is not included in archives</h2>\n<p>\nI originally thought that I had to save the name of the class specified by <code style=\"white-space: normal\">std::type_of::name()</code>\nin the archive. This created difficulties as <code style=\"white-space: normal\">std::type_of::name()</code> is not portable and\nnot guaranteed to return the class name. This makes it almost useless for implementing\narchive portability.  This topic is explained in much more detail in\n<a href=\"bibliography.html#6\">[7] page 206</a>. It turned out that it was not necessary.\nAs long as objects are loaded in the exact sequence as they were saved, the type\nis available when loading.  The only exception to this is the case of polymorphic\npointers never before loaded/saved.  This is addressed with the <code style=\"white-space: normal\">register_type()</code>\nand/or <code style=\"white-space: normal\">export</code> facilities described in the reference.  \nIn effect, <code style=\"white-space: normal\">export</code> generates a portable equivalent to\n<code style=\"white-space: normal\">typeid</code> information.\n\n<!--\n<h2><a name=\"footnotes\"></a>Footnotes</h2>\n<dl>\n  <dt><a name=\"footnote1\" class=\"footnote\">(1)</a> {{text}}</dt>\n  <dt><a name=\"footnote2\" class=\"footnote\">(2)</a> {{text}}</dt>\n</dl>\n-->\n<hr>\n<p><i>&copy; Copyright <a href=\"http://www.rrsd.com\">Robert Ramey</a> 2002-2004. \nDistributed under the Boost Software License, Version 1.0. (See\naccompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n</i></p>\n</body>\n</html>\n"
  },
  {
    "path": "doc/reference.html",
    "content": "﻿<!doctype HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">\n<html>\n<!--\n(C) Copyright 2002-4 Robert Ramey - http://www.rrsd.com . \nUse, modification and distribution is subject to the Boost Software\nLicense, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\nhttp://www.boost.org/LICENSE_1_0.txt)\n-->\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\n<link rel=\"stylesheet\" type=\"text/css\" href=\"../../../boost.css\">\n<link rel=\"stylesheet\" type=\"text/css\" href=\"style.css\">\n<title>Serialization - Serialization of Classes</title>\n</head>\n<body link=\"#0000ff\" vlink=\"#800080\">\n<table border=\"0\" cellpadding=\"7\" cellspacing=\"0\" width=\"100%\" summary=\"header\">\n  <tr> \n    <td valign=\"top\" width=\"300\"> \n      <h3><a href=\"../../../index.htm\"><img height=\"86\" width=\"277\" alt=\"C++ Boost\" src=\"../../../boost.png\" border=\"0\"></a></h3>\n    </td>\n    <td valign=\"top\"> \n      <h1 align=\"center\">Serialization</h1>\n      <h2 align=\"center\">Serializable Concept</h2>\n    </td>\n  </tr>\n</table>\n<hr>\n<dl class=\"page-index\">\n  <dt><a href=\"archives.html\">Archive Concepts</a>\n  <dt><a href=\"serialization.html\">Serializable Concept</a>\n  <dt><a href=\"special.html\">Special Considerations</a>\n  <dt><a href=\"archive_reference.html\">Archive Class Reference</a>\n  <dt><a href=\"implementation.html\">Implementation Notes</a>\n</dl>\n\n<hr>\n<p><i>&copy; Copyright <a href=\"http://www.rrsd.com\">Robert Ramey</a> 2002-2004. \nDistributed under the Boost Software License, Version 1.0. (See\naccompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n</i></p>\n</body>\n</html>"
  },
  {
    "path": "doc/release.html",
    "content": "<!doctype HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">\n<html>\n<!--\n(C) Copyright 2002-4 Robert Ramey - http://www.rrsd.com . \nUse, modification and distribution is subject to the Boost Software\nLicense, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\nhttp://www.boost.org/LICENSE_1_0.txt)\n-->\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\n<link rel=\"stylesheet\" type=\"text/css\" href=\"../../../boost.css\">\n    <link rel=\"stylesheet\" type=\"text/css\" href=\"style.css\">\n        <title>Serialization - Release Notes</title>\n</head>\n<body link=\"#0000ff\" vlink=\"#800080\">\n<table border=\"0\" cellpadding=\"7\" cellspacing=\"0\" width=\"100%\" summary=\"header\">\n    <tr>\n        <td valign=\"top\" width=\"300\">\n            <h3>\n                <a href=\"../../../index.htm\"><img height=\"86\" width=\"277\" alt=\"C++ Boost\" src=\"../../../boost.png\" border=\"0\"></a></h3>\n        </td>\n        <td valign=\"top\">\n            <h1 align=\"center\">\n                Serialization</h1>\n            <h2 align=\"center\">\n                Release Notes</h2>\n        </td>\n    </tr>\n</table>\n<hr>\n<dl class=\"index\">\n    <dt><a href=\"#differences_1_59\">Differences from version 1.58</a></dt>\n    <dt><a href=\"#differences_1_58\">Differences from version 1.48</a></dt>\n    <dt><a href=\"#differences_1_45\">Differences from version 1.45</a></dt> \n    <dt><a href=\"#differences_1_43\">Differences from version 1.43</a></dt> \n    <dt><a href=\"#differences_1_42\">Differences from version 1.42</a></dt> \n    <dt><a href=\"#differences_1_41\">Differences from version 1.41</a></dt> \n    <dt><a href=\"#differences_1_40\">Differences from version 1.40</a></dt> \n    <dt><a href=\"#differences_1_39\">Differences from version 1.39</a></dt> \n    <dt><a href=\"#differences_1_37\">Differences from version 1.37</a></dt> \n    <dt><a href=\"#differences_1_35\">Differences from version 1.35</a></dt>\n    <dt><a href=\"#differences_1_34\">Differences from version 1.34</a></dt> \n    <dt><a href=\"#differences_1_33\">Differences from version 1.33</a></dt> \n    <dt><a href=\"#differences_1_32\">Differences from version 1.32</a></dt>\n    <dt><a href=\"#todo\">Pending Issues</a></dt>\n</dl>\nAs of this writing, there are no known bugs. However, due to compiler/library \nquirks and or bugs, some tests fail with some combinations of compilers and \nlibraries.\n<h2><a name=\"differences_1_59\"></a>Differences from Boost 1.58</h2>\n<ul>\n<li>Eliminated support for Borland compilers and Microsoft compilers prior to version\n7.1.\n<li>Eliminated support for compilers which do not support Partial Function Template\nOrdering (pfto).\n<li>Added support for \"visibility hidden\" for GCC compilers.  Shared libraries\nwill only expose symbols actually needed rather than all sympols in the library.  This\nshould result in smaller shared libraries which are faster to load.\n</ul>\n<h2><a name=\"differences_1_58\"></a>Differences from Boost 1.48</h2>\n<ul>\n<li>Added support for C++11 types such as std::shared_ptr, std::array, and others.\n<li>Implemented the concept of a \"Helper\" which can be used to implement serialization of types which are otherwise not serializable.\"\n<li>Made library compatible with C++11,  Compatibility with C++03 has been maintained.\n</ul>\n<h2><a name=\"differences_1_45\"></a>Differences from Boost 1.45</h2>\nSince the release of version 1.42, it has been discovered that binary\narchives created by versions 1.42-1.44 cannot always be read by the\nrecent binary archive code.  Work has proceeded in detecting the source\nof these anomolies and those which have been reported with test cases\nhave been fixed.  As of this writing, it is not known whether all\nbinary archives created with these versions can be loaded.\n<h2><a name=\"differences_1_43\"></a>Differences from Boost 1.43</h2>\n<ul>\n    <li>fixed bug in the serialization of virtual base classes.  Due\n    to heroic efforts by Takatoshi Kondo.\n    <li>Native binary archives created under versions 1.42 and 1.43\n    suffer from a serious problem.  It's likely they won't be readable\n    by this latest version. This due to the fact that 1.42 made some\n    changes in the binary format of some types.  Normally this could\n    be addressed by detecting the library version number written into\n    the archive header.  Unfortunately, this library version number\n    was not incremented at 1.42 as it should have been.  So now we have\n    two different binary archive versions with the same library version\n    number.\n    <p>\n    This has been addressed by including a small utility in the example\n    directory named fix_six.cpp.  This should be run with the command line<br>\n    <code><pre>\n    fix_six &lt;file name&gt;\n    </pre></code>\n    This will assign 7 to the library version number of the archive. This\n    fix will need to ba applied to native binary archives created with\n    boost versions 1.42 and 1.43.\n</ul>\n<h2><a name=\"differences_1_42\"></a>Differences from Boost 1.42</h2>\n<ul>\n    <li>fixed failure of shared_ptr serialization when serializing pointers\ncreated from enable_shared_from_this.\n    <li>added example for a simple archive which can be used as a debug log.\nThis example illustrates the implemenation of the archive concept to aid\nunderstanding required to create one's own archive classes. The resulting\narchive is useful for debugging in that it only 160 lines of code and is\nheader only - that is, it doesn't required linking to the serialization library.\n    <li>replaced example used to show how to derive from an existing archive.\nThis example creates an XML archive class which doesn't include serialization\ntraits such as class_id, class_version, etc.  It might be useful for exporting\none's class information to osme XML processor and/or debugging programs.\n    <li>compile time warnings have been implemented to detect practices which\n    though correct, will result in operation or side effects different than\n    a user probably intends.\n    <li>Some memory leaks associated with void_cast have been fixed.\n</ul>\n<h2><a name=\"differences_1_41\"></a>Differences from Boost 1.41</h2>\n<ul>\n    <li>adjustments have been made to minimize compile time warnings.\n    <li>compile time warnings have been implemented to detect practices which\n    though correct, will result in operation or side effects different than\n    a user probably intends.\n    <li>Some memory leaks associated with void_cast have been fixed.\n</ul>\n<h2><a name=\"differences_1_40\"></a>Differences from Boost 1.40</h2>\nThis library has been tested against Boost version 1.39 and 1.40.\n<p>\n    Changes have been made to archive classes included with the library. Users who \n    have used these a guide to making their own archive classes will find that \n    these will likely no longer compile. This can be remedied by making the \n    following changes in the code which instantiates these archive classes.\n</p>\nOld Code:<br>\n<code><pre>\n...\n#include &lt;boost/archive/impl/archive_pointer_iserializer.ipp&gt;\n...\ntemplate class detail::archive_pointer_iserializer&lt;naked_text_iarchive&gt; ;\n...\ntemplate class detail::archive_pointer_iserializer&lt;text_iarchive&gt; ;\n</pre></code>should be replaced with this new code: <code><pre>\n#include &lt;boost/archive/impl/archive_serializer_map.ipp&gt;\n...\ntemplate class detail::archive_serializer_map&lt;naked_text_iarchive&gt; ;\n...\ntemplate class detail::archive_serializer_map&lt;text_iarchive&gt; ;\n</pre></code>\n<!--\n<p>\nThe serialization library uses the boost spirit package to load XML archives.\nWe have found that all tests pass using spirit 1.6x. Spirit 1.8 and higher does not work with\nolder compilers - specifically MSVC 6, Borland and GCC < 3.0.\nIf you are using one of these compilers, you may download a version\nof spirit 1.6 <a href=\"http://spirit.sourceforge.net/index.php?doc=download/index.html\">here</a>.\nTo use this downloaded version rather than the one included with boost,\nset an environmental variable SPIRIT_ROOT to be equal to the root \ndirectory where the downloaded copy of spirit has been placed. E. G.\n<pre><code>\nset SPIRIT_ROOT=c:/spirit16\n</code></pre>\nIf you're not using bjam and the Jamfile to build the library, be sure that\nthe directory which contains the version of spirit you plan to use is placed\nat the front of the list of include paths.\n-->\n<h2><a name=\"differences_1_39\"></a>Differences from Boost 1.39</h2>\n<ul>\n    <li>\n        It is now possible to serialize an object through a pointer to a class which \n        implements its own <code style=\"white-space: normal\">new/delete</code>\n    operators. This functionaly is not available on some compilers.\n    <li>\n    serialization of polymorphic objects has been sped up considerably.\n</ul>\nAs of this writing, all bug reports filed as TRAK tickets have been addressed. \nThere are some TRAK tickets pending which would best be described as feature \nrequests. See <a href=\"#todo\">Pending Issues</a>.\n<h2><a name=\"differences_1_37\"></a>Differences from Boost 1.37</h2>\nThere are no new features in this version. As of this writing, all bug reports \nfiled as TRAK tickets have been addressed. There are some TRAK tickets pending \nwhich would best be described as feature requests. See <a href=\"#todo\">Pending \n    Issues</a>.\n<h2><a name=\"differences_1_36\"></a>Differences from Boost 1.36</h2>\nThere are no new features in this version. As of this writing, all bug reports \nfiled as TRAK tickets have been addressed.\n<h2><a name=\"differences_1_35\"></a>Differences from Boost 1.35</h2>\n<ul>\n    <li>\n    The library is now thread safe. That is, multiple archives can be open in \n    different threads. This has been implmented with a lock-free algorithm to avoid \n    any performance bottlenecks.\n    <li>\n    Serialization of types defined in shared libraries is now supported. shared \n    libraries (DLLS) can be loaded/unloaded dynamically at runtime. This includes \n    the serialization of instances of abstract base classes so that a program can \n    be written so as to be compatible with as yet undefined and un-implemented \n    code.\n    <li>\n    The extended type info system has been enhanced to in order to implement the \n    above. It is now a general purpose system for creating and casting of types \n    about which is only known a string ID and an abstract base class.\n    <li>\n    All bug reports filed as TRAK tickets have been addressed.\n    <li>\n    As of this writing, the library will fail build on older compilers such as MSVC \n    before version 7.1 and older versions of Borland compilers. This might or might \n    not change in the future.\n</ul>\n<h2><a name=\"differences_1_34\"></a>Differences from Boost 1.34</h2>\n<ul>\n    <li>\n    Enhanced support for fast serialization for native binary archives. By Mattias \n    Troyer.\n    <li>\n    Improved implementation of \"export\" functionality. Removes header ordering \n    requirement and eliminates the maintenance of a pre-determined list of \"known \n    archives\" By David Abrahams.\n    <li>\n    Improved support for STLPort.\n</ul>\n<h2><a name=\"differences_1_33\"></a>Differences from Boost 1.33</h2>\n<ul>\n    <li>\n        Native Binary archives use the <code style=\"white-space: normal\">std::streambuf</code>\n    interface. This should result in noticeably faster execution in many cases.\n</ul>\n<h2><a name=\"differences_1_32\"></a>Differences from Boost 1.32</h2>\n<ul>\n    <li>\n        Dynamic Linking Library (DLLs and shared libraries) for platforms which support \n        them. See <a href=\"../../../more/getting_started/windows.html#auto-linking\">Automatic \n            Linking on Windows</a>.\n    <li>\n    Implementation of auto-link for compilers which can support this.\n    <li>\n        Better support for <em>Argument Dependent Lookup</em>\n    and two-phase lookup. This results in simpler rules regarding the placing of \n    serialization specializations namespaces.\n    <li>\n    Enhanced documentation to help explain usage of the above.\n    <li>\n    Adjustments to improve support for less conformant compilers.\n    <li>\n        Improved <code>const</code> correctness for save/load operators. Note that this \n        may produce compile time errors in code which compiled without problem in \n        earlier boost releases. In most cases the fix is trivial. In other cases, code \n        should be scrutinized to be sure that it doesn't use the serialization system \n        in a way which may introduce subtle bugs in to the program. A fuller \n        explanation of this issue can be found <a target=\"detail\" href=\"traits.html#tracking\">\n            here</a>.\n    <li>\n        A new implementation of serialization for <code style=\"white-space: normal\">shared_ptr&lt;T&gt;</code>. \n        This is compatible with public interface of <code style=\"white-space: normal\">shared_ptr&lt;T&gt;</code>\n        so it should be more robust and not have to change in the future. The \n        implementation optionally includes code to load <code style=\"white-space: normal\">shared_ptr&lt;T&gt;</code>\n        stored in archives created with boost 1.32. This code is stored in 'he header: <code style=\"white-space: normal\">\n            boost/serialization/shared_ptr_132.hpp</code>. If your application needs to \n        load archives created with boost 1.32 libraries, include the above header \n        before each inclusion of <code style=\"white-space: normal\">boost/serialization/shared_ptr.hpp</code>.\n    <li>\n    More compilers tested and supported.\n    <li>\n    Miscellaneous bug fixes.\n</ul>\n<h2><a name=\"todo\"></a>Pending issues</h2>\n<ul>\n    <li>\n    Rvalues cannot be serialized. It would be possible to implement this for \n    untracked types, but this has not been done.\n    <li>\n    Pointers to pointers cannot currently be serialized\n    <li>\n        It's possible that <code style=\"white-space: normal\">std::string</code> and <code style=\"white-space: normal\">\n            std::wstring</code>\n    contain characters such as '\\0' and -1 (EOF) which cannot be rendered in text \n    and XML archives without an escape mechanism. Currently there is no such escape \n    mechanism implemented.\n    <li>\n        A subtle error in the implementation of serializaton of <code style=\"white-space: normal\">\n            std::map</code> is fixed in this version. Unfortunately, the fix breaks \n        serialization of <code style=\"white-space: normal\">std::map</code>\n    for those compilers which do not support partial template specialization. Also, \n    types which contain pointers or tracked types might not work correctly.\n    <li>\n        Serialization of virtual base classes relies upon RTTI.  It will fail when used on\n        systems which don't have RTTI enabled.\n</ul>\n<p>\n    Aside from the above, there are a number of issues related to specific \n    platforms. These are listed in <a href=\"implementation.html#othercompilerissues\">Specific \n        Compiler/Library Issues</a>.\n    <hr>\n<p>\n    <i>&copy; Copyright <a href=\"http://www.rrsd.com\">Robert Ramey</a> 2002-2009. \n        Distributed under the Boost Software License, Version 1.0. (See accompanying \n        file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) </i>\n</p>\n</body>\n</html>\n"
  },
  {
    "path": "doc/serialization.html",
    "content": "<!doctype HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">\n<html>\n<!--\n(C) Copyright 2002-4 Robert Ramey - http://www.rrsd.com . \nUse, modification and distribution is subject to the Boost Software\nLicense, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\nhttp://www.boost.org/LICENSE_1_0.txt)\n-->\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\n<link rel=\"stylesheet\" type=\"text/css\" href=\"../../../boost.css\">\n<link rel=\"stylesheet\" type=\"text/css\" href=\"style.css\">\n<title>Serialization - Serialization of Classes</title>\n</head>\n<body link=\"#0000ff\" vlink=\"#800080\">\n<table border=\"0\" cellpadding=\"7\" cellspacing=\"0\" width=\"100%\" summary=\"header\">\n  <tr> \n    <td valign=\"top\" width=\"300\"> \n      <h3><a href=\"../../../index.htm\"><img height=\"86\" width=\"277\" alt=\"C++ Boost\" src=\"../../../boost.png\" border=\"0\"></a></h3>\n    </td>\n    <td valign=\"top\"> \n      <h1 align=\"center\">Serialization</h1>\n      <h2 align=\"center\">Serializable Concept</h2>\n    </td>\n  </tr>\n</table>\n<hr>\n<dl class=\"page-index\">\n  <dt><a href=\"#primitiveoperators\">Primitive Types</a>\n  <dt><a href=\"#classoperators\">Class Types</a>\n  <dl class=\"page-index\">\n    <dt><a href=\"#member\">Member Function</a>\n    <dt><a href=\"#free\">Free Function</a>\n    <dl class=\"page-index\">\n      <dt><a href=\"#namespaces\">Namespaces for Free Function Overrides</a>\n    </dl>\n    <dt><a href=\"#classmembers\">Class Members</a>\n    <dl class=\"page-index\">\n      <dt><a href=\"#base\">Base Classes</a>\n      <dt><a href=\"#const\"><code style=\"white-space: normal\">const</code> Members</a>\n      <dt><a href=\"#templates\">Templates</a>\n    </dl>\n    <dt><a href=\"#versioning\">Versioning</a>\n    <dt><a href=\"#splitting\">Splitting <code style=\"white-space: normal\">serialize</code> into \n      <code style=\"white-space: normal\">save/load</code></a>\n      <dl class=\"page-index\">\n        <dt><a href=\"#splittingmemberfunctions\">Member Functions</a>\n        <dt><a href=\"#splittingfreefunctions\">Free Functions</a>\n      </dl>\n  </dl>\n  <dt><a href=\"#pointeroperators\">Pointers</a>\n    <dl class=\"page-index\">\n      <dt><a href=\"#constructors\">Non-Default Constructors</a>\n      <dt><a href=\"#derivedpointers\">Pointers to Objects of Derived Classes</a>\n      <dl class=\"page-index\">\n        <dt><a href=\"#registration\">Registration</a>\n        <dt><a href=\"#export\">Export</a>\n        <dt><a href=\"#instantiation\">Instantiation</a>\n        <dt><a href=\"#selectivetracking\">Selective Tracking</a>\n        <dt><a href=\"#runtimecasting\">Runtime Casting</a>\n      </dl>\n    </dl>\n  <dt><a href=\"#references\">References</a>\n  <dt><a href=\"#arrays\">Arrays</a>\n  <dt><a href=\"traits.html\">Class Serialization Traits</a>\n  <dt><a href=\"wrappers.html\">Serialization Wrappers</a>\n  <dt><a href=\"#models\">Models - Serialization Implementations Included in the Library</a>\n</dl>\n\nA type <code style=\"white-space: normal\">T</code> is <strong>Serializable</strong> \nif and only if one of the following is true:\n<ul>\n  <li>it is a primitive type.<br>\n    By <i>primitive type</i> we mean a C++ built-in type and <i>ONLY</i>\n    a C++ built-in type. Arithmetic (including characters), bool, enum are primitive types.\n    Below in <a target=\"detail\" href=\"traits.html#Traits\">serialization traits</a>,\n    we define a \"primitive\" implementation level in a different way for a \n    different purpose.  This can be a source of confusion.\n  <li>It is a class type and one of the following has been declared according\n    to the prototypes detailed below:\n    <ul>\n    <li>a class member function <code style=\"white-space: normal\">serialize</code>\n    <li>a global function <code style=\"white-space: normal\">serialize</code>\n    </ul>\n  <li>it is a pointer to a <strong>Serializable</strong> type.\n  <li>it is a reference to a <strong>Serializable</strong> type.\n  <li>it is a native C++ Array of <strong>Serializable</strong> type.\n</ul>\n\n<h2><a name=\"primitiveoperators\">Primitive Types</a></h2>\nThe template operators &amp;, &lt;&lt;, and &gt;&gt; of the archive classes \ndescribed above will generate code to save/load all primitive types\nto/from an archive.  This code will usually just add the\ndata to the archive according to the archive format.\nFor example, a four byte integer is appended to a binary archive\nas 4 binary bytes while a to a text archive it would be \nrendered as a space followed by a string representation.\n\n<h2><a name=\"classoperators\">Class Types</a></h2>\nFor class/struct types, the template operators &amp;, &lt;&lt;, and &gt;&gt;\nwill generate code that invokes the programmer's serialization code for the\nparticular data type.  There is no default.  An attempt to serialize a\nclass/struct for which no serialization has been explicitly specified\nwill result in a compile time error.  The serialization of a class can\nbe specified via either a class member function or a free function which\ntakes a reference to an instance of the class as an argument.\n\n<h3><a name=\"member\">Member Function</a></h3>\nThe serialization library invokes the following code to save or load a class instance\nto/from and archive.\n<pre><code>\ntemplate&lt;class Archive, class T&gt;\ninline void serialize(\n    Archive &amp; ar, \n    T &amp; t, \n    const unsigned int file_version\n){\n    // invoke member function for class T\n    t.serialize(ar, file_version);\n}\n</code></pre>\nThat is, the default definition of template <code style=\"white-space: normal\">serialize</code> \npresumes the existence of a class member function template of the following \nsignature:\n<pre><code>\ntemplate&lt;class Archive&gt;\nvoid serialize(Archive &amp;ar, const unsigned int version){\n    ...\n}\n</code></pre>\nIf such a member function is not declared, a compile time error will occur.  In order\nthat the member function generated by this template can be called to\nappend the data to an archive, it either must be public or the class must\nbe made accessible to the serialization library by including:\n<pre><code>\nfriend class boost::serialization::access;\n</code></pre>\nin the class definition.  This latter method should be preferred over the option\nof making the member function public. This will prevent serialization functions from \nbeing called from outside the library.  This is almost certainly an error.  Unfortunately,\nit may appear to function but fail in a way that is very difficult to find.\n<p>\nIt may not be immediately obvious how this one template serves for both\nsaving data to an archive as well as loading data from the archive.\nThe key is that the <code style=\"white-space: normal\">&amp;</code> operator is \ndefined as <code style=\"white-space: normal\">&lt;&lt;</code>\nfor output archives and as <code style=\"white-space: normal\">&gt;&gt;</code> input archives.  The\n\"polymorphic\" behavior of the <code style=\"white-space: normal\">&amp;</code> permits the same template\nto be used for both save and load operations.  This is very convenient in that it\nsaves a lot of typing and guarantees that the saving and loading of class\ndata members are always in sync.  This is the key to the whole serialization\nsystem.\n\n<h3><a name=\"free\">Free Function</a></h3>\nOf course we're not restricted to using the default implementation described\nabove. We can override the default one with our own.  Doing this will\npermit us to implement serialization of a class without altering\nthe class definition itself.  We call this <strong>non-intrusive</strong>\nserialization.  Suppose our class is named <code style=\"white-space: normal\">my_class</code>, the\noverride would be specified as:\n<pre><code>\n// namespace selection\n\ntemplate&lt;class Archive&gt;\ninline void serialize(\n    Archive &amp; ar, \n    my_class &amp; t, \n    const unsigned int file_version\n){\n    ...\n}\n</code></pre>\n\nNote that we have called this override \"non-intrusive\".  This is slightly\ninaccurate.  It does not require that the class have special functions, that\nit be derived from some common base class or any other fundamental design changes.\nHowever, it will require access to the class members that are to\nbe saved and loaded.  If these members are <code style=\"white-space: normal\">private</code>, it won't be\npossible to serialize them.  So in some instances, minor modifications to the\nclass to be serialized will be necessary even when using this \"non-intrusive\"\nmethod.  In practice this may not be such a problem as many libraries \n(E.G. STL) expose enough information to permit implementation of non-intrusive\nserialization with absolutely no changes to the library.\n\n<h4><a name=\"namespaces\">Namespaces for Free Function Overrides</a></h4>\nFor maximum portability, include any free functions templates and definitions in the \nnamespace <code style=\"white-space: normal\">boost::serialization</code>.  If portability is not a concern and the\ncompiler being used supports ADL (Argument Dependent Lookup) the free functions and\ntemplates can be in any of the following namespaces:\n<ul>\n<li><code style=\"white-space: normal\">boost::serialization</code>\n<li>namespace of the archive class\n<li>namespace of the type being serialized\n</ul>\n<p>\nNote that, at first glance, this suggestion may seem to be wrong for compilers which implement\ntwo phase lookup.  In fact, the serialization library used a perhaps overly clever \nmethod to support this rule even for such compilers.  Those with an interest in studying\nthis further will find more information in \n<a target=serialization_hpp href=\"../../../boost/serialization/serialization.hpp\">serialization.hpp</a>\n\n<h3><a name=\"classmembers\">Serialization of Class Members</a></h3>\nRegardless of which of the above methods is used,  the body of the serialize function must\nspecify the data to be saved/loaded by sequential application of the archive\n<code style=\"white-space: normal\">operator &amp;</code> to all the data members of the class.\n<pre><code>\n{\n    // save/load class member variables\n    ar &amp; member1;\n    ar &amp; member2;\n}\n</code></pre>\n\n<h4><a name=\"base\">Base Classes</a></h4>\nThe header file \n<a href=\"../../../boost/serialization/base_object.hpp\" target=\"base_object_hpp\">\nbase_object.hpp\n</a>\nincludes the template:\n<pre><code>\ntemplate&lt;class Base, class Derived&gt;\nBase &amp; base_object(Derived &amp;d);\n</code></pre>\nwhich should be used to create a reference to an object of the base\nwhich can be used as an argument to the archive serialization operators.\nSo for a class of <strong>Serializable</strong> type\n<code style=\"white-space: normal\">T</code> the base class state should be \nserialized like this:\n<pre><code>\n{\n    // invoke serialization of the base class \n    ar &amp; boost::serialization::base_object&lt;base_class_of_T&gt;(*this);\n    // save/load class member variables\n    ar &amp; member1;\n    ar &amp; member2;\n}\n</code></pre>\nResist the temptation to just cast <code style=\"white-space: normal\">*this</code> to the base class.\nThis might seem to work but may fail to invoke code necessary for\nproper serialization.\n<p>\nNote that this is <strong>NOT</strong> the same as calling the <code style=\"white-space: normal\">serialize</code>\nfunction of the base class. This might seem to work but will circumvent\ncertain code used for tracking of objects, and registering base-derived\nrelationships and other bookkeeping that is required for the serialization\nsystem to function as designed.  For this reason, all <code style=\"white-space: normal\">serialize</code>\nmember functions should be <code style=\"white-space: normal\">private</code>.\n\n<h4><a name=\"const\"><code style=\"white-space: normal\">const</code> Members</a></h4>\nSaving <code style=\"white-space: normal\">const</code> members to an archive \nrequires no special considerations.\nLoading <code style=\"white-space: normal\">const</code> members can be addressed by using a\n<code style=\"white-space: normal\">const_cast</code>:\n<pre><code>\n    ar &amp; const_cast&lt;T &amp;&gt;(t);\n</code></pre>\nNote that this violates the spirit and intention of the <code style=\"white-space: normal\">const</code>\nkeyword. <code style=\"white-space: normal\">const</code> members are initialized when a class instance\nis constructed and not changed thereafter.  However, this may\nbe most appropriate in many cases.  Ultimately, it comes down to \nthe question about what <code style=\"white-space: normal\">const</code> means in the context\nof serialization. \n\n<h4><a name=\"templates\"></a>Templates</h4>\nImplementation of serialization for templates is exactly the same process \nas for normal classes and requires no additional considerations.  Among\nother things, this implies that serialization of compositions of templates\nare automatically generated when required if serialization of the \ncomponent templates is defined.  For example, this library includes\ndefinition of serialization for <code style=\"white-space: normal\">boost::shared_ptr&lt;T&gt;</code> and for\n<code style=\"white-space: normal\">std::list&lt;T&gt;</code>. If I have defined serialization for my own\nclass <code style=\"white-space: normal\">my_t</code>, then serialization for \n<code style=\"white-space: normal\">std::list&lt; boost::shared_ptr&lt; my_t&gt; &gt;</code> is already available\nfor use.\n<p>\nFor an example that shows how this idea might be implemented for your own\nclass templates, see\n<a href=\"../example/demo_auto_ptr.cpp\" target=\"demo_auto_ptr.cpp\">\ndemo_auto_ptr.cpp</a>.\nThis shows how non-intrusive serialization\nfor the template <code style=\"white-space: normal\">auto_ptr</code> from the standard library\ncan be implemented.\n<p>\nA somewhat trickier addition of serialization to a standard template\ncan be found in the example \n<a href=\"../../../boost/serialization/shared_ptr.hpp\" target=\"shared_ptr_hpp\">\nshared_ptr.hpp\n</a>\n<!--\nOnly the most minimal change to\n<code>shared_count.hpp</code>\n(to gain access to some private members) was necessary to achieve this.\nThis should demonstrate how easy it is to non-intrusively\nimplement serialization to any data type or template. \n-->\n<p>\nIn the specification of serialization for templates, its common\nto split <code style=\"white-space: normal\">serialize</code> \ninto a <code style=\"white-space: normal\">load/save</code> pair. \nNote that the convenience macro described \n<a href=\"#BOOST_SERIALIZATION_SPLIT_FREE\">above</a>\nisn't helpful in these cases as the number and kind of\ntemplate class arguments won't match those used when splitting\n<code style=\"white-space: normal\">serialize</code> for a simple class.  Use the override\nsyntax instead.\n\n<h3><a name=\"versioning\">Versioning</a></h3>\nIt will eventually occur that class definitions change after archives have\nbeen created. When a class instance is saved, the current version\nin included in the class information stored in the archive.  When the class instance\nis loaded from the archive, the original version number is passed as an\nargument to the loading function.  This permits the load function to include\nlogic to accommodate older definitions for the class and reconcile them\nwith latest version.  Save functions always save the current version.  So this\nresults in automatically converting older format archives to the newest versions.\nVersion numbers are maintained independently for each class.  This results in \na simple system for permitting access to older files and conversion of same.\nThe current version of the class is assigned as a\n<a href=\"traits.html\">Class Serialization Trait</a> described later in this manual.\n<pre><code>\n{\n    // invoke serialization of the base class \n    ar &amp; boost::serialization::base_object&lt;base_class_of_T&gt;(*this);\n    // save/load class member variables\n    ar &amp; member1;\n    ar &amp; member2;\n    // if its a recent version of the class\n    if(1 &lt; file_version)\n        // save load recently added class members\n        ar &amp; member3;\n}\n</code></pre>\n\n<h3><a name=\"splitting\">Splitting <code style=\"white-space: normal\">serialize</code> into Save/Load</a></h3>\nThere are times when it is inconvenient to use the same\ntemplate for both save and load functions.  For example, this might occur if versioning\ngets complex.  \n\n<h4><a name=\"splittingmemberfunctions\">Splitting Member Functions</a></h4>\nFor member functions this can be addressed by including\nthe header file <a href=\"../../../boost/serialization/split_member.hpp\" target=\"split_member_hpp\">\nboost/serialization/split_member.hpp</a> including code like this in the class:\n<pre><code>\ntemplate&lt;class Archive&gt;\nvoid save(Archive &amp; ar, const unsigned int version) const\n{\n    // invoke serialization of the base class \n    ar &lt;&lt; boost::serialization::base_object&lt;const base_class_of_T&gt;(*this);\n    ar &lt;&lt; member1;\n    ar &lt;&lt; member2;\n    ar &lt;&lt; member3;\n}\n\ntemplate&lt;class Archive&gt;\nvoid load(Archive &amp; ar, const unsigned int version)\n{\n    // invoke serialization of the base class \n    ar &gt;&gt; boost::serialization::base_object&lt;base_class_of_T&gt;(*this);\n    ar &gt;&gt; member1;\n    ar &gt;&gt; member2;\n    if(version &gt; 0)\n        ar &gt;&gt; member3;\n}\n\ntemplate&lt;class Archive&gt;\nvoid serialize(\n    Archive &amp; ar,\n    const unsigned int file_version \n){\n    boost::serialization::split_member(ar, *this, file_version);\n}\n</code></pre>\nThis splits the serialization into two separate functions <code style=\"white-space: normal\">save</code>\nand <code style=\"white-space: normal\">load</code>.  Since the new <code style=\"white-space: normal\">serialize</code> template\nis always the same it can be generated by invoking the macro\nBOOST_SERIALIZATION_SPLIT_MEMBER() defined in the header file\n<a href=\"../../../boost/serialization/split_member.hpp\" target=\"split_member_hpp\">\nboost/serialization/split_member.hpp\n</a>.\nSo the entire <code style=\"white-space: normal\">serialize</code> function above can be replaced with:\n<pre><code>\nBOOST_SERIALIZATION_SPLIT_MEMBER()\n</code></pre>\n<h4><a name=\"splittingfreefunctions\">Splitting Free Functions</a></h4>\nThe situation is same for non-intrusive serialization with the free\n<code style=\"white-space: normal\">serialize</code> function template.\n\n<a name=\"BOOST_SERIALIZATION_SPLIT_FREE\">\nTo use <code style=\"white-space: normal\">save</code> and \n<code style=\"white-space: normal\">load</code> function templates rather than \n<code style=\"white-space: normal\">serialize</code>:\n<pre><code>\nnamespace boost { namespace serialization {\ntemplate&lt;class Archive&gt;\nvoid save(Archive &amp; ar, const my_class &amp; t, unsigned int version)\n{\n    ...\n}\ntemplate&lt;class Archive&gt;\nvoid load(Archive &amp; ar, my_class &amp; t, unsigned int version)\n{\n    ...\n}\n}}\n</code></pre>\ninclude the header file \n<a href=\"../../../boost/serialization/split_free.hpp\" target=\"split_free_hpp\">\nboost/serialization/split_free.hpp\n</a>.\nand override the free <code style=\"white-space: normal\">serialize</code> function template:\n<pre><code>\nnamespace boost { namespace serialization {\ntemplate&lt;class Archive&gt;\ninline void serialize(\n    Archive &amp; ar,\n    my_class &amp; t,\n    const unsigned int file_version\n){\n    split_free(ar, t, file_version); \n}\n}}\n</code></pre>\nTo shorten typing, the above template can be replaced with\nthe macro:\n<pre><code>\nBOOST_SERIALIZATION_SPLIT_FREE(my_class)\n</code></pre>\n\nNote that although the functionality to split the <code style=\"white-space: normal\">\nserialize</code> function into <code style=\"white-space: normal\">save/load</code>\nhas been provided, the usage of the <code style=\"white-space: normal\">serialize</code>\nfunction with the corresponding <code style=\"white-space: normal\">&amp;</code> operator\nis preferred.  The key to the serialization implementation is that objects are saved \nand loaded in exactly the same sequence.  Using the <code style=\"white-space: normal\">&amp;</code> \noperator and <code style=\"white-space: normal\">serialize</code>\nfunction guarantees that this is always the case and will minimize the\noccurrence of hard to find errors related to synchronization of \n<code style=\"white-space: normal\">save</code> and <code style=\"white-space: normal\">load</code> \nfunctions.\n<p>\nAlso note that <code style=\"white-space: normal\">BOOST_SERIALIZATION_SPLIT_FREE</code>\nmust be used outside of any namespace.\n\n<h2><a name=\"pointeroperators\">Pointers</a></h2>\nA pointer to any class instance can be serialized with any of the archive \nsave/load operators.\n<p>\nTo properly save and restore an object through a pointer the\nfollowing situations must be addressed:\n<ol>\n    <li>If the same object is saved multiple times through different\n    pointers, only one copy of the object need be saved.\n    <li>If an object is loaded multiple times through different pointers,\n    only one new object should be created and all returned pointers\n    should point to it.\n    <li>The system must detect the case where an object is first\n    saved through a pointer then the object itself is saved.\n    Without taking extra precautions, loading would result in the\n    creation of multiple copies of the original object. This system detects\n    this case when saving and throws an exception - see below.\n    <li>An object of a derived class may be stored through a\n    pointer to the base class. The true type of the object must\n    be determined and saved. Upon restoration the correct type\n    must be created and its address correctly cast to the base\n    class. That is, polymorphic pointers have to be considered.\n    <li>NULL pointers must be detected when saved and restored\n    to NULL when deserialized.\n</ol>\n\nThis serialization library addresses all of the above\nconsiderations. The process of saving and loading an object\nthrough a pointer is non-trivial. It can be summarized as\nfollows:\n<p>Saving a pointer:\n<ol>\n    <li>determine the true type of the object being pointed to.\n    <li>write a special tag to the archive\n    <li>if the object pointed to has not already been written\n    to the archive, do so now\n</ol>\nLoading a pointer:\n<ol>\n    <li>read a tag from the archive.\n    <li>determine the type of object to be created\n    <li>if the object has already been loaded, return its address.\n    <li>otherwise, create a new instance of the object\n    <li>read the data back in using the operators described above\n    <li>return the address of the newly created object.\n</ol>\n\nGiven that class instances are saved/loaded to/from the archive\nonly once, regardless of how many times they are serialized with\nthe <code style=\"white-space: normal\">&lt;&lt;</code> \nand <code style=\"white-space: normal\">&gt;&gt;</code> operators\n<ul>\n    <li>Loading the same pointer object multiple times\n    results in only one object being created, thereby replicating\n    the original pointer configuration. \n    <li>Structures, such as collections of polymorphic pointers,\n    are handled with no special effort on the part of users of this library.\n</ul>\nSerialization of pointers of derived types through a pointer to the\nbase class may require a little extra \"help\".  Also, the programmer\nmay desire to modify the process described above for his own reasons.\nFor example, it might be desired to suppress the tracking of objects\nas it is known a priori that the application in question can never\ncreate duplicate objects.  Serialization of pointers can be \"fine tuned\"\nvia the specification of <a target=\"detail\" href=\"traits.html#Traits\">Class Serialization Traits</a>\nas described in\n<a target=\"detail\" href=\"special.html#derivedpointers\">\nanother section of this manual\n</a>\n\n<h3><a name=\"constructors\">Non-Default Constructors</a></h3>\nSerialization of pointers is implemented in the library with code\nsimilar to the following:\n<pre><code>\n// load data required for construction and invoke constructor in place\ntemplate&lt;class Archive, class T&gt;\ninline void load_construct_data(\n    Archive &amp; ar, T * t, const unsigned int file_version\n){\n    // default just uses the default constructor to initialize\n    // previously allocated memory. \n    ::new(t)T();\n}\n</code></pre>\nThe default <code style=\"white-space: normal\">load_construct_data</code> invokes the\ndefault constructor \"in-place\" to initialize the memory.\n<p>\nIf there is no such default constructor, the function templates\n<code style=\"white-space: normal\">load_construct_data</code> and \nperhaps <code style=\"white-space: normal\">save_construct_data</code>\nwill have to be overridden.  Here is a simple example:\n<pre><code>\nclass my_class {\nprivate:\n    friend class boost::serialization::access;\n    const int m_attribute;  // some immutable aspect of the instance\n    int m_state;            // mutable state of this instance\n    template&lt;class Archive&gt;\n    void serialize(Archive &amp;ar, const unsigned int file_version){\n        ar &amp; m_state;\n    }\npublic:\n    // no default construct guarantees that no invalid object\n    // ever exists\n    my_class(int attribute) :\n        m_attribute(attribute),\n        m_state(0)\n    {}\n};\n</code></pre>\nthe overrides would be:\n<pre><code>\nnamespace boost { namespace serialization {\ntemplate&lt;class Archive&gt;\ninline void save_construct_data(\n    Archive &amp; ar, const my_class * t, const unsigned int file_version\n){\n    // save data required to construct instance\n    ar &lt;&lt; t-&gt;m_attribute;\n}\n\ntemplate&lt;class Archive&gt;\ninline void load_construct_data(\n    Archive &amp; ar, my_class * t, const unsigned int file_version\n){\n    // retrieve data from archive required to construct new instance\n    int attribute;\n    ar &gt;&gt; attribute;\n    // invoke inplace constructor to initialize instance of my_class\n    ::new(t)my_class(attribute);\n}\n}} // namespace ...\n</code></pre>\nIn addition to the deserialization of pointers, these overrides are used\nin the deserialization of STL containers whose element type has no default\nconstructor.\n\n<h3><a name=\"derivedpointers\">Pointers to Objects of Derived Classes</a></h3>\n<h4><a name=\"registration\">Registration</a></h4>\nConsider the following:\n<pre><code>\nclass base {\n    ...\n};\nclass derived_one : public base {\n    ...\n};\nclass derived_two : public base {\n    ...\n};\nint main(){\n    ...\n    base *b;\n    ...\n    ar &amp; b; \n}\n</code></pre>\nWhen saving <code style=\"white-space: normal\">b</code> what kind of object should be saved? \nWhen loading <code style=\"white-space: normal\">b</code> what kind of object should be created? \nShould it be an object of class <code style=\"white-space: normal\">derived_one</code>,\n<code style=\"white-space: normal\">derived_two</code>, or maybe <code style=\"white-space: normal\">base</code>?\n<p>\nIt turns out that the kind of object serialized depends upon whether the base class\n(<code style=\"white-space: normal\">base</code> in this case) is polymorphic or not.\nIf <code style=\"white-space: normal\">base</code> is not polymorphic, that is if it has no\nvirtual functions, then an object of the type <code style=\"white-space: normal\">base</code>\nwill be serialized. Information in any derived classes will be lost. If this is what is desired\n(it usually isn't) then no other effort is required.\n<p>\n\nIf the base class is polymorphic, an object of the most derived type\n(<code style=\"white-space: normal\">derived_one</code>\nor <code style=\"white-space: normal\">derived_two</code>\nin this case) will be serialized.  The question of which type of object is to be\nserialized is (almost) automatically handled by the library.\n<p>\nThe system \"registers\" each class in an archive the first time an object of that\nclass it is serialized and assigns a sequential number to it.  Next time an\nobject of that class is serialized in that same archive, this number is written\nin the archive.  So every class is identified uniquely within the archive.  \nWhen the archive is read back in, each new sequence number is re-associated with \nthe class being read.  Note that this implies that \"registration\" has to occur\nduring both save and load so that the class-integer table built on load\nis identical to the class-integer table built on save. In fact, the key to\nwhole serialization system is that things are always saved and loaded in\nthe same sequence.  This includes \"registration\".\n<p>\nExpanding our previous example:\n<pre><code>\nint main(){\n    derived_one d1;\n    derived_two d2:\n    ...\n    ar &amp; d1;\n    ar &amp; d2;\n    // A side effect of serialization of objects d1 and d2 is that\n    // the classes derived_one and derived_two become known to the archive.\n    // So subsequent serialization of those classes by base pointer works\n    // without any special considerations.\n    base *b;\n    ...\n    ar &amp; b; \n}\n</code></pre>\nWhen <code style=\"white-space: normal\">b</code> is read it is\npreceded by a unique (to the archive) class identifier which\nhas previously been related to class <code style=\"white-space: normal\">derived_one</code> or\n<code style=\"white-space: normal\">derived_two</code>.\n<p>\nIf a derived class has NOT been automatically \"registered\" as described\nabove, an <a target=\"detail\" href=\"exceptions.html#unregistered_class\">\n<code style=\"white-space: normal\">unregistered_class</code></a> exception \nwill be thrown when serialization is invoked.\n<p>\nThis can be addressed by registering the derived class explicitly.  All archives are\nderived from a base class which implements the following template:\n<pre><code>\ntemplate&lt;class T&gt;\nregister_type(T * = NULL);\n</code></pre>\nSo our problem could just as well be addressed by writing:\n<pre><code>\nint main(){\n    ...\n    ar.template register_type&lt;derived_one&gt;();\n    ar.template register_type&lt;derived_two&gt;();\n    base *b;\n    ...\n    ar &amp; b; \n}\n</code></pre>\nNote that if the serialization function is split between save and load, both\nfunctions must include the registration.  This is required to keep the save\nand corresponding load in synchronization.\n\n<h4><a name=\"export\">Export</a></h4>\nThe above will work but may be inconvenient.  We don't always know which derived\nclasses we are going to serialize when we write the code to serialize through\na base class pointer.  Every time a new derived class is written we have to\ngo back to all the places where the base class is serialized and update the\ncode.\n<p>\nSo we have another method:\n<pre><code>\n#include &lt;boost/serialization/export.hpp&gt;\n...\nBOOST_CLASS_EXPORT_GUID(derived_one, \"derived_one\")\nBOOST_CLASS_EXPORT_GUID(derived_two, \"derived_two\")\n\nint main(){\n    ...\n    base *b;\n    ...\n    ar &amp; b; \n}\n</code></pre>\nThe macro <code style=\"white-space: normal\">BOOST_CLASS_EXPORT_GUID</code> associates a string literal\nwith a class. In the above example we've used a string rendering\nof the class name. If a object of such an \"exported\" class is serialized\nthrough a pointer and is otherwise unregistered, the \"export\" string is \nincluded in the archive. When the archive \nis later read, the string literal is used to find the class which \nshould be created by the serialization library.\nThis permits each class to be in a separate header file along with its \nstring identifier. There is no need to maintain a separate \"pre-registration\" \nof derived classes that might be serialized.  This method of\nregistration is referred to as \"key export\".  More information on this\ntopic is found in the section Class Traits - \n<a target=\"detail\" href=\"traits.html#export\">Export Key</a>.\n<p>\n<h4><a name=\"instantiation\">Instantiation</a></h4>\nRegistration by means of any of the above methods fulfill another role \nwhose importance might not be obvious.  This system relies on templated\nfunctions of the form <code style=\"white-space: normal\">template&lt;class Archive, class T&gt;</code>.\nThis means that serialization code must be instantiated for each\ncombination of archive and data type that is serialized in the program.\n<p>\nPolymorphic pointers of derived classes may never be referred to \nexplicitly by the program so normally code to serialize such classes\nwould never be instantiated.  So in addition to including export key\nstrings in an archive, <code style=\"white-space: normal\">BOOST_CLASS_EXPORT_GUID</code> explicitly\ninstantiates the class serialization code for all archive classes used \nby the program.  \n\n<h4><a name=\"selectivetracking\">Selective Tracking</a></h4>\nWhether or not an object is tracked is determined by its\n<a target=\"detail\" href=\"traits.html#tracking\">object tracking trait</a>.\nThe default setting for user defined types is <code style=\"white-space: normal\">track_selectively</code>.\nThat is, track objects if and only if they are serialized through pointers anywhere\nin the program. Any  objects that are \"registered\" by any of the above means are presumed\nto be serialized through pointers somewhere in the program and therefore\nwould be tracked. In certain situations this could lead to an inefficiency.\nSuppose we have a class module used by multiple programs.  Because\nsome programs serializes polymorphic pointers to objects of this class, we \n<a target=\"detail\" href=\"traits.html#export\">export</a> a class\nidentifier by specifying <code style=\"white-space: normal\">BOOST_CLASS_EXPORT</code> in the\nclass header.  When this module is included by another program,\nobjects of this class will always be tracked even though it\nmay not be necessary.  This situation could be addressed by using \n<a target=\"detail\" href=\"traits.html#tracking\"><code style=\"white-space: normal\">track_never</code></a>  \nin those programs.\n<p>\nIt could also occur that even though a program serializes through \na pointer, we are more concerned with efficiency than avoiding the\nthe possibility of creating duplicate objects.  It could be\nthat we happen to know that there will be no duplicates.  It could\nalso be that the creation of a few duplicates is benign and not\nworth avoiding given the runtime cost of tracking duplicates.\nAgain, <a target=\"detail\" href=\"traits.html#tracking\"><code style=\"white-space: normal\">track_never</code></a>  \ncan be used.\n<h4><a name=\"runtimecasting\">Runtime Casting</a></h4>\nIn order to properly translate between base and derived pointers\nat runtime, the system requires each base/derived pair be found\nin a table.  A side effect of serializing a base object with\n<code style=\"white-space: normal\">boost::serialization::base_object&lt;Base&gt;(Derived &amp;)</code>\nis to ensure that the base/derived pair is added to the table\nbefore the <code style=\"white-space: normal\">main</code> function is entered.\nThis is very convenient and results in a clean syntax.  The only\nproblem is that it can occur where a derived class serialized\nthrough a pointer has no need to invoke the serialization of\nits base class.  In such a case, there are two choices.  The obvious\none is to invoke the base class serialization with <code style=\"white-space: normal\">base_object</code>\nand specify an empty function for the base class serialization.\nThe alternative is to \"register\" the Base/Derived relationship\nexplicitly by invoking the template \n<code style=\"white-space: normal\">void_cast_register&lt;Derived, Base&gt;();</code>.\nNote that this usage of the term \"register\" is not related\nto its usage in the previous section.  Here is an example of how this is done:\n<pre><code>\n#include &lt;sstream&gt;\n#include &lt;boost/serialization/serialization.hpp&gt;\n#include &lt;boost/archive/text_iarchive.hpp&gt;\n#include &lt;boost/serialization/export.hpp&gt;\n\nclass base {\n    friend class boost::serialization::access;\n    //...\n    // only required when using method 1 below\n    // no real serialization required - specify a vestigial one\n    template&lt;class Archive&gt;\n    void serialize(Archive &amp; ar, const unsigned int file_version){}\n};\n\nclass derived : public base {\n    friend class boost::serialization::access;\n    template&lt;class Archive&gt;\n    void serialize(Archive &amp; ar, const unsigned int file_version){\n        // method 1 : invoke base class serialization\n        ar &amp; boost::serialization::base_object&lt;base&gt;(*this);\n        // method 2 : explicitly register base/derived relationship\n        boost::serialization::void_cast_register&lt;derived, base&gt;(\n            static_cast&lt;derived *&gt;(NULL),\n            static_cast&lt;base *&gt;(NULL)\n        )\n    }\n};\n\nBOOST_CLASS_EXPORT_GUID(derived, \"derived\")\n\nint main(){\n    //...\n    std::stringstream ss;\n    boost::archive::text_iarchive ar(ss);\n    base *b;\n    ar &gt;&gt; b; \n}\n</code></pre>\n<p>\n\nIn order for this template to be invoked in code compiled by non-conforming\ncompilers, the following syntax may be used:\n<pre><code>\nboost::serialization::void_cast_register(\n    static_cast&lt;Derived *&gt;(NULL),\n    static_cast&lt;Base *&gt;(NULL)\n);\n</code></pre>\nFor more information, see <a target=\"detail\" href=\"implementation.html#tempatesyntax\">Template Invocation syntax</a>\n\n<h3><a name=\"references\"></a>References</h3>\nClasses that contain reference members will generally require\nnon-default constructors as references can only be set when\nan instance is constructed. The example of the previous section\nis slightly more complex if the class has reference members.\nThis raises the question of how and where the objects being\nreferred to are stored and how are they created. Also there is the question about\nreferences to polymorphic base classes.  Basically, these\nare the same questions that arise regarding pointers.  This is\nno surprise as references are really a special kind of pointer.\nWe address these questions by serializing references as though\nthey were pointers.\n<pre><code>\nclass object;\nclass my_class {\nprivate:\n    friend class boost::serialization::access;\n    int member1;\n    object &amp; member2;\n    template&lt;class Archive&gt;\n    void serialize(Archive &amp;ar, const unsigned int file_version);\npublic:\n    my_class(int m, object &amp; o) :\n        member1(m), \n        member2(o)\n    {}\n};\n</code></pre>\nthe overrides would be:\n<pre><code>\nnamespace boost { namespace serialization {\ntemplate&lt;class Archive&gt;\ninline void save_construct_data(\n    Archive &amp; ar, const my_class * t, const unsigned int file_version\n){\n    // save data required to construct instance\n    ar &lt;&lt; t.member1;\n    // serialize reference to object as a pointer\n    ar &lt;&lt; &amp; t.member2;\n}\n\ntemplate&lt;class Archive&gt;\ninline void load_construct_data(\n    Archive &amp; ar, my_class * t, const unsigned int file_version\n){\n    // retrieve data from archive required to construct new instance\n    int m;\n    ar &gt;&gt; m;\n    // create and load data through pointer to object\n    // tracking handles issues of duplicates.\n    object * optr;\n    ar &gt;&gt; optr;\n    // invoke inplace constructor to initialize instance of my_class\n    ::new(t)my_class(m, *optr);\n}\n}} // namespace ...\n</code></pre>\n\n<h3><a name=\"arrays\"></a>Arrays</h3>\nIf <code style=\"white-space: normal\">T</code> is a serializable type, \nthen any native C++ array of type T is a serializable type.\nThat is, if <code style=\"white-space: normal\">T</code>\nis a serializable type, then the following\nis automatically available and will function as expected:\n<pre><code>\nT t[4];\nar &lt;&lt; t;\n    ...\nar &gt;&gt; t;\n</code></pre>\n\n<h2><a href=\"traits.html\">Class Serialization Traits</a></h2>\n\n<h2><a href=\"wrappers.html\">Serialization Wrappers</a></h2>\n\n<h2><a name=\"models\"></a>Models - Serialization Implementations Included in the Library</h2>\nThe facilities described above are sufficient to implement \nserialization for all STL containers.  In fact, this has been done\nand has been included in the library.  For example, in order to use\nthe included serialization code for <code style=\"white-space: normal\">std::list</code>, use:\n<pre><code>\n#include &lt;boost/serialization/list.hpp&gt;\n</code></pre>\nrather than\n<pre><code>\n#include &lt;list&gt;\n</code></pre>\nSince the former includes the latter, this is all that is necessary.\nThe same holds true for all STL collections as well as templates\nrequired to support them (e.g. <code style=\"white-space: normal\">std::pair</code>).\n<p>\nAs of this writing, the library contains serialization of the following boost classes:\n<ul>\n  <li>optional\n  <li>variant\n  <li>scoped_ptr\n  <li>shared_ptr\n  <li>auto_ptr (demo)\n</ul>\nC++17 <code style=\"white-space: normal\">std::variant is supported as well</code>.\nOthers are being added to the list so check the boost files section and headers for\nnew implementations!\n<hr>\n<p><i>&copy; Copyright <a href=\"http://www.rrsd.com\">Robert Ramey</a> 2002-2004. \nDistributed under the Boost Software License, Version 1.0. (See\naccompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n</i></p>\n</body>\n</html>\n"
  },
  {
    "path": "doc/shared_ptr.html",
    "content": "<!doctype HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">\n<html>\n<!--\n(C) Copyright 2002-4 Robert Ramey - http://www.rrsd.com . \nUse, modification and distribution is subject to the Boost Software\nLicense, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\nhttp://www.boost.org/LICENSE_1_0.txt)\n-->\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\n<link rel=\"stylesheet\" type=\"text/css\" href=\"../../../boost.css\">\n<link rel=\"stylesheet\" type=\"text/css\" href=\"style.css\">\n<title>Template serialization - shared_ptr</title>\n</head>\n<body link=\"#0000ff\" vlink=\"#800080\">\n<table border=\"0\" cellpadding=\"7\" cellspacing=\"0\" width=\"100%\" summary=\"header\">\n  <tr> \n    <td valign=\"top\" width=\"300\"> \n      <h3><a href=\"../../../index.htm\"><img height=\"86\" width=\"277\" alt=\"C++ Boost\" src=\"../../../boost.png\" border=\"0\"></a></h3>\n    </td>\n    <td valign=\"top\"> \n      <h1 align=\"center\">Serialization</h1>\n      <h2 align=\"center\">Template serialization - <code style=\"white-space: normal\">shared_ptr&lt;class T&gt;</code></h2>\n    </td>\n  </tr>\n</table>\n<hr>\nAll the code snippets included below are defined within the\n<code style=\"white-space: normal\">boost::serialization</code> namespace.\n<p>\n<code style=\"white-space: normal\">shared_ptr&lt;T&gt;</code> is defined in\n<a href=\"../../../boost/shared_ptr.hpp\" target=shared_ptr.hpp>shared_ptr.hpp</a>.\n<p>\nThe general class outline for a <code style=\"white-space: normal\">shared_ptr&lt;T&gt;</code> is:\n<dl>\n    <dt><code style=\"white-space: normal\">shared_ptr&lt;T&gt;</code> contains:\n    <dl>\n        <dt><code style=\"white-space: normal\">T *px;</code>\n        <dt><code style=\"white-space: normal\">shared_count pn;</code> which contains a pointer to:\n        <dl>\n            <dt><code style=\"white-space: normal\">sp_counted_base_impl&lt;T, ...&gt;</code> which is\nderived from the polymorphic abstract class\n            <dl>\n                <dt><code style=\"white-space: normal\">sp_counted_base</code>\n            </dl>\n        </dl>\n    </dl>\n</dl>\nThe serialization process proceeds down the tree above.\n<p>\nThe first cut at implementing serialization for <code style=\"white-space: normal\">shared_ptr</code>\njust serializes the relevant members of <code style=\"white-space: normal\">shared_ptr</code>.\nIt's almost trivial:\n<pre><code>\ntemplate&lt;class Archive, class T&gt;\ninline void serialize(\n    Archive &amp; ar,\n    shared_ptr&lt;T&gt; &amp; t,\n    const unsigned int file_version,\n    int\n){\n    ar &amp; t.px; // save the raw pointer\n    ar &amp; t.pn; // save the shared reference count\n}\n</code></pre>\nSo far so good.  Now for the serialization of <code style=\"white-space: normal\">shared_count</code>:\n<pre><code>\ntemplate&lt;class Archive&gt;\ninline void save(\n    Archive &amp; ar,\n    const boost::detail::shared_count &amp; t,\n    const unsigned int file_version\n){\n    ar &lt;&lt; t.pi_;\n}\n\ntemplate&lt;class Archive&gt;\ninline void load(\n    Archive &amp; ar,\n    boost::detail::shared_count &amp; t,\n    const unsigned int file_version\n){\n    ar &gt;&gt; t.pi_;\n}\n</code></pre>\nA key feature of this library is the ability to specify serialization\nof a class or template without changing the class or template declaration\nor definition.  This is referred to as <i>non-intrusive</i> serialization.\n<p>\nThe <code style=\"white-space: normal\">pi_</code>member of shared count is a pointer to an \ninstance of <code style=\"white-space: normal\">sp_counted_base_impl<T, ...></code>.  Since this class\ndoesn't have a default constructor, serialization requires\nspecification of the following overload:\n<pre><code>\ntemplate&lt;class Archive, class P, class D&gt;\ninline void save_construct_data(\n    Archive &amp; ar,\n    const boost::detail::sp_counted_base_impl&lt;P, D&gt; * t, \n    const unsigned int file_version\n){\n    // variables used for construction\n    ar &lt;&lt; t-&gt;ptr;\n    ar &lt;&lt; *t;\n}\n\ntemplate&lt;class Archive, class P, class D&gt;\ninline void load_construct_data(\n    Archive &amp; ar,\n    boost::detail::sp_counted_base_impl&lt;P, D&gt; * t, \n    const unsigned int file_version\n){\n    P ptr_;\n    ar &gt;&gt; ptr_;\n    // placement new\n    ::new(t)boost::detail::sp_counted_base_impl&lt;P, D&gt;(ptr_,  D());\n    ar &gt;&gt; *t;\n}\n</code></pre>\nThe statement <code style=\"white-space: normal\">ar &gt;&gt; ptr_</code> is key. This deserializes\nthe same pointer deserialized above.  Default object tracking will ensure\nthat no more than one instance of the object is created and that the\npointer returned by multiple deserializations are all the same. Hence,\nregardless of how many instances of <code style=\"white-space: normal\">shared_ptr/shared_count</code>\ncorresponding to a particular object are created, they will all point\nto the same object.\n<p>\nSince <code style=\"white-space: normal\">sp_counted_base_impl&lt;P, D&gt;</code> is derived from \n<code style=\"white-space: normal\">sp_counted_base</code>, the following is needed:\n\n<pre><code>\ntemplate&lt;class Archive, class P, class D&gt;\ninline void serialize(\n    Archive &amp; ar,\n    boost::detail::sp_counted_base_impl&lt;P, D&gt; &amp; t,\n    const unsigned int file_version,\n    int\n){\n    ar &amp; boost::serialization::base_object&lt;\n\tboost::detail::sp_counted_base\n    &gt;(*this);\n}\n</code></pre>\nwhich will in turn require serialization of its base class:\n<pre><code>\ninline void serialize(\n    Archive &amp; ar,\n    boost::detail::sp_counted &amp; t,\n    const unsigned int file_version,\n    int\n){\n}\n</code></pre>\nIt would seem we're done, but running the test program,\n<a href=\"../example/demo_shared_ptr.cpp\" target=\"demo_shared_ptr_cpp\">\ndemo_shared_ptr.cpp\n</a>,\nwith this code produces the following output.\n<pre><code>\na = 0x003017A0 use count = 2\na1 = 0x003017A0 use count = 2\nunique element count = 1\na = 0x00000000 use count = 0\na1 = 0x00000000 use count = 0\nunique element count = 0\na = 0x00303060 use count = 1\na1 = 0x00303060 use count = 1\nunique element count = 1\n</code></pre>\nThis indicates that we're not quite done.  Due to default object\ntracking, <code style=\"white-space: normal\">sp_counted_base_impl&lt;P, D&gt;</code> is only\ncreated once regardless of how many shared pointers point to the\nsame object.  Of course, it has to be this way. The reference\ncount starts at 1 and is never incremented.  Code must be added\nto the serialization functions to maintain the proper reference\ncount.\n<p>\nThe process of serialization of an empty base class - \n<code style=\"white-space: normal\">sp_counted_base</code> - seems like additional overhead.\nExamination of code in \n<a href=\"../../../boost/serialization/base_object.hpp\" target=\"base_object_hpp\">\nbase_object.hpp\n</a>\nreveals that <code style=\"white-space: normal\">base_object.hpp</code> provides two functions:\n<ul>\n    <li>invokes serialization of the base class data\n    <li>as a side effect, \"registers\" the fact base/derived relationship\nso that conversions of pointers between base and derived classes can be\nmade at runtime.\n</ul>\nIn this case we need only the latter function so we can replace the\nbase object serialization with:\n<pre><code>\n// register the relationship between each derived class\n// and its polymorphic base\nvoid_cast_register&lt;\n    boost::detail::sp_counted_base_impl&lt;P, D&gt;\n    boost::detail::sp_counted_base, \n&gt;();\n</code></pre>\nand we don't have to include a trivial serializer for <code style=\"white-space: normal\">sp_counted_base</code>.\n<p>\nFinally we need to specify name-value pair wrappers if we want to be able\nto use this serialization with XML archives.\n<p>\nActually, even this is really just a start. Among the issues not addressed in\nthis implementation are:\n<ul>\n    <li><code style=\"white-space: normal\">weak_ptr</code> is not addressed.  I haven't even looked into this.\n    <li>Other smart pointers that might interact with <code style=\"white-space: normal\">shared_ptr</code>\n    haven't been addressed at all.  To be confident that the implementation is\n    complete and correct, all these should be addressed as well.\n    <li>Exception handling hasn't been exhaustively considered.\n    <li>Other issues yet to be discovered.\n</ul>\nOne thing that has been considered is export of shared_ptr. The header which\ndeclares shared pointer serialization includes some special macros for exporting\nshared pointers:\n<code><pre>\nBOOST_SHARED_POINTER_EXPORT(T)\nBOOST_SHARED_POINTER_EXPORT_GUID(T, K)\n</pre></code>\nThese are specialized versions of the macros used for exporting classes serialized through raw pointers.\n<p>\nClear, complete, correct and exception safe serialization of smart pointers is going to\nbe a challenge.  I hope that this implementation provides a useful\nstarting point for such an effort.\n<hr>\n<p><i>&copy; Copyright <a href=\"http://www.rrsd.com\">Robert Ramey</a> 2002-2004. \nDistributed under the Boost Software License, Version 1.0. (See\naccompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n</i></p>\n</body>\n</html>\n"
  },
  {
    "path": "doc/shared_ptr2.html",
    "content": "﻿<!doctype HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">\n<html>\n<!--\n(C) Copyright 2002-4 Robert Ramey - http://www.rrsd.com . \nUse, modification and distribution is subject to the Boost Software\nLicense, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\nhttp://www.boost.org/LICENSE_1_0.txt)\n-->\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\n<link rel=\"stylesheet\" type=\"text/css\" href=\"../../../boost.css\">\n<link rel=\"stylesheet\" type=\"text/css\" href=\"style.css\">\n<title>Template serialization - shared_ptr</title>\n</head>\n<body link=\"#0000ff\" vlink=\"#800080\">\n<table border=\"0\" cellpadding=\"7\" cellspacing=\"0\" width=\"100%\" summary=\"header\">\n  <tr> \n    <td valign=\"top\" width=\"300\"> \n      <h3><a href=\"../../../index.htm\"><img height=\"86\" width=\"277\" alt=\"C++ Boost\" src=\"../../../boost.png\" border=\"0\"></a></h3>\n    </td>\n    <td valign=\"top\"> \n      <h1 align=\"center\">Serialization</h1>\n      <h2 align=\"center\"><code style=\"white-space: normal\">shared_ptr&lt;class T&gt;</code> Revisited</h2>\n    </td>\n  </tr>\n</table>\n<hr>\nThe previously described serialization of <code style=\"white-space: normal\">shared_ptr</code>\nillustrates the straightforward way of serializing a moderately complicated class structure.\nUnfortunately, this way of doing it suffered from some undesirable features\n<ul>\n  <li>It was dependent on the Boost implementation of <code style=\"white-space: normal\">shared_ptr</code>.\n  The <code style=\"white-space: normal\">shared_ptr</code> interface has been included\n  in <code style=\"white-space: normal\">std::tr1</code> and may someday be included in the standard\n  C++ library. An implementation which depends only on the public interface can be guaranteed to\n  function with any other future implementation of <code style=\"white-space: normal\">shared_ptr</code>.\n  <li>It required extra macros for export.\n</ul>\n\n<pre><code>\ntemplate&lt;class Archive, class T&gt;\ninline void save(\n    Archive &amp; ar,\n    const boost::shared_ptr&lt;T&gt; &amp;t,\n    const unsigned int /* file_version */\n){\n    const T * t_ptr = t.get();\n    // just serialize the underlying raw pointer\n    ar &lt;&lt; boost::serialization::make_nvp(\"px\", t_ptr);\n}\n\ntemplate&lt;class Archive, class T&gt;\ninline void load(\n    Archive &amp; ar,\n    boost::shared_ptr&lt;T&gt; &amp;t,\n    const unsigned int file_version\n){\n    T* r;\n    // recover the underlying raw pointer\n    ar &gt;&gt; boost::serialization::make_nvp(\"px\", r);\n\n    // To Do - match up with other shared pointers which \n    // use this same raw pointer.\n    ...\n}\n</code></pre>\n\nIn principle, this is very much simpler than the original implementation.  Completion of\nthis code requires:\n\n<ol>\n  <li>Filling in the \"To Do\".  This required making an extra map for\n  <code style=\"white-space: normal\">shared_ptr</code> instances.\n  <li>A method for identifying pointers to the same objects from pointers to their base classes.\n  <li>Backward compatibility with pointers serialized by the previous method.  This exploits\n  the serialization class versioning.\n  <li>Proper handling of <code style=\"white-space: normal\">weak_ptr</code>.\n</ol>\n\nThe result of this effort can be found in \n<a target = serialization_shared_ptr href=\"../../../boost/serialization/shared_ptr.hpp\">\n<code style=\"white-space: normal\">boost::serialization::shared_ptr.hpp</code>\n</a>\n<p>\nNote that if your code needs to read archives created under boost version 1.32, you will\nhave to include the following\n\n<pre><code>\n#include &lt;boost/serialization/shared_ptr_132.hpp&gt;\n#include &lt;boost/serialization/shared_ptr.hpp&gt;\n</code></pre>\nrather than just\n<pre><code>\n#include &lt;boost/serialization/shared_ptr.hpp&gt;\n</code></pre>\n\n<hr>\n<p><i>&copy; Copyright <a href=\"http://www.rrsd.com\">Robert Ramey</a> 2002-2004. \nDistributed under the Boost Software License, Version 1.0. (See\naccompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n</i></p>\n</body>\n</html>\n"
  },
  {
    "path": "doc/simple_log.html",
    "content": "<!doctype HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">\n<html>\n<!--\n(C) Copyright 2002-10 Robert Ramey - http://www.rrsd.com .\nUse, modification and distribution is subject to the Boost Software\nLicense, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\nhttp://www.boost.org/LICENSE_1_0.txt)\n-->\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\n<link rel=\"stylesheet\" type=\"text/css\" href=\"../../../boost.css\">\n<link rel=\"stylesheet\" type=\"text/css\" href=\"style.css\">\n<title>Serialization - Derivation from an Existing Archive</title>\n</head>\n<body link=\"#0000ff\" vlink=\"#800080\">\n<table border=\"0\" cellpadding=\"7\" cellspacing=\"0\" width=\"100%\" summary=\"header\">\n  <tr> \n    <td valign=\"top\" width=\"300\"> \n      <h3><a href=\"../../../index.htm\"><img height=\"86\" width=\"277\" alt=\"C++ Boost\" src=\"../../../boost.png\" border=\"0\"></a></h3>\n    </td>\n    <td valign=\"top\"> \n      <h1 align=\"center\">Serialization</h1>\n      <h2 align=\"center\">A Simple Logging Archive Class</h2>\n    </td>\n  </tr>\n</table>\n<hr>\nThe purpose of this example is to help clarify the usage of the\n<a href=\"archives.html\"><strong>Archive Concept</strong></a> \nso that one can implement his own archive classes.  \n<a href=\"../example/simple_log_archive.hpp\" target=\"simple_archive_hpp\">\n<code>simple_log_archive.hpp</code></a> implements a simple but useful\narchive class. This class can be used to send any serializable types\non an output text stream in a readable format. Usage of this facility\nis trivially easy:\n\n<pre><code>\n#include \"simple_log_archive.hpp\"\n...\n// display the complete schedule\nsimple_log_archive log(std::cout);\nlog &lt;&lt; schedule;\n</code></pre>\n\nand it produces the following output\n\n<pre><code>\nschedule \n count 6\n item \n  first \n   driver bob\n   hour 6\n   minute 24\n  second -&gt; \n   stops \n    count 3\n    item -&gt; \n     latitude \n      degrees 34\n      minutes 135\n      seconds 52.56\n     longitude \n      degrees 134\n      minutes 22\n      seconds 78.3\n...\n</code></pre>\n\nThe complete example is <a href=\"../example/demo_simple_log.cpp\" target=\"demo_simple_log_cpp\">\n<code>demo_simple_log.cpp</code></a>.  Look at \n<a href=\"archive_reference.html#trivial\">Trivial Archive</a> to get a \nbetter understanding of how this works.\n\nAlso, note the following:\n<ul>\n  <li>Only 160 lines of code.\n  <li>Header only - linking with the serialization library not required.\n  <li>Displays ALL <a href=\"serialization.html\"><strong>Serializable</strong></a> types.\n  <li>Lacks some features.\n  <ul>\n    <li>it will not display the data from the derived type given the pointer to a \n    polymorphic base class.  That is, only displays the information of the base class.\n    To add that see the next example.\n    <li>doesn't display information serialized as binary data\n  </ul>\n</ul>\n\n<hr>\n<p><i>&copy; Copyright <a href=\"http://www.rrsd.com\">Robert Ramey</a> 2002-2010. \nDistributed under the Boost Software License, Version 1.0. (See\naccompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n</i></p>\n</body>\n</html>\n"
  },
  {
    "path": "doc/singleton.html",
    "content": "<!doctype HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">\n<html>\n<!--\n(C) Copyright 2002-4 Robert Ramey - http://www.rrsd.com . \nUse, modification and distribution is subject to the Boost Software\nLicense, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\nhttp://www.boost.org/LICENSE_1_0.txt)\n-->\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\n<link rel=\"stylesheet\" type=\"text/css\" href=\"../../../boost.css\">\n<link rel=\"stylesheet\" type=\"text/css\" href=\"style.css\">\n<title>Serialization - singleton</title>\n</head>\n<body link=\"#0000ff\" vlink=\"#800080\">\n<table border=\"0\" cellpadding=\"7\" cellspacing=\"0\" width=\"100%\" summary=\"header\">\n  <tr> \n    <td valign=\"top\" width=\"300\"> \n      <h3><a href=\"../../../index.htm\"><img height=\"86\" width=\"277\" alt=\"C++ Boost\" src=\"../../../boost.png\" border=\"0\"></a></h3>\n    </td>\n    <td valign=\"top\"> \n      <h1 align=\"center\">Serialization</h1>\n      <h2 align=\"center\"><code style=\"white-space: normal\">singleton</code></h2>\n    </td>\n  </tr>\n</table>\n<hr>\n<dl class=\"page-index\">\n  <dt><a href=\"#motivation\">Motivation</a>\n  <dt><a href=\"#features\">Features</a>\n  <dt><a href=\"#classinterface\">Class Interface</a>\n  <dt><a href=\"#requirements\">Requirements</a>\n  <dt><a href=\"#example\">Examples</a>\n  <dt><a href=\"#multithreading\">Multi-Threading</a>\n</dl>\n\n<h3><a name=\"motivation\">Motivation</a></h3>\nThe serialization library relies on the existence of a number\nof static variables and tables to store information related\nto runtime types.  Examples are tables which relate exported\nnames to types and tables which relate base classes to derived\nclasses.  Construction, destruction and usage of these variables\nrequires consideration of the following issues:\n<ul>\n  <li>Some static data variable and constant entries refer to others.  \n  The sequence of initialization cannot be arbitrary but must be in proper\n  sequence.</li>\n  <li>A number of static variables aren't referred to explicitly and, without\n  special precautions, will be stripped by most code optimizers</li>\n  <li>Many of these variables are created by templates and special care must\n  be taken to be sure that they are instantiated</li>\n  <li>In a multi-threading system, its possible that these static variables\n  will be accessed concurrently by separate threads.  This would create a\n  race condition with unpredictable behavior</li>\n</ul>\nThis singleton class addresses all of the above issues.\n\n<h3><a name=\"features\">Features</a></h3>\nThis singleton implementation has the following features:\n<ul>\n  <li>\n    Any instance will be constructed before any attempt is made to access it.</li>\n  <li>\n    Any instance created with a template is guaranteed to be instantiated.\n  <li>\n    Regardless of whether or not an instance has been explicitly\n    referred to, it will not be stripped by the optimizer when the\n    executable is built in release mode.\n  <li>\n    All instances are constructed before \n    <code style=\"white-space: normal\">main</code> is called\n    regardless of where they might be referenced within the program.\n    In a multi-tasking system, this guarantees that there will be no \n    race conditions during the construction of any instance.  No\n    thread locking is required to guarantee this.\n  <li>\n    The above implies that any <code style=\"white-space: normal\">const</code>\n    instances are thread-safe during the whole program.  Again, no\n    thread locking is required.\n  <li>\n    If a mutable instance is created, and such an instance is modified\n    after main is called in a multi-threading system, there exists\n    the possibility that a race condition will occur.  The serialization\n    library takes care that in the few places where a mutable\n    singleton is required, it is not altered after \n    <code style=\"white-space: normal\">main</code> is called.\n    For a more general purpose usage, thread locking on this\n    singleton could easily be implemented.  But as the serialization\n    library didn't require it, it wasn't implemented.\n</ul>\n\n<h3><a name=\"classinterface\">Class Interface</a></h3>\n<pre><code>\nnamespace boost { \nnamespace serialization {\n\ntemplate &lt;class T&gt;\nclass singleton : public boost::noncopyable\n{\npublic:\n    static const T &amp; get_const_instance();\n    static T &amp; get_mutable_instance();\n    static bool is_destroyed();\n};\n\n} // namespace serialization \n} // namespace boost\n</code></pre>\n\n<dl>\n\n<dt><h4><pre><code>\nstatic const T &amp; get_const_instance();\n</code></pre></h4></dt>\n<dd>\nRetrieve a constant reference to the singleton for this type.\n</dd>\n\n<dt><h4><pre><code>\nstatic T &amp; get_mutable_instance();\n</code></pre></h4></dt>\n<dd>\nRetrieve a mutable reference to the singleton for this type.\n</dd>\n\n<dt><h4><pre><code>\nstatic bool is_destroyed();\n</code></pre></h4></dt>\n<dd>\nReturn <code>true</code> if the destructor on this singleton has been \ncalled.  Otherwise, return <code>false</code>.\n</dd>\n\n</dl>\n\n<h3><a name=\"requirements\">Requirements</a></h3>\nIn order to be used as \n<a target=\"singleton.hpp\" href = \"../../../boost/serialization/singleton.hpp\">\n<code style=\"white-space: normal\">\nsingleton&lt;T&gt;\n</code>\n</a>, the type T must be default constructible. \nIt doesn't require static variables - though it may have them.\nSince the library guarantees that only one instance of \n<a target=\"singleton.hpp\" href = \"../../../boost/serialization/singleton.hpp\">\n<code style=\"white-space: normal\">\nsingleton&lt;T&gt;\n</code>\n</a> \nexists and all access is through the above static interface\nfunctions, common member functions of T become\nthe functional equivalent of \n<code style=\"white-space: normal\">static</code> functions.\n\n<h3><a name=\"example\">Examples</a></h3>\nThere are at least two different ways to use this class template.\nBoth are used in the serialization library.\n<p>\nThe first way is illustrated by an excerpt from the file\n<code style=\"white-space: normal\"><a target=\"extended_type_info\" href=\"../src/extended_type_info.cpp\">extended_type_info.cpp</a></code>.\nwhich contains the following code:\n\n<pre><code>\ntypedef std::set&lt;const extended_type_info *, key_compare&gt; ktmap;\n...\nvoid\nextended_type_info::key_register(const char *key) {\n    ...\n    result = singleton&lt;ktmap&gt;::get_mutable_instance().insert(this);\n    ...\n}\n</code></pre>\nJust by referring to the singleton instance anywhere in the program\nwill guarantee that one and only one instance for the specified\ntype (<code style=\"white-space: normal\">ktmap</code> in this example) \nwill exist throughout the program.  There is no need for any other\ndeclaration or definition.\n<p>\nA second way is to use \n<a target=\"singleton.hpp\" href = \"../../../boost/serialization/singleton.hpp\">\n<code style=\"white-space: normal\">\nsingleton&lt;T&gt;\n</code> \n</a>\nas one of the base classes of the type.  This is illustrated by a simplified\nexcerpt from\n<a target=\"extended_type_info_typeid.hpp\" href = \"../../../boost/serialization/extended_type_info_typeid.hpp\">\n<code style=\"white-space: normal\">\nextended_type_info_typeid.hpp\n</code> \n</a>\n\n<pre><code>\ntemplate&lt;class T&gt;\nclass extended_type_info_typeid : \n    public detail::extended_type_info_typeid_0,\n    public singleton&lt;extended_type_info_typeid&lt;const T&gt; &gt;\n{\n    friend class singleton&lt;extended_type_info_typeid&lt;const T&gt; &gt;;\nprivate:\n    // private constructor to inhibit any existence other than the \n    // static one.  Note: not all compilers support this !!!\n    extended_type_info_typeid() :\n        detail::extended_type_info_typeid_0()\n    {\n        type_register(typeid(T));\n    }\n    ~extended_type_info_typeid(){}\n    ...\n};\n</code></pre>\n\nThis usage will permit a more natural syntax to be used:\n<pre><code>\nextended_type_info_typeid&lt;T&gt;::get_const_instance()\n</code></pre>\n\nAgain, including one or more of the above statements anywhere\nin the program will guarantee that one and only one instance\nis created and referred to.\n\n<h3><a name=\"multithreading\">Multi-Threading</a></h3>\nThis singleton CAN be safely used in multi-threading applications if one\nis careful follow a simple rule:\n<p>\n<b>Do not call get_mutable_instance when more than one thread is running!</b>\nAll singletons used in the serialization library follow this rule.  \nIn order to help detect accidental violations of this rule there\nexist singleton lock/unlock functions.\n<pre><code>\nvoid boost::serialization::singleton_module::lock();\nvoid boost::serialization::singleton_module::unlock();\nbool boost::serialization::singleton_module::is_locked();\n</code></pre>\nIn a program compiled for debug, any invocation of \n<code style=\"white-space: normal\">get_mutable_instance()</code>\nwhile the library is in a \"locked\" state will trap in an assertion.\nThe singleton module lock state is initialized as \"unlocked\" to permit\nalteration of static variables before \n<code style=\"white-space: normal\">main</code> is called. \nThe <code style=\"white-space: normal\">lock()</code> and\n<code style=\"white-space: normal\">unlock()</code> are \"global\"\nin that they affect ALL the singletons defined by this template.\nAll serialization tests invoke <code style=\"white-space: normal\">lock()</code>\nat the start of the program.  For programs compiled in release\nmode these functions have no effect.\n\n<hr>\n<p><i>&copy; Copyright <a href=\"http://www.rrsd.com\">Robert Ramey</a> 2007. \nDistributed under the Boost Software License, Version 1.0. (See\naccompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n</i></p>\n</body>\n</html>\n"
  },
  {
    "path": "doc/smart_cast.html",
    "content": "<!doctype HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">\n<html>\n<!--\n(C) Copyright 2002-4 Robert Ramey - http://www.rrsd.com . \nUse, modification and distribution is subject to the Boost Software\nLicense, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\nhttp://www.boost.org/LICENSE_1_0.txt)\n-->\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\n<link rel=\"stylesheet\" type=\"text/css\" href=\"../../../boost.css\">\n<link rel=\"stylesheet\" type=\"text/css\" href=\"style.css\">\n<title>Serialization - BOOST_STATIC_WARNING</title>\n</head>\n<body link=\"#0000ff\" vlink=\"#800080\">\n<table border=\"0\" cellpadding=\"7\" cellspacing=\"0\" width=\"100%\" summary=\"header\">\n  <tr> \n    <td valign=\"top\" width=\"300\"> \n      <h3><a href=\"../../../index.htm\"><img height=\"86\" width=\"277\" alt=\"C++ Boost\" src=\"../../../boost.png\" border=\"0\"></a></h3>\n    </td>\n    <td valign=\"top\"> \n      <h1 align=\"center\">Serialization</h1>\n      <h2 align=\"center\"><code>smart_cast</code></h2>\n    </td>\n  </tr>\n</table>\n<hr>\n<h3>Motivation</h3>\nTo cast from one type to another related type, C++ provides the following\noperators:\n\n<dl>\n  <dt><code>static_cast&lt;T *&gt;(U *)<br>static_cast&lt;T &amp;&gt;(U &amp;)</code></dt>\n  <dd>\n    <ul>\n      <li>required if neither T nor U are polymorphic\n      <li>permitted in other cases.\n      <li>fails to detect erroneous casts of polymorphic pointers/references at runtime.\n      <li>does not permit \"cross casting\"\n      <li>inline function calls can be optimized away during compile time.\n    </ul>\n  </dd>\n  <p>\n  <dt><code>dynamic_cast&lt;T *&gt;(U *)<br>dynamic_cast&lt;T &amp;&gt;(U &amp;)</code></dt>\n  <dd>\n    <ul>\n      <li>permitted if either T or U are polymorphic\n      <li>prohibited in other cases.\n      <li>throws exception on detecting erroneous casts of polymorphic pointers/references\n          at runtime.\n      <li>permits \"cross casting\"\n      <li>cannot optimise inline virtual functions at compile time.\n    </ul>\n  </dd>\n</dl>\n\nThese rules can make it difficult to use casting with a function template argument.\nConsider the following example:\n\n<pre><code>\n#include &lt;boost/serialization/smart_cast.hpp&gt;\n\nstruct top {\n};\n\nstruct base1 : public top {\n    bool is_storable() const {\n        return true;\n    }\n    virtual ~base1();\n};\n\nstruct base2 {\n    virtual ~base2();\n};\n\nstruct derived1 :\n    public base1\n{\n    derived1();\n};\n\nstruct derived2 :\n    public base1, \n    public base2\n{\n    derived2();\n};\n\ntemplate&lt;class T&gt;\nbool is_storable(T &amp;t){\n    // what type of cast to use here?\n\n    // this fails at compile time when T == base2\n    // return static_cast&lt;base1 &amp;&gt;(t).is_storable();\n\n    // this fails at compile time when T == top\n    // otherwise it works but cannot optimize inline function call\n    // return dynamic_cast&lt;base1 &amp;&gt;(t).is_storable();\n\n    // this always works - and is guaranteed to generate the fastest code !\n    return (boost::smart_cast_reference&lt;base1 &amp;&gt;(t)).is_storable();\n}\n\nint main(){\n    derived1 d1;\n    top &amp; t1 = d1;\n    derived2 d2;\n    base2 &amp; b2 = d2;\n\n    bool result;\n    result = is_storable(d1);   \n    result = is_storable(d2);   \n    result = is_storable(b2);\n    result = is_storable(b2);\n    result = is_storable(t1);\n    return 0;\n}\n</code></pre>\nThe serialization library includes a mix of classes which use\nboth static polymorphism (<strong>CRTP</strong>) and dynamic\npolymorphism via virtual functions.  <code style=\"white-space: normal\">smart_cast</code> \nwas written to address the more problematic manifestations of the\nsituation exemplified above.\n\n<h3>Usage</h3>\nThe following syntax is supported:\n<pre><code>\nsmart_cast&lt;Target *, Source *&gt;(Source * s);\nsmart_cast&lt;Target *&gt;(Source * s);\nsmart_cast&lt;Target &amp;, Source &amp;&gt;(Source &amp; s);\n</code></pre>\nNote that the above syntax doesn't include \n<pre><code>\nsmart_cast&lt;Target &amp; &gt;(Source &amp; s)\n</code></pre>\nbut the same functionality is supported with the following special syntax\n<pre><code>\nsmart_cast_reference&lt;Target &amp;&gt;(Source &amp; s)\n</code></pre>\n\n<h3>Requirements</h3>\n<code style=\"white-space: normal\">smart_cast</code> can be used only on compilers that support partial\ntemplate specialization or on types for which the\nmacro <code style=\"white-space: normal\">\nBOOST_BROKEN_COMPILER_TYPE_TRAITS_SPECIALIZATION(&lt;type&gt;)</code>\nhas been applied.\n\n<hr>\n<p><i>&copy; Copyright <a href=\"http://www.rrsd.com\">Robert Ramey</a> 2002-2004. \nDistributed under the Boost Software License, Version 1.0. (See\naccompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n</i></p>\n</body>\n</html>\n"
  },
  {
    "path": "doc/special.html",
    "content": "<!doctype HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">\n<html>\n<!--\n(C) Copyright 2002-4 Robert Ramey - http://www.rrsd.com . \nUse, modification and distribution is subject to the Boost Software\nLicense, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\nhttp://www.boost.org/LICENSE_1_0.txt)\n-->\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\n<link rel=\"stylesheet\" type=\"text/css\" href=\"../../../boost.css\">\n<link rel=\"stylesheet\" type=\"text/css\" href=\"style.css\">\n<title>Serialization - Special Considerations</title>\n</head>\n<body link=\"#0000ff\" vlink=\"#800080\">\n<table border=\"0\" cellpadding=\"7\" cellspacing=\"0\" width=\"100%\" summary=\"header\">\n  <tr> \n    <td valign=\"top\" width=\"300\"> \n      <h3><a href=\"../../../index.htm\"><img height=\"86\" width=\"277\" alt=\"C++ Boost\" src=\"../../../boost.png\" border=\"0\"></a></h3>\n    </td>\n    <td valign=\"top\"> \n      <h1 align=\"center\">Serialization</h1>\n      <h2 align=\"center\">Special Considerations</h2>\n    </td>\n  </tr>\n</table>\n<hr>\n<dl class=\"page-index\">\n  <dt><a href=\"#objecttracking\">Object Tracking</a>\n  <dt><a href=\"#classinfo\">Class Information</a>\n  <dt><a href=\"#helpersupport\">Helper Support</a>\n  <dt><a href=\"#portability\">Archive Portability</a>\n  <dl class=\"page-index\">\n    <dt><a href=\"#numerics\">Numerics</a>\n    <dt><a href=\"#traits\">Traits</a>\n  </dl>\n  <dt><a href=\"#binary_archives\">Binary Archives</a>\n  <dt><a href=\"#xml_archives\">XML Archives</a>\n  <dt><a href=\"#export\">Exporting Class Serialization</a>\n  <dt><a href=\"#static_libraries\">Static Libraries and Serialization</a>\n  <dt><a href=\"#dlls\">DLLS - Serialization and Runtime Linking</a>\n  <dt><a href=\"#plugins\">Plugins</a>\n  <dt><a href=\"#multi_threading\">Multi-Threading</a>\n  <dt><a href=\"#optimizations\">Optimizations</a>\n  <dt><a href=\"exceptions.html\">Archive Exceptions</a>\n  <dt><a href=\"exception_safety.html\">Exception Safety</a>\n</dl>\n\n<h3><a name=\"objecttracking\">Object Tracking</a></h3>\nDepending on how the class is used and other factors, serialized objects\nmay be tracked by memory address.  This prevents the same object from being\nwritten to or read from an archive multiple times. These stored addresses\ncan also be used to delete objects created during a loading process\nthat has been interrupted by throwing of an exception.  \n<p>\nThis could cause problems in \nprograms where the copies of different objects are saved from the same address.\n<pre><code>\ntemplate&lt;class Archive&gt;\nvoid save(boost::basic_oarchive &amp; ar, const unsigned int version) const\n{\n    for(int i = 0; i &lt; 10; ++i){\n        A x = a[i];\n        ar &lt;&lt; x;\n    }\n}\n</code></pre>\nIn this case, the data to be saved exists on the stack.  Each iteration\nof the loop updates the value on the stack.  So although the data changes\neach iteration, the address of the data doesn't.  If a[i] is an array of\nobjects being tracked by memory address, the library will skip storing\nobjects after the first as it will be assumed that objects at the same address\nare really the same object.\n<p>\nTo help detect such cases, output archive operators expect to be passed\n<code style=\"white-space: normal\">const</code> reference arguments.\n<p>\nGiven this, the above code will invoke a compile time assertion.\nThe obvious fix in this example is to use\n<pre><code>\ntemplate&lt;class Archive&gt;\nvoid save(boost::basic_oarchive &amp; ar, const unsigned int version) const\n{\n    for(int i = 0; i &lt; 10; ++i){\n        ar &lt;&lt; a[i];\n    }\n}\n</code></pre>\nwhich will compile and run without problem.  \nThe usage of <code style=\"white-space: normal\">const</code> by the output archive operators\nwill ensure that the process of serialization doesn't\nchange the state of the objects being serialized.  An attempt to do this\nwould constitute augmentation of the concept of saving of state with\nsome sort of non-obvious side effect. This would almost surely be a mistake \nand a likely source of very subtle bugs.\n<p>\nUnfortunately, implementation issues currently prevent the detection of this kind of\nerror when the data item is wrapped as a name-value pair.\n<p>\nA similar problem can occur when different objects are loaded to an address\nwhich is different from the final location:\n<pre><code>\ntemplate&lt;class Archive&gt;\nvoid load(boost::basic_oarchive &amp; ar, const unsigned int version) const\n{\n    for(int i = 0; i &lt; 10; ++i){\n        A x;\n        ar &gt;&gt; x;\n        std::m_set.insert(x);\n    }\n}\n</code></pre>\nIn this case, the address of <code>x</code> is the one that is tracked rather than\nthe address of the new item added to the set.  Left unaddressed\nthis will break the features that depend on tracking such as loading an object through a pointer.\nSubtle bugs will be introduced into the program.  This can be\naddressed by altering the above code thusly:\n\n<pre><code>\ntemplate&lt;class Archive&gt;\nvoid load(boost::basic_iarchive &amp; ar, const unsigned int version) const\n{\n    for(int i = 0; i &lt; 10; ++i){\n        A x;\n        ar &gt;&gt; x;\n        std::pair&lt;std::set::const_iterator, bool&gt; result;\n        result = std::m_set.insert(x);\n        ar.reset_object_address(&amp; (*result.first), &amp;x);\n    }\n}\n</code></pre>\nThis will adjust the tracking information to reflect the final resting place of \nthe moved variable and thereby rectify the above problem.\n<p>\nIf it is known a priori that no pointer\nvalues are duplicated, overhead associated with object tracking can\nbe eliminated by setting the object tracking class serialization trait\nappropriately.\n<p>\nBy default, data types designated primitive by the\n<a target=\"detail\" href=\"traits.html#level\">Implementation Level</a>\nclass serialization trait are never tracked. If it is desired to\ntrack a shared primitive object through a pointer (e.g. a\n<code style=\"white-space: normal\">long</code> used as a reference count), It should be wrapped\nin a class/struct so that it is an identifiable type.\nThe alternative of changing the implementation level of a <code style=\"white-space: normal\">long</code>\nwould affect all <code style=\"white-space: normal\">long</code>s serialized in the whole\nprogram - probably not what one would intend.\n<p>\nIt is possible that we may want to track addresses even though\nthe object is never serialized through a pointer.  For example,\na virtual base class need be saved/loaded only once.  By setting\nthis serialization trait to <code style=\"white-space: normal\">track_always</code>, we can suppress \nredundant save/load operations.\n<pre><code>\nBOOST_CLASS_TRACKING(my_virtual_base_class, boost::serialization::track_always)\n</code></pre>\n\n<h3><a name=\"helpersupport\">Helper Support</a></h3>\nSome types, specially those with complicated lifetime behavior or limited\naccess to their internal state, might need or benefit from elaborate serialization\nalgorithms.  The principle motivating case is that of shared_ptr.  As instances\nare loaded, they have to be \"matched up\" with any other instances which have\nalready been loaded.  Thus, a table of previously loaded instances has to be\nmaintained while the archive containing the shared_ptr instances is being loaded.\nWithout maintaining such a table, the shared_ptr would be a serializable type.\n<p>\nTo implement this facility, one declares a <i>helper object</i>\nassociated to the current archive that can be used to store contextual\ninformation relevant to the particular type serialization algorithm.\n\n<pre><code>\ntemplate&lt;class T&gt;\nclass shared_ptr\n{\n   ...\n};\n\nBOOST_SERIALIZATION_SPLIT_FREE(shared_ptr)\n\nclass shared_ptr_serialization_helper\n{\n  // table of previously loaded shared_ptr\n  // lookup a shared_ptr from the object address\n  shared_ptr&lt;T&gt; lookup(const T *);\n  // insert a new shared_ptr\n  void insert&lt;shared_ptr&lt;T&gt; &gt;(const shared_ptr&lt;T&gt; *);\n};\n\nnamespace boost {\nnamespace serialization {\n\ntemplate&lt;class Archive&gt;\nvoid save(Archive &amp; ar, const shared_ptr &amp; x, const unsigned int /* version */)\n{\n    // save shared ptr\n    ...\n}\n\ntemplate&lt;class Archive&gt;\nvoid load(Archive &amp; ar, shared_ptr &amp; x, const unsigned int /* version */)\n{\n    // get a unique identifier.  Using a constant means that all shared pointers\n    // are held in the same set.  Thus we detect handle multiple pointers to the\n    // same value instances in the archive.\n    const void * shared_ptr_helper_id = 0;\n\n    shared_ptr_serialization_helper &amp; hlp =\n        ar.template get_helper&lt;shared_ptr_serialization_helper&gt;(helper_instance_id);\n\n    // load shared pointer object\n    ...\n\n    shared_ptr_serialization_helper &amp; hlp =\n        ar.template get_helper&lt;shared_ptr_serialization_helper&gt;(shared_ptr_helper_id);\n\n    // look up object in helper object\n    T * shared_object hlp.lookup(...);\n\n    // if found, return the one from the table\n\n    // load the shared_ptr data\n    shared_ptr&lt;T&gt; sp = ...\n\n    // and add it to the table\n    hlp.insert(sp);\n    // implement shared_ptr_serialization_helper load algorithm with the aid of hlp\n}\n\n} // namespace serialization\n} // namespace boost\n</code></pre>\n<code style=\"white-space: normal\">get_helper&lt;shared_ptr_serialization_helper&gt;();</code>\ncreates a helper object associated to the archive the first time it is invoked;\nsubsequent invocations return a reference to the object created in the first\nplace, so that <code style=\"white-space: normal\">hlp</code> can effectively be\nused to store contextual information persisting through the serialization\nof different <code style=\"white-space: normal\">complex_type</code> objects on\nthe same archive.\n\n<p>\nHelpers may be created for saving and loading archives.\nThe same program might have several different helpers or the same helper instantiated\nseparately from different parts of the program.  This is what makes the helper_instance_id\nnecessary.  In principle it could be any unique integer. In practice it seems\neasiest to use the address of the serialization function which contains it. The\nabove example uses this technique.\n\n<h3><a name=\"classinfo\">Class Information</a></h3>\nBy default, for each class serialized, class information is written to the archive.\nThis information includes version number, implementation level and tracking\nbehavior.  This is necessary so that the archive can be correctly\ndeserialized even if a subsequent version of the program changes\nsome of the current trait values for a class.  The space overhead for\nthis data is minimal.  There is a little bit of runtime overhead\nsince each class has to be checked to see if it has already had its\nclass information included in the archive.  In some cases, even this\nmight be considered too much.  This extra overhead can be eliminated\nby setting the \n<a target=\"detail\" href=\"traits.html#level\">implementation level</a>\nclass trait to: <code style=\"white-space: normal\">boost::serialization::object_serializable</code>. \n<p>\n<i>Turning off tracking and class information serialization will result\nin pure template inline code that in principle could be optimised down\nto a simple stream write/read.</i>  Elimination of all serialization overhead\nin this manner comes at a cost.  Once archives are released to users, the\nclass serialization traits cannot be changed without invalidating the old\narchives.  Including the class information in the archive assures us\nthat they will be readable in the future even if the class definition\nis revised.  A light weight structure such as a display pixel might be\ndeclared in a header like this:\n\n<pre><code>\n#include &lt;boost/serialization/serialization.hpp&gt;\n#include &lt;boost/serialization/level.hpp&gt;\n#include &lt;boost/serialization/tracking.hpp&gt;\n\n// a pixel is a light weight struct which is used in great numbers.\nstruct pixel\n{\n    unsigned char red, green, blue;\n    template&lt;class Archive&gt;\n    void serialize(Archive &amp; ar, const unsigned int /* version */){\n        ar &lt;&lt; red &lt;&lt; green &lt;&lt; blue;\n    }\n};\n\n// elminate serialization overhead at the cost of\n// never being able to increase the version.\nBOOST_CLASS_IMPLEMENTATION(pixel, boost::serialization::object_serializable);\n\n// eliminate object tracking (even if serialized through a pointer)\n// at the risk of a programming error creating duplicate objects.\nBOOST_CLASS_TRACKING(pixel, boost::serialization::track_never)\n</code></pre>\n\n<h3><a name=\"portability\">Archive Portability</a></h3>\nSeveral archive classes create their data in the form of text or a portable binary format.  \nIt should be possible to save such a class on one platform and load it on another.  \nThis is subject to a couple of conditions.\n<h4><a name=\"numerics\">Numerics</a></h4>\nThe architecture of the machine reading the archive must be able hold the data\nsaved.  For example, the gcc compiler reserves 4 bytes to store a variable of type\n<code style=\"white-space: normal\">wchar_t</code> while other compilers reserve only 2 bytes.  \nSo it's possible that   a value could be written that couldn't be represented by the loading program.  This is a\nfairly obvious situation and easily handled by using the numeric types in\n<a target=\"cstding\" href=\"../../../boost/cstdint.hpp\">&lt;boost/cstdint.hpp&gt;</a>\n<P>\nA special integral type is <code>std::size_t</code> which is a typedef\nof an integral types guaranteed to be large enough\nto hold the size of any collection, but its actual size can differ depending\non the platform. The \n<a href=\"wrappers.html#collection_size_type\"><code>collection_size_type</code></a>\nwrapper exists to enable a portable serialization of collection sizes by an archive.\nRecommended choices for a portable serialization of collection sizes are to \nuse either 64-bit or variable length integer representation.\n\n\n<h4><a name=\"traits\">Traits</a></h4>\nAnother potential problem is illustrated by the following example:\n<pre><code>\ntemplate&lt;class T&gt;\nstruct my_wrapper {\n    template&lt;class Archive&gt;\n    Archive &amp; serialize ...\n};\n\n...\n\nclass my_class {\n    wchar_t a;\n    short unsigned b;\n    template&lt;class Archive&gt;\n    Archive &amp; serialize(Archive &amp; ar, unsigned int version){\n        ar &amp; my_wrapper(a);\n        ar &amp; my_wrapper(b);\n    }\n};\n</code></pre>\nIf <code style=\"white-space: normal\">my_wrapper</code> uses default serialization\ntraits there could be a problem.  With the default traits, each time a new type is\nadded to the archive, bookkeeping information is added. So in this example, the\narchive would include such bookkeeping information for \n<code style=\"white-space: normal\">my_wrapper&lt;wchar_t&gt;</code> and for\n<code style=\"white-space: normal\">my_wrapper&lt;short_unsigned&gt;</code>.\nOr would it?  What about compilers that treat \n<code style=\"white-space: normal\">wchar_t</code> as a\nsynonym for <code style=\"white-space: normal\">unsigned short</code>?\nIn this case there is only one distinct type - not two.  If archives are passed between\nprograms with compilers that differ in their treatment \nof <code style=\"white-space: normal\">wchar_t</code> the load operation will fail\nin a catastrophic way.\n<p>\nOne remedy for this is to assign serialization traits to the template\n<code style=\"white-space: normal\">my_template</code> such that class\ninformation for instantiations of this template is never serialized.  This \nprocess is described <a target=\"detail\" href=\"traits.html#templates\">above</a> and\nhas been used for <a target=\"detail\" href=\"wrappers.html#nvp\"><strong>Name-Value Pairs</strong></a>.\nWrappers would typically be assigned such traits.\n<p>\nAnother way to avoid this problem is to assign serialization traits\nto all specializations of the template <code style=\"white-space: normal\">my_wrapper</code>\nfor all primitive types so that class information is never saved.  This is what has\nbeen done for our implementation of serializations for STL collections.\n\n<h3><a name=\"binary_archives\">Binary Archives</a></h3>\nStandard stream i/o on some systems will expand linefeed characters to carriage-return/linefeed \non output. This creates a problem for binary archives.  The easiest way to handle this is to \nopen streams for binary archives in \"binary mode\" by using the flag \n<code style=\"white-space: normal\">ios::binary</code>.  If this is not done, the archive generated\nwill be unreadable.\n<p>\nUnfortunately, no way has been found to detect this error before loading the archive.  Debug builds\nwill assert when this is detected so that may be helpful in catching this error.\n\n<h3><a name=\"xml_archives\">XML Archives</a></h3>\nXML archives present a somewhat special case. \nXML format has a nested structure that maps well to the \"recursive class member visitor\" pattern \nused by the serialization system. However, XML differs from other formats in that it \nrequires a name for each data member. Our goal is to add this information to the \nclass serialization specification while still permiting the the serialization code to be \nused with any archive. This is archived by requiring that all data serialized to an XML archive\nbe serialized as a <a target=\"detail\" href=\"wrappers.html#nvp\">name-value pair</a>.\nThe first member is the name to be used as the XML tag for the\ndata item while the second is a reference to the data item itself. Any attempt to serialize data\nnot wrapped in a in a <a target=\"detail\" href=\"wrappers.html#nvp\">name-value pair</a> will\nbe trapped at compile time. The system is implemented in such a way that for other archive classes,\njust the value portion of the data is serialized. The name portion is discarded during compilation.\nSo by always using <a target=\"detail\" href=\"wrappers.html#nvp\">name-value pairs</a>, it will\nbe guaranteed that all data can be serialized to all archive classes with maximum efficiency.\n\n<h3><a name=\"export\">Exporting Class Serialization</a></h3>\n<a target=\"detail\" href=\"traits.html#export\">Elsewhere</a> in this manual, we have described \n<code style=\"white-space: normal\">BOOST_CLASS_EXPORT</code>. \nExport implies two things:\n<ul>\n<li>Instantiates code which is not otherwise referred to.\n<li>Associates an external identifier with the class to be serialized.\nThe fact that the class isn't explicitly referred to implies this\nrequirement.\n</ul>\nIn C++, usage of code not explicitly referred to is implemented via\nvirtual functions.  Hence, the need for export is implied by the \nusage of a derived class that is manipulated via a pointer or\nreference to its base class.\n\n<p>\n<code style=\"white-space: normal\">BOOST_CLASS_EXPORT</code> in the same\nsource module that includes any of the archive class headers will\ninstantiate code required to serialize polymorphic pointers of\nthe indicated type to the all those archive classes. If no\narchive class headers are included, then no code will be instantiated.\n\n<p>\nNote that the implemenation of this functionality requires\nthat the <code style=\"white-space: normal\">BOOST_CLASS_EXPORT</code>\nmacro appear <b>after</b> the inclusion of any archive\nclass headers for which code is to be instantiated.\nSo, code that uses <code style=\"white-space: normal\">BOOST_CLASS_EXPORT</code>\nwill look like the following:\n<pre><code>\n#include &lt;boost/archive/text_oarchive.hpp&gt;\n#include &lt;boost/archive/text_oarchive.hpp&gt;\n... // other archives\n\n#include \"a.hpp\" // header declaration for class a\nBOOST_CLASS_EXPORT(a)\n... // other class headers and exports\n</code></pre>\nThis will be true regardless of whether the code is part\nof a stand alone executable, a static library or\na dynamic or shared library.  \n<p>\nIncluding\n<code style=\"white-space: normal\">BOOST_CLASS_EXPORT</code>\nin the \"a.hpp\" header itself as one would do with\nother serialization traits will make it difficult\nor impossible to follow the rule above regarding\ninclusion of archive headers before\n<code style=\"white-space: normal\">BOOST_CLASS_EXPORT</code>\nis invoked. This can best be addressed by using\n<code style=\"white-space: normal\">BOOST_CLASS_EXPORT_KEY</code>\nin the header declarations and\n<code style=\"white-space: normal\">BOOST_CLASS_EXPORT_IMPLEMENT</code>\nin the class definition file.\n\n<p>\nThis system has certain implications for placing code in static or shared\nlibraries.  Placing <code style=\"white-space: normal\">BOOST_CLASS_EXPORT</code>\nin library code will have no effect unless archive class headers are\nalso included.  So when building a library, one should include all headers\nfor all the archive classes which he anticipates using. Alternatively,\none can include headers for just the\n<a href=\"archive_reference.html#polymorphic\">Polymorphic Archives</a>.\n\n<p>\nStrictly speaking, export should not be necessary if all pointer serialization\noccurs through the most derived class.  However, in order to detect\nwhat would be a catastrophic error, the library traps ALL serializations through\na pointer to a polymorphic class which are not exported or otherwise registered.\nSo, in practice, be prepared to register or export all classes with one\nor more virtual functions which are serialized through a pointer. \n\n<p>\nNote that the implementation of this functionality depends upon vendor\nspecific extensions to the C++ language.  So, there is no guaranteed portability\nof programs which use this facility.  However, all C++ compilers which\nare tested with boost provide the required extensions.  The library\nincludes the extra declarations required by each of these compilers.\nIt's reasonable to expect that future C++ compilers will support\nthese extensions or something equivalent.\n\n<h3><a name=\"static_libraries\">Static Libraries and Serialization</a></h3>\nCode for serialization of data types can be saved in libraries\njust as it can for the rest of the type implementation.\nThis works well, and can save a huge amount of compilation time.\n<ul>\n<li>Only compile serialization definitions in the library.\n<li>Explicitly instantiate serialization code for ALL\narchive classes you intend to use in the library.\n<li>For exported types, only use <code style=\"white-space: normal\">BOOST_CLASS_EXPORT_KEY</code>\nin headers.\n<li>For exported types, only use <code style=\"white-space: normal\">BOOST_CLASS_EXPORT_IMPLEMENT</code>\nin definitions compiled in the library.  For any particular type,\nthere should be only one file which contains\n<code style=\"white-space: normal\">BOOST_CLASS_EXPORT_IMPLEMENT</code>\nfor that type.  This ensures that only one copy\nof serialization code will exist within the program.  It avoids\nwasted space and the possibility of having different\nversions of the serialization code in the same program.\nIncluding\n<code style=\"white-space: normal\">BOOST_CLASS_EXPORT_IMPLEMENT</code>\nin multiple files could result in a failure\nto link due to duplicated symbols or the throwing\nof a runtime exception.\n<li> Code for serialization should be only in the library,\n<li>Familiarize yourself with the <b>PIMPL</b> idiom.\n</ul>\nThis is illustrated by\n<a href = \"../example/demo_pimpl.cpp\" target=\"demo_pimpl\">\n<code style=\"white-space: normal\">demo_pimpl.cpp</code>\n</a>,\n<a href = \"../example/demo_pimpl_A.cpp\" target=\"demo_pimpl\">\n<code style=\"white-space: normal\">demo_pimpl_A.cpp</code>\n</a>\nand\n<a href = \"../example/demo_pimpl_A.hpp\" target=\"demo_pimpl\">\n<code style=\"white-space: normal\">demo_pimpl_A.hpp</code>\n</a>\nwhere implementation of serialization is in a static library \ncompletely separate from the main program.\n\n<h3><a name=\"dlls\">DLLS - Serialization and Runtime Linking</a></h3>\nSerialization code can be placed in libraries to be linked at runtime.  That is,\ncode can be placed in DLLS(Windows) Shared Libraries(*nix), or static libraries\nas well as the main executable.  The best technique is the\nsame as that described above for libraries.  The serialization\nlibrary test suite includes the following programs\nto illustrate how this works:\n<p>\n\n<a href = \"../test/test_dll_simple.cpp\" target=\"test_dll_simple\">\n<code style=\"white-space: normal\">test_dll_simple</code>\n</a>,\nand\n<a href = \"../test/dll_a.cpp\" target=\"dll_a\">\n<code style=\"white-space: normal\">dll_a.cpp</code>\n</a>\nwhere implementation of serialization is also completely separate\nfrom the main program but the code is loaded at runtime.  In this\nexample, this code is loaded automatically when the program which\nuses it starts up, but it could just as well be loaded and unloaded \nwith an OS dependent API call.\n<p>\nAlso included are\n<a href = \"../test/test_dll_exported.cpp\" target=\"test_dll_exported\">\n<code style=\"white-space: normal\">test_dll_exported.cpp</code>\n</a>,\nand\n<a href = \"../test/polymorphic_derived2.cpp\" target=\"polymorphic_derived2\">\n<code style=\"white-space: normal\">polymorphic_derived2.cpp</code>\n</a>\nwhich are similar to the above but include tests of the export\nand no_rtti facilities in the context of DLLS.\n<p>\nFor best results, write your code to conform to the following\nguidelines:\n<ul>\n  <li>Don't include <code>inline</code> code in classes used in DLLS.\nThis will generate duplicate code in the DLLS and mainline. This\nneedlessly duplicates code.  Worse, it makes is possible for \ndifferent versions of the same code to exist simultaneously.  This\ntype of error turns out to be excruciatingly difficult to debug.\nFinally, it opens the possibility that a module being referred to\nmight be explicitly unloaded which would (hopefully) result in\na runtime error. This is another bug that is not always \nreproducible or easy to find. For class member templates use something like\n\n<pre><code>\ntemplate&lt;class Archive&gt;\nvoid serialize(Archive &amp; ar, const unsigned int version);\n</code></pre>\nin the header, and\n\n<pre><code>\ntemplate&lt;class Archive&gt;\nvoid myclass::serialize(Archive &amp; ar, const unsigned int version){\n\t...\n}\n\nBOOST_CLASS_EXPORT_IMPLEMENT(my_class)\n\n#include &lt;boost/archive/text_oarchive&gt;\n#include &lt;boost/archive/text_iarchive&gt;\ntemplate myclass::serialize(boost::archive::text_oarchive &amp; ar, const unsigned int version);\ntemplate myclass::serialize(boost::archive::text_iarchive &amp; ar, const unsigned int version);\n... // repeat for each archive class to be used.\n</code></pre>\nin the implementation file.  This will result in generation of all code\nrequired in only one place.  The library does not detect this type of error for you.\n  <li>If DLLS are to be loaded and unloaded explicitly (e.g. using <code>dlopen</code> in *nix or \n<code>LoadLibrary</code> in Windows).  Try to arrange that they are unloaded in the reverse\nsequence.  This should guarantee that problems are avoided even if the\nabove guideline hasn't been followed.\n\n</ul>\n\n<h3><a name=\"plugins\">Plugins</a></h3>\nIn order to implement the library, various facilities for runtime\nmanipulation of types at runtime were required.  These\nare <a target=\"detail\" href=\"extended_type_info.html\"><code>extended_type_info</code></a>\nfor associating classes with external identifying strings (<b>GUID</b>)\nand <a target=\"detail\" href=\"void_cast.html\"><code>void_cast</code></a>\nfor casting between pointers of related types.\n\nTo complete the functionality of \n<a target=\"detail\" href=\"extended_type_info.html\"><code>extended_type_info</code></a>\nthe ability to construct and destroy corresponding types has been\nadded.  In order to use this functionality, one must specify\nhow each type is created.  This should be done at the time\na class is exported.  So, a more complete example of the code above would be:\n\n<pre><code>\n#include &lt;boost/archive/text_oarchive.hpp&gt;\n#include &lt;boost/archive/text_oarchive.hpp&gt;\n... // other archives\n\n#include \"a.hpp\" // header declaration for class a\n\n// this class has a default constructor\nBOOST_SERIALIZATION_FACTORY_0(a)\n// as well as one that takes one integer argument\nBOOST_SERIALIZATION_FACTORY_1(a, int)\n\n// specify the GUID for this class\nBOOST_CLASS_EXPORT(a)\n... // other class headers and exports\n</code></pre>\n\nWith this in place, one can construct, serialize and destroy a class\nabout which is known only the <b>GUID</b> and a base class.\n\n\n<h3><a name=\"multi_threading\">Multi-Threading</a></h3>\nThe fundamental purpose of serialization would conflict with multiple \nthreads concurrently writing/reading from/to a single open archive instance.\nThe library implementation presumes that the application avoids such a situation.\n<p>\nHowever, Writing/Reading different archives simultaneously\nin different tasks is permitted as each archive instance is (almost) \ncompletely independent from any other archive instance.  The only shared \ninformation is some type tables which have been implemented using a \nlock-free thread-safe \n<a target=\"detail\" href=\"singleton.html\">\n<code style=\"white-space: normal\">singleton</code>\n</a>\ndescribed elsewhere in this documentation.\n<p>\nThis singleton implementation guarantees that all of this shared\ninformation is initialized when the code module which contains\nit is loaded.  The serialization library takes care to\nensure that these data structures are not subsequently\nmodified. The only time there could be a problem would\nbe if code is loaded/unloaded while another task is\nserializing data.  This could only occur for types whose \nserialization is implemented in a dynamically loaded/unloaded DLL\nor shared library.  So if the following is avoided:\n<ul>\n    <li>Accessing the same archive instance from different tasks.\n    <li>Loading/Unloading DLLS or shared libraries while any archive\n    instances are open.\n</ul>\nThe library should be thread safe.\n\n<h3><a name=\"optimizations\">Optimizations</a></h3>\nIn performance critical applications that serialize large sets of contiguous data of homogeneous\ntypes one wants to avoid the overhead of serializing each element individually, which is\nthe motivation for the <a href=\"wrappers.html#arrays\"><code>array</code></a>\nwrapper.\n\nSerialization functions for data types containing contiguous arrays of homogeneous\ntypes, such as for <code>std::vector</code>, <code>std::valarray</code> or  \n<code>boost::multiarray</code> should serialize them using an\n<a href=\"wrappers.html#arrays\"><code>array</code></a> wrapper to make use of \nthese optimizations.\n\nArchive types that can provide optimized serialization for contiguous arrays of \nhomogeneous types should implement these by overloading the serialization of\nthe  <a href=\"wrappers.html#arrays\"><code>array</code></a> wrapper, as is done\nfor the binary archives.\n\n\n<h3><a href=\"exceptions.html\">Archive Exceptions</a></h3>\n<h3><a href=\"exception_safety.html\">Exception Safety</a></h3>\n\n<hr>\n<p><i>&copy; Copyright <a href=\"http://www.rrsd.com\">Robert Ramey</a> 2002-2004. \nDistributed under the Boost Software License, Version 1.0. (See\naccompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n</i></p>\n</body>\n</html>\n"
  },
  {
    "path": "doc/state_saver.html",
    "content": "<!doctype HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">\n<html>\n<!--\n(C) Copyright 2002-4 Robert Ramey - http://www.rrsd.com . \nUse, modification and distribution is subject to the Boost Software\nLicense, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\nhttp://www.boost.org/LICENSE_1_0.txt)\n-->\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\n<link rel=\"stylesheet\" type=\"text/css\" href=\"../../../boost.css\">\n<link rel=\"stylesheet\" type=\"text/css\" href=\"style.css\">\n<title>Serialization - <code style=\"white-space: normal\">state_saver</code></title>\n</head>\n<body link=\"#0000ff\" vlink=\"#800080\">\n<table border=\"0\" cellpadding=\"7\" cellspacing=\"0\" width=\"100%\" summary=\"header\">\n  <tr> \n    <td valign=\"top\" width=\"300\"> \n      <h3><a href=\"../../../index.htm\"><img height=\"86\" width=\"277\" alt=\"C++ Boost\" src=\"../../../boost.png\" border=\"0\"></a></h3>\n    </td>\n    <td valign=\"top\"> \n      <h1 align=\"center\">Serialization</h1>\n      <h2 align=\"center\"><code style=\"white-space: normal\">state_saver</code</h2>\n    </td>\n  </tr>\n</table>\n<hr>\n<p>\nSometimes a certain value has to change only for a limited scope. \nThis class wrapper saves a copy of the current state of some object, \nand resets the object's state at destruction time, undoing any change the object \nmay have gone through.  Here is the interface:\n\n<pre><code>\ntemplate&lt;class T&gt;\n// T requirements:\n//  - POD or object semantic (cannot be reference, function, ...)\n//  - copy constructor\n//  - operator = (no-throw one preferred)\nclass state_saver : private boost::noncopyable\n{\nprivate:\n    ... // implementation\n\npublic:\n    state_saver(T &amp; object);\n    ~state_saver();\n};\n</code></pre>\n\nThe complete implementation can be found\n<a target=\"state_saver\" href=\"../../../boost/serialization/state_saver.hpp\">here</a>\n\nThe following illustrates how this is expected to be used.\n\n<pre><code>\n#include &lt;boost/state_saver.hpp&gt;\n\nvoid func(A &amp; a)\n    boost::state_saver&lt;A&gt; s(a);\n    ... // alter state of a by calling non-const functions\n    ... // call other functions\n    // original state of a automatically restored on exit\n}\n</pre></code>\n\n<h3>History</h3>\nThis is a generalization of Daryle Walker's \n<a href=\"../../../libs/io/doc/ios_state.html\">io_state_saver</a> library.\n<p>\nRobert Ramey made an initial version for the serialization library.\n<p>\nPavel Vozenilek made several non-obvious refinements to make it more\nsecure and boost friendly\n\n<hr>\n<p><i>&copy; Copyright <a href=\"http://www.rrsd.com\">Robert Ramey</a> 2002-2004. \nDistributed under the Boost Software License, Version 1.0. (See\naccompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n</i></p>\n</body>\n</html>\n"
  },
  {
    "path": "doc/static_warning.html",
    "content": "<!doctype HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">\n<html>\n<!--\n(C) Copyright 2002-4 Robert Ramey - http://www.rrsd.com . \nUse, modification and distribution is subject to the Boost Software\nLicense, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\nhttp://www.boost.org/LICENSE_1_0.txt)\n-->\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\n<link rel=\"stylesheet\" type=\"text/css\" href=\"../../../boost.css\">\n<link rel=\"stylesheet\" type=\"text/css\" href=\"style.css\">\n<title>Serialization - BOOST_STATIC_WARNING</title>\n</head>\n<body link=\"#0000ff\" vlink=\"#800080\">\n<table border=\"0\" cellpadding=\"7\" cellspacing=\"0\" width=\"100%\" summary=\"header\">\n  <tr> \n    <td valign=\"top\" width=\"300\"> \n      <h3><a href=\"../../../index.htm\"><img height=\"86\" width=\"277\" alt=\"C++ Boost\" src=\"../../../boost.png\" border=\"0\"></a></h3>\n    </td>\n    <td valign=\"top\"> \n      <h1 align=\"center\">Serialization</h1>\n      <h2 align=\"center\"><code>BOOST_STATIC_WARNING</code></h2>\n    </td>\n  </tr>\n</table>\n<hr>\n\nThe header <code>&lt;boost/serialization/static_warning.hpp&gt;</code> supplies a single macro \n<code style=\"white-space: normal\">BOOST_STATIC_WARNING(x)</code>, which generates a compile time warning message if \nthe integral-constant-expression x is not true. \n<p>\nNote that if the condition is true, then the macro will generate neither \ncode nor data - and the macro can also be used at either namespace, \nclass or function scope. When used in a template, the expression x \nwill be evaluated at the time the template is instantiated; this is \nparticularly useful for validating template parameters. \n<p>\nIt is intended that the functioning of <code style=\"white-space: normal\">BOOST_STATIC_WARNING(x)</code>\nbe identical to that of <code style=\"white-space: normal\">BOOST_STATIC_ASSERT(x)</code>\nexcept that rather than resulting in a compilation error, it will result in\na compiler warning.  In all other respects it should be the same.  So\nfor more information on using <code style=\"white-space: normal\">BOOST_STATIC_WARNING(x)</code>\nconsult the documentation for <code style=\"white-space: normal\">BOOST_STATIC_ASSERT(x)</code>\n<a href=\"../../../doc/html/boost_staticassert.html\">here</a>.\n\n<hr>\n<p><i>&copy; Copyright <a href=\"http://www.rrsd.com\">Robert Ramey</a> 2002-2004. \nDistributed under the Boost Software License, Version 1.0. (See\naccompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n</i></p>\n</body>\n</html>\n"
  },
  {
    "path": "doc/strong_typedef.html",
    "content": "<!doctype HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">\n<html>\n<!--\n(C) Copyright 2002-4 Robert Ramey - http://www.rrsd.com . \nUse, modification and distribution is subject to the Boost Software\nLicense, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\nhttp://www.boost.org/LICENSE_1_0.txt)\n-->\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\n<link rel=\"stylesheet\" type=\"text/css\" href=\"../../../boost.css\">\n<link rel=\"stylesheet\" type=\"text/css\" href=\"style.css\">\n<title>Serialization - BOOST_STATIC_WARNING</title>\n</head>\n<body link=\"#0000ff\" vlink=\"#800080\">\n<table border=\"0\" cellpadding=\"7\" cellspacing=\"0\" width=\"100%\" summary=\"header\">\n  <tr> \n    <td valign=\"top\" width=\"300\"> \n      <h3><a href=\"../../../index.htm\"><img height=\"86\" width=\"277\" alt=\"C++ Boost\" src=\"../../../boost.png\" border=\"0\"></a></h3>\n    </td>\n    <td valign=\"top\"> \n      <h1 align=\"center\">Serialization</h1>\n      <h2 align=\"center\"><code style=\"white-space: normal\">BOOST_STRONG_TYPEDEF</code></h2>\n    </td>\n  </tr>\n</table>\n<hr>\n<h3>Motivation</h3>\n<code style=\"white-space: normal\">typedef</code> creates an alias for an existing type.  It does not create\na new type that can be used for matching either function or template parameters.\nThis can be shown by trying to compile the following example.\n<pre></code>\ntypedef int a;\nvoid f(int x);  // (1) function to handle simple integers\nvoid f(a x);    // (2) special function to handle integers of type a \nint main(){\n    int x = 1;\n    a y;\n    y = x;      // other operations permitted as a is converted as necessary\n    f(x);       // chooses (1)\n    f(y);       // chooses (2)\n}\n</code></pre>\nSince typedef doesn't create a new type, this program can't compile to code\nthat implements its obvious intention.  \n<p>\nUsage of BOOST_STRONG_TYPEDEF\naddresses this.\n<pre></code>\n<a target=\"strong_typedef\" href=\"../../../boost/strong_typedef.hpp\">\n#include &lt;boost/serialization/strong_typedef.hpp&gt;\n</a>\n\nBOOST_STRONG_TYPEDEF(int, a)\nvoid f(int x);  // (1) function to handle simple integers\nvoid f(a x);    // (2) special function to handle integers of type a \nint main(){\n    int x = 1;\n    a y;\n    y = x;      // other operations permitted as a is converted as necessary\n    f(x);       // chooses (1)\n    f(y);       // chooses (2)\n}\n</code></pre>\nThe program will now compile and run as expected.\n\n<h3>Usage</h3>\nSyntax of <code style=\"white-space: normal\">BOOST_STRONG_TYPEDEF</code>\nhas been designed to be similar to the standard\n<code style=\"white-space: normal\">typedef</code>.  So\n\n<pre><code>\nBOOST_STRONG_TYPEDEF(primitive type, name)\n</code></pre>\n\nwill create a new type \"name\" which will be substitutable for the original\ntype but still of distinct type.\n\n<h3>Implemenation</h3>\n<code style=\"white-space: normal\">BOOST_STRONG_TYPEDEF</code> is a macro\nwhich generates a class named \"name\" which wraps an instance of its\nprimitive type and provides appropriate conversion operators in order\nto make the new type substitutable for the one that it wraps.\n\n<hr>\n<p><i>&copy; Copyright <a href=\"http://www.rrsd.com\">Robert Ramey</a> 2002-2004. \nDistributed under the Boost Software License, Version 1.0. (See\naccompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n</i></p>\n</body>\n</html>\n"
  },
  {
    "path": "doc/style.css",
    "content": "pre{\n  BORDER-RIGHT: gray 1pt solid;\n  BORDER-TOP: gray 1pt solid;\n  BORDER-LEFT: gray 1pt solid;\n  BORDER-BOTTOM: gray 1pt solid;\n  MARGIN-LEFT: 0pt;\n  background-color: #EEEEEE;\n}\n\n/*\n(C) Copyright 2008 Robert Ramey - http://www.rrsd.com . \nUse, modification and distribution is subject to the Boost Software\nLicense, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\nhttp://www.boost.org/LICENSE_1_0.txt)\n*/"
  },
  {
    "path": "doc/todo.html",
    "content": "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">\n<html>\n<!--\n(C) Copyright 2002-4 Robert Ramey - http://www.rrsd.com . \nUse, modification and distribution is subject to the Boost Software\nLicense, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\nhttp://www.boost.org/LICENSE_1_0.txt)\n-->\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\n<link rel=\"stylesheet\" type=\"text/css\" href=\"../../../boost.css\">\n<link rel=\"stylesheet\" type=\"text/css\" href=\"style.css\">\n<title>Serialization - To Do</title>\n</head>\n<body link=\"#0000ff\" vlink=\"#800080\">\n<table border=\"0\" cellpadding=\"7\" cellspacing=\"0\" width=\"100%\" summary=\"header\">\n  <tr> \n    <td valign=\"top\" width=\"300\"> \n      <h3><a href=\"../../../index.htm\"><img height=\"86\" width=\"277\" alt=\"C++ Boost\" src=\"../../../boost.png\" border=\"0\"></a></h3>\n    </td>\n    <td valign=\"top\"> \n      <h1 align=\"center\">Serialization</h1>\n      <h2 align=\"center\">To Do</h2>\n    </td>\n  </tr>\n</table>\n<hr>\n<dl class=\"index\">\n  <dt><a href=\"#portablebinaryarchives\">Portable Binary Archives</a></dt>\n  <dt><a href=\"#performancetesting\">Performance Testing and Profiling</a></dt>\n  <dt><a href=\"#backversioning\">Back Versioning</a></dt>\n  <dt><a href=\"#nortti\">Testing for Environments with No RTTI</a></dt>\n  <dt><a href=\"new_case_studies.html\">Additional Case Studies</a></dt>\n</dl>\n\nThese are enhancements that the serialization library needs but have not been done.\nSome of these projects, though tricky, are not huge and would be suitable\nfor someone who has a limited time to spend on them.  In particular, they\nmight be of interest as student projects such as the Google Summer of Code.\n\n<h2><a name=\"portablebinaryarchives\"></a>Portable Binary Archives</h2>\nCurrently there is a portable binary archive in the examples directory.\nIt is not regularly submitted to the exhaustive boost testing regimen\nbut it is tested occasionally and has been used in production code.\n<p>\nIt's missing the following:\n<ul>\n  <li>Addition of portable floating point types.  This is not trivial.  In addition to\n  handling floating point types of varying sizes, It requires\n  handling invalid floating point numbers (NaNs) in a portable manner.\n  <li>Integration into the Boost testing regimen similar to the other archive classes.\n</ul>\n\n<h2><a name=\"performancetesting\"></a>Performance Testing and Profiling</h2>\n\nI've managed to setup performance profiling using the following:\n<ul>\n  <li>current (as I write this) Boost.Build tools.\n  <li>the gcc compiler.\n  <li>and a shell script - profile.sh\n  <li>library_status program from the tools/regression/src directory\n</ul>\nInvoking profile script produces a \n<a href=\"performance_status.html\">table</a>\nwhich shows the results of each test and links to the actual\nprofile.\n<p>\nThe first thing I did was include some of the serialization library tests.\nIt became immediately apparent that these tests were totally unsuitable\nfor performance testing and that new tests needed to be written for this \npurpose.  These tests would highlight the location of any performance\nbottlenecks in the serialization library.  Whenever I've subjected my\ncode in the past to this type of analysis, I've always been surprised\nto find bottlenecks in totally unanticipated places and fixing those\nhas always led to large improvements in performance.  I expect that\nthis project would have a huge impact on the utility of the serialization\nlibrary.\n\n<h2><a name=\"backversioning\"></a>Back Versioning</h2>\n\nIt has been suggested that a useful feature of the library would be\nthe ability to create \"older versions\" of archives.  Currently,\nthe library permits one to make programs that are guaranteed\nthe ability to load archives with classes of a previous version. \nBut there is no way to save classes in accordance with a\nprevious version.  At first I dismissed this as a huge project\nwith small demand.  A cursory examination of the code revealed\nthat this would not be very difficult.  It would require some\nsmall changes in code and some additional tests.  Also it\nwould require special treatment in the documentation - perhaps\na case study.\n\n\n<h2><a name=\"nortti\"></a>Environments without RTTI</h2>\n\nI note that some have commented that this library requires RTTI.\nThis is not strictly true.  The examples and almost all the\ntests presume the existence of RTTI.  But it should be possible\nto use the library without it.  The example used for testing is an \n<code style=\"white-space: normal\">extended_typeinfo</code> \nimplemenation which presumes that all classes names have been exported. \nSo, to make this library compatible for platforms without RTTI, \na set of tests, examples and new manual section would have to be created.\n\n<hr>\n<p>Revised 1 November, 2008 \n<p><i>&copy; Copyright <a href=\"http://www.rrsd.com\">Robert Ramey</a> 2002-2008. \nDistributed under the Boost Software License, Version 1.0. (See\naccompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n</i></p>\n</body>\n</html>\n"
  },
  {
    "path": "doc/traits.html",
    "content": "<!doctype HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">\n<html>\n<!--\n(C) Copyright 2002-4 Robert Ramey - http://www.rrsd.com . \nUse, modification and distribution is subject to the Boost Software\nLicense, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\nhttp://www.boost.org/LICENSE_1_0.txt)\n-->\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\n<link rel=\"stylesheet\" type=\"text/css\" href=\"../../../boost.css\">\n<link rel=\"stylesheet\" type=\"text/css\" href=\"style.css\">\n<title>Serialization - Class Serialization Traits</title>\n</head>\n<body link=\"#0000ff\" vlink=\"#800080\">\n<table border=\"0\" cellpadding=\"7\" cellspacing=\"0\" width=\"100%\" summary=\"header\">\n  <tr> \n    <td valign=\"top\" width=\"300\"> \n      <h3><a href=\"../../../index.htm\"><img height=\"86\" width=\"277\" alt=\"C++ Boost\" src=\"../../../boost.png\" border=\"0\"></a></h3>\n    </td>\n    <td valign=\"top\"> \n      <h1 align=\"center\">Serialization</h1>\n      <h2 align=\"center\">Class Serialization Traits</h2>\n    </td>\n  </tr>\n</table>\n<hr>\n<dl class=\"page-index\">\n  <dt><a href=\"#version\">Version</a>\n  <dt><a href=\"#level\">Implementation Level</a>\n  <dt><a href=\"#tracking\">Object Tracking</a>\n  <dt><a href=\"#export\">Export Key</a>\n  <dt><a href=\"#abstract\">Abstract</a>\n  <dt><a href=\"#typeinfo\">Type Information Implementation</a>\n  <dt><a href=\"#wrappers\">Wrappers</a>\n  <dt><a href=\"#bitwise\">Bitwise Serialization</a>\n  <dt><a href=\"#templates\">Template Serialization Traits</a>\n  <dt><a href=\"#compiletime_messages\">Compile Time Warnings and Errors</a>\n</dl>\nSerialization of data depends on the type of the data.  For example, for\nprimitive types such as <code style=\"white-space: normal\">int</code>, it wouldn't make sense to save\na version number in the archive. Likewise, for a data type that is never\nserialized through a pointer, it would (almost) never make sense to track\nthe address of objects saved to/loaded from the archive as it will never\nbe saved/loaded more than once in any case.  Details of\nserialization for a particular data type will vary depending on the\ntype, the way it is used and specifications of the programmer. \n<p>\nOne can alter the manner in which a particular data type is serialized\nby specifying one or more <strong>class serialization traits</strong>.\nIt is not generally necessary for the programmer to explicitly assign\ntraits to his classes as there are default values for all traits.\nIf the default values are not appropriate they can be assigned by the programmer.\nA template is used to associate a typename with a constant.  For example\nsee <a href=\"../../../boost/serialization/version.hpp\" target=\"version_hpp\">\nversion.hpp</a>.  \n<h3><a name=\"version\">Version</a></h3>\nThis header file includes the following code:\n\n<pre><code>\nnamespace boost { \nnamespace serialization {\ntemplate&lt;class T&gt;\nstruct version\n{\n    BOOST_STATIC_CONSTANT(unsigned int, value = 0);\n};\n} // namespace serialization\n} // namespace boost\n</code></pre>\n\nFor any class <code style=\"white-space: normal\">T</code>, The default definition \nof <code style=\"white-space: normal\">boost::serialization::version&lt;T&gt;::value</code> is 0. \nIf we want to assign a value of 2 as the version for class <code style=\"white-space: normal\">my_class</code>\nwe specialize the version template:\n<pre><code>\nnamespace boost { \nnamespace serialization {\nstruct version&lt;my_class&gt;\n{\n    BOOST_STATIC_CONSTANT(unsigned int, value = 2);\n};\n} // namespace serialization\n} // namespace boost\n</code></pre>\nNow whenever the version number for class <code style=\"white-space: normal\">my_class</code> is required,\nthe value 2 will be returned rather than the default value of 0.\n<p>\nTo diminish typing and enhance readability, a macro is defined\nso that instead of the above, we could write:\n<pre><code>\nBOOST_CLASS_VERSION(my_class, 2)\n</code></pre>\nwhich expands to the code above.\n\n<h3><a name=\"level\">Implementation Level</a></h3>\nIn the same manner as the above, the \"level\" of implementation of serialization is\nspecified.  The header file <a href=\"../../../boost/serialization/level.hpp\" \ntarget=\"level_hpp\">level.hpp</a> defines the following.\n<pre><code>\n// names for each level\nenum level_type\n{\n    // Don't serialize this type. An attempt to do so should\n    // invoke a compile time assertion.\n    not_serializable = 0,\n    // write/read this type directly to the archive. In this case\n    // serialization code won't be called.  This is the default\n    // case for fundamental types.  It presumes a member function or\n    // template in the archive class that can handle this type.\n    // there is no runtime overhead associated reading/writing\n    // instances of this level\n    primitive_type = 1,\n    // Serialize the objects of this type using the objects \"serialize\"\n    // function or template. This permits values to be written/read\n    // to/from archives but includes no class or version information. \n    object_serializable = 2,\n    ///////////////////////////////////////////////////////////////////\n    // once an object is serialized at one of the above levels, the\n    // corresponding archives cannot be read if the implementation level\n    // for the archive object is changed.  \n    ///////////////////////////////////////////////////////////////////\n    // Add class information to the archive.  Class information includes\n    // implementation level, class version and class name if available.\n    object_class_info = 3,\n};\n</code></pre>\nUsing a macro defined in <code style=\"white-space: normal\">level.hpp</code> we can specify\nthat <code style=\"white-space: normal\">my_class</code> should be serialized along with its version number:\n<pre><code>\nBOOST_CLASS_IMPLEMENTATION(my_class, boost::serialization::object_class_info)\n</code></pre>\nIf implementation level is not explicitly assigned, the system uses\na default according to the following rules.\n<ul>\n  <li>if the data type is <code style=\"white-space: normal\">volatile</code> \nassign <code style=\"white-space: normal\">not_serializable</code>\n  <li>else if it's an enum or fundamental type assign <code style=\"white-space: normal\">primitive_type</code>\n  <li>else assign <code style=\"white-space: normal\">object_class_info</code>\n</ul>\nThat is, for most user defined types, objects will be serialized along with\nclass version information. This will permit one to maintain backward\ncompatibility with archives which contain previous versions.  However, with this \nability comes a small runtime cost.  For types whose definition will \"never\" \nchange, efficiency can be gained by specifying <code style=\"white-space: normal\">object_serializable</code> \nto override the default setting of <code style=\"white-space: normal\">object_class_info</code>.  \nFor example, \nthis has been done for the  \n<a href=\"../../../boost/serialization/binary_object.hpp\" target=\"binary_object_hpp\">\nbinary_object wrapper</a>\n\n<h3><a name=\"tracking\">Object Tracking</a></h3>\nDepending on the way a type is used, it may be necessary or convenient to\ntrack the address of objects saved and loaded.  For example, this is generally\nnecessary while serializing objects through a pointer in order to be sure\nthat multiple identical objects are not created when an archive is loaded.\nThis \"tracking behavior\" is controlled by the type trait defined in the header\nfile <a href=\"../../../boost/serialization/tracking.hpp\" target=\"tracking_hpp\">tracking.hpp</a>\nwhich defines the following:\n<pre><code>\n// names for each tracking level\nenum tracking_type\n{\n    // never track this type\n    track_never = 0,\n    // track objects of this type if the object is serialized through a \n    // pointer.\n    track_selectively = 1,\n    // always track this type\n    track_always = 2\n};\n</code></pre>\nA corresponding macro is defined so that we can use:\n<pre><code>\nBOOST_CLASS_TRACKING(my_class, boost::serialization::track_never)\n</code></pre>\nDefault tracking traits are:\n<ul>\n  <li>For primitive, <code style=\"white-space: normal\">track_never</code>.\n  <li>For pointers, <code style=\"white-space: normal\">track_never</code>.\n  That is, addresses of addresses are not tracked by default.\n  <li>All current serialization wrappers such as <code style=\"white-space: normal\">boost::serialization::nvp</code>,\n  <code style=\"white-space: normal\">track_never</code>.\n  <li>For all other types, <code style=\"white-space: normal\">track_selectively</code>.\n  That is addresses of serialized objects are tracked if and only if\n  one or more of the following is true:\n  <ul>\n  <li>an object of this type is anywhere in the program serialized\n  through a pointer.\n  <li>the class is explicitly \"exported\" - see below.\n  <li>the class is explicitly \"registered\" in the archive\n  </ul>\n</ul>\n\n<p>\nThe default behavior is almost always the most convenient one.  However,\nthere a few cases where it would be desirable to override the\ndefault.  One case is that of a virtual base class. In a diamond\ninheritance structure with a virtual base class, object tracking\nwill prevent redundant save/load invocations.  So here is one\ncase where it might be convenient to override the default tracking\ntrait. <i>(Note: in a future version the default will be reimplemented\nto automatically track classes used as virtual bases).</i> This \nsituation is demonstrated by \n<a href=\"../test/test_diamond.cpp\" target=\"test_diamond_cpp\">test_diamond.cpp</a>\nincluded with the library.\n\n<h3><a name=\"export\">Export Key</a></h3>\n\nWhen serializing a derived class through a virtual base class pointer,\ntwo issues may arise.\n<ul>\n<li> The code in the derived class might never be explicitly\nreferred to.  Such code will never be instantiated.\n<p>\nThis is addressed by invoking \n<code style=\"white-space: normal\">BOOST_CLASS_EXPORT_IMPLEMENT(T)</code>\nin the file which defines (implements) the class T.\nThis ensures that code for the derived class T will\nbe explicitly instantiated.\n<li> There needs to be some sort of identifier which can\nbe used to select the code to be invoked when the object\nis loaded.\nStandard C++ does implement <code style=\"white-space: normal\">typeid()</code> which can be\nused to return a unique string for the class.  This is not entirely\nsatisfactory for our purposes for the following reasons:\n<ul>\n  <li>There is no guarantee that the string is the same across platforms.\n  This would then fail to support portable archives.\n  <li>In using code modules from various sources, classes may have\n  to be wrapped in different namespaces in different programs.\n  <li>There might be classes locally defined in different code modules\n  that have the same name. \n  <li>There might be classes with different names that we want to\n  consider equivalent for purposes of serialization.\n</ul>\n<p>\nSo in the serialization library, this is addressed by invoking\n<code style=\"white-space: normal\">BOOST_CLASS_EXPORT_KEY2(my_class, \"my_class_external_identifier\")</code>\nin the header file which declares the class.\nIn a large majority of applications, the class name works just fine\nfor the external identifier string so the following short cut is\ndefined -\n<code style=\"white-space: normal\">BOOST_CLASS_EXPORT_KEY(my_class)</code>.\n</ul>\nFor programs which consist of only one module - that is \nprograms which do not use DLLS, one can specify\n<code style=\"white-space: normal\">BOOST_CLASS_EXPORT(my_class)</code>\nor\n<code style=\"white-space: normal\">BOOST_CLASS_EXPORT_GUID(my_class, \"my_class_external_identifier\")</code>\nin either the declaration header or definition.  These macros\nexpand to invocation of both of the macros described above.\n<i>(<b>GUID</b> stands for <b>G</b>lobally <b>U</b>nique <b>ID</b>entifier.)</i>\n<p>\n<i>(<a target=\"detail\" href=\"special.html#export\">Elsewhere</a>\nin this manual, the serialization of derived classes is addressed in detail.)</i>\n<p>\nThe header file\n<a href=\"../../../boost/serialization/export.hpp\" target=\"export_hpp\">export.hpp</a>\ncontains all macro definitions described here.\nThe library will throw a runtime exception if\n<ul>\n<li> A type not explicitly referred to is not exported.\n<li> Serialization code for the same type is instantiated\nin more than one module (or DLL).\n</ul>\n\n<h3><a name=\"abstract\">Abstract</a></h3>\nWhen serializing an object through a pointer to its base class,\nthe library needs to determine whether or not the base is abstract\n(i.e. has at least one virtual function).  The library uses the\ntype trait macro <code style=\"white-space: normal\">BOOST_IS_ABSTRACT(T)</code>\nto do this.  Not all compilers support this type trait and corresponding\nmacro.  To address this, the macro <code style=\"white-space: normal\">\nBOOST_SERIALIZATION_ASSUME_ABSTRACT(T)</code> has been\nimplemented to permit one to explicitly indicate that a specified\ntype is in fact abstract.  This will guarentee that\n<code style=\"white-space: normal\">BOOST_IS_ABSTRACT</code>\nwill return the correct value for all compilers.\n\n<h3><a name=\"typeinfo\">Type Information Implementation</a></h3>\nThis last trait is also related to the serialization of objects\nthrough a base class pointer.  The implementation of this facility\nrequires the ability to determine at run time the true type of the\nobject that a base class pointer points to.  Different serialization\nsystems do this in different ways.  In our system, the default method\nis to use the function <code style=\"white-space: normal\">typeid(...)</code> which is available \nin systems which support <b>RTTI</b> (<b>R</b>un <b>T</b>ime \n<b>T</b>ype <b>I</b>nformation).\nThis will be satisfactory in almost all cases and most users of this \nlibrary will lose nothing in skipping this section of the manual.\n<p>\nHowever, there are some cases where the default type determination\nsystem is not convenient.  Some platforms might not support\nRTTI or it may have been disabled in order to speed execution\nor for some other reason.  Some applications, E.G. runtime linking\nof plug-in modules, can't depend on C++ RTTI to determine the\ntrue derived class.  RTTI only returns the correct type for polymorphic\nclasses - classes with at least one virtual function.  If any of these\nsituations applies, one may substitute his own implementation of\n<code style=\"white-space: normal\">extended_type_info</code>\n<p>\nThe interface to facilities required to implement serialization is defined in\n<a href=\"../../../boost/serialization/extended_type_info.hpp\" \ntarget=\"extended_type_info_hpp\">extended_type_info.hpp</a>.\n\nDefault implementation of these facilities based on <code style=\"white-space: normal\">typeid(...)</code>\nis defined in\n\n<a href=\"../../../boost/serialization/extended_type_info_typeid.hpp\" \ntarget=\"extended_type_info_typeid_hpp\">extended_type_info_typeid.hpp</a>.\n\nAn alternative implementation based on exported class identifiers\nis defined in\n<a href=\"../../../boost/serialization/extended_type_info_no_rtti.hpp\" \ntarget=\"extended_type_info_rtti_hpp\">extended_type_info_no_rtti.hpp</a>.\n<p>\nBy invoking the macro:\n<pre><code>\nBOOST_CLASS_TYPE_INFO(\n    my_class, \n    extended_type_info_no_rtti&lt;my_class&gt;\n)\n</code></pre>\nwe can assign the type information implementation to each class on a case by\ncase basis.  There is no requirement that all classes in a program use the same \nimplementation of <code style=\"white-space: normal\">extended_type_info</code>.  This supports the concept\nthat serialization of each class is specified \"once and for all\" in a header\nfile that can be included in any project without change.\n<p>\nThis is illustrated by the test program\n<a href=\"../test/test_no_rtti.cpp\" target=\"test_no_rtti_cpp\">test_no_rtti.cpp</a>.\nOther implementations are possible and might be necessary for\ncertain special cases.\n\n<h3><a name=\"wrappers\">Wrappers</a></h3>\nArchives need to treat wrappers differently from other types since, for example,\nthey usually are non-const objects while output archives require that any\nserialized object (with the exception of a wrapper) be const. \n\nThis header file <a href=\"../../../boost/serialization/wrapper.hpp\">wrapper.hpp</a>\nincludes the following code:\n\n<pre><code>\nnamespace boost { \nnamespace serialization {\ntemplate&lt;class T&gt;\nstruct is_wrapper\n : public mpl::false_\n{};\n} // namespace serialization\n} // namespace boost\n</code></pre>\n\nFor any class <code style=\"white-space: normal\">T</code>, The default definition \nof <code style=\"white-space: normal\">boost::serialization::is_wrapper&lt;T&gt;::value</code> is thus false.\n \nIf we want to declare that a class <code style=\"white-space: normal\">my_class</code>\nis a wrapper we specialize the version template:\n<pre><code>\nnamespace boost { \nnamespace serialization {\nstruct is_wrapper&lt;my_class&gt;\n : mpl::true_\n{};\n} // namespace serialization\n} // namespace boost\n</code></pre>\n<p>\nTo diminish typing and enhance readability, a macro is defined\nso that instead of the above, we could write:\n<pre><code>\nBOOST_CLASS_IS_WRAPPER(my_class)\n</code></pre>\nwhich expands to the code above.\n\n<h3><a name=\"bitwise\">Bitwise Serialization</a></h3>\nSome simple classes could be serialized just by directly copying all bits\nof the class. This is, in particular, the case for POD data types containing\nno pointer members, and which are neither versioned nor tracked. Some archives, \nsuch as non-portable binary archives can make us of this information to \nsubstantially speed up serialization.\n\nTo indicate the possibility of bitwise serialization the type trait defined \nin the header\nfile <a href=\"../../../boost/serialization/is_bitwise_serializable.hpp\" target=\"is_bitwise_serializable\">is_bitwise_serializable.hpp</a>\nis used:\n<pre><code>\nnamespace boost { namespace serialization {\n    template&lt;class T&gt;\n    struct is_bitwise_serializable\n     : public is_arithmetic&lt;T&gt;\n    {};\n} }\n</code></pre>\nis used, and can be specialized for other classes. The specialization\nis made easy by the corresponding macro:\n<pre><code>\nBOOST_IS_BITWISE_SERIALIZABLE(my_class)\n</code></pre>\n\n<h3><a name=\"templates\">Template Serialization Traits</a></h3>\nIn some instances it might be convenient to assign serialization traits\nto a whole group of classes at once.  Consider, the name-value pair\nwrapper \n<pre><code>\ntemplate&lt;class T&gt;\nstruct nvp : public std::pair&lt;const char *, T *&gt;\n{\n    ...\n};\n</code></pre>\nused by XML archives to associate a name with a data variable of type T.\nThese data types are never tracked and never versioned.  So one might\nwant to specify:\n<pre><code>\nBOOST_CLASS_IMPLEMENTATION(nvp&lt;T&gt;, boost::serialization::level_type::object_serializable)\nBOOST_CLASS_TRACKING(nvp&lt;T&gt;, boost::serialization::track_never)\n</code></pre>\nExamination of the definition of these macros reveals that they won't expand\nto sensible code when used with a template argument.  So rather than using the\nconvenience macros, use the original definitions\n<pre><code>\ntemplate&lt;class T&gt;\nstruct implementation_level&lt;nvp&lt;T&gt; &gt;\n{\n    typedef mpl::integral_c_tag tag;\n    typedef mpl::int_&lt;object_serializable&gt; type;\n    BOOST_STATIC_CONSTANT(\n        int,\n        value = implementation_level::type::value\n    );\n};\n\n// nvp objects are generally created on the stack and are never tracked\ntemplate&lt;class T&gt;\nstruct tracking_level&lt;nvp&lt;T&gt; &gt;\n{\n    typedef mpl::integral_c_tag tag;\n    typedef mpl::int_&lt;track_never&gt; type;\n    BOOST_STATIC_CONSTANT(\n        int, \n        value = tracking_level::type::value\n    );\n};\n</code></pre>\nto assign serialization traits to all classes generated by the template\n<code style=\"white-space: normal\">nvp&lt;T&gt;</code>\n<p>\n\nNote that it is only possible to use the above method to assign traits to \ntemplates when using compilers which correctly support Partial Template Specialization.\n\nOne's first impulse might be to do something like:\n\n<pre><code>\n#ifndef BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION\ntemplate&lt;class T&gt;\nstruct implementation_level&lt;nvp&lt;T&gt; &gt;\n{\n   ... // see above\n};\n\n// nvp objects are generally created on the stack and are never tracked\ntemplate&lt;class T&gt;\nstruct tracking_level&lt;nvp&lt;T&gt; &gt;\n{\n   ... // see above\n};\n#endif\n</code></pre>\nThis can be problematic when one wants to make his code <strong>and archives</strong>\nportable to other platforms.  It means the objects will be serialized differently\ndepending on the platform used.  This implies that objects saved from one platform\nwon't be loaded properly on another.  In other words, archives won't be portable.\n<p>\nThis problem is addressed by creating another method of assigning serialization traits\nto user classes.  This is illustrated by the serialization for a \n<a target=\"nvp\" href=\"../../../boost/serialization/nvp.hpp\"><strong>name-value</strong> pair</a>.\n<p>\nSpecifically, this entails deriving the template from a special class\n<a target=\"traits\" href=\"../../../boost/serialization/traits.hpp\">\n<code style=\"white-space: normal\">boost::serialization::traits</code></a> which is specialized for a specific\ncombination of serialization traits.  \nWhen looking up the serialization traits, the library first checks to see if this class has been\nused as a base class. If so, the corresponding traits are used.  Otherwise, the standard defaults\nare used. By deriving from a serialization traits class rather than relying upon Partial Template\nSpecializaton, one can a apply serialization traits to a template and those traits will be\nthe same across all known platforms.\n<p>\nThe signature for the traits template is:\n<pre><code>\ntemplate&lt;\n    class T,       \n    int Level, \n    int Tracking,\n    unsigned int Version = 0,\n    class ETII = BOOST_SERIALIZATION_DEFAULT_TYPE_INFO(T),\n    class IsWrapper = mpl::false_\n&gt;\nstruct traits\n</code></pre>\nand template parameters should be assigned according to the following table:\n<p>\n<table border>\n<tr><th align=left>parameter</th><th align=left>description</th><th align=left>permitted values</th><th align=left>default value</th></tr>\n<tr><td><code>T</code></td><td>target class</td><td>class name<T></td><td>none</td></tr>            \n<tr><td><code>Level</code></td><td>implementation level</td><td><code>not_serializable<br>primitive_type<br>object_serializable<br>object_class_info</code></td><td>none</td></tr>  \n<tr><td><code>Tracking</code></td><td>tracking level</td><td><code>track_never<br>track_selectivly<br>track_always</code></td><td>none</td></tr>\n<tr><td><code>Version</code></td><td><code>class version</td><td>unsigned integer</td><td><code>0</code></td></tr>\n<tr><td><code>ETTI</code></td><td><code>type_info</code> implementation</td><td><code>extended_type_info_typeid<br>extended_type_info_no_rtti</code></td><td>default <code>type_info implementation</code></td></tr>\n<tr><td><code>IsWrapper</code></td><td><code></code>is the type a wrapper?</td><td><code>mpl::false_<br>mpl::true_</code></td><td><code>mpl::false_</code></td></tr>\n</table>\n\n<h3><a name=\"compiletime_messages\">Compile Time Warnings and Errors</a></h3>\nSome serialization traits can conflict with other ones.  Sometimes these conflicts\nwill result in erroneous behavior (E.G. creating of archives which could not be read)\nand other times they represent a probable misconception on the part of the\nlibrary user which could result in surprising behavior.  To the extent possible,\nthese conflicts are detected at compile time and errors (BOOST_STATIC_ASSERT) \nor warnings (BOOST_STATIC_WARNING) are generated. They are generated in a\ncompiler dependent manner which should show a chain of instantiation\nto the point where the error/warning is detected.  Without this capability,\nit would be very hard to track down errors or unexpected behavior in library\nusage.  Here is a list of the conflicts trapped:\n\n<dl>\n<dt><h2><a name=\"object_level\">object_level</a> - error</h2></dt>\n<dd>\nThis error traps attempts to serialize types whose\nimplementation level is set to non_serializable.\n</dd>\n<dt><h2><a name=\"object_versioning\">object_versioning</a> - error</h2></dt>\n<dd>\nIt's possible that for efficiency reasons, a type can be\nassigned a serialization level which doesn't include type information \nin the archive.  This would preclude the assignment\nof a new version number to the type.  This error\ntraps attempts to assign a version number in this case.\nThis has to be a user error.\n</dd>\n\n<dt><h2><a name=\"object_tracking\">object_tracking</a> - warning</h2></dt>\n<dd>\nThe following code will display a message when compiled:\n\n<code style=\"white-space: normal\"><pre>\nT t;\nar &lt;&lt; t;\n</pre></code>\n\nunless the tracking_level serialization trait is set to \"track_never\". The following\nwill compile without problem:\n\n<code style=\"white-space: normal\"><pre>\nconst T t\nar &lt;&lt; t;\n</pre></code>\n\nLikewise, the following code will trap at compile time:\n\n<code style=\"white-space: normal\"><pre>\nT * t;\nar &gt;&gt; t;\n</pre></code>\n\nif the tracking_level serialization trait is set to \"track_never\".\n<p>\n\nThe following case illustrates the function of this message.\nIt was originally used as an example in the\nmailing list by Peter Dimov.\n\n<code style=\"white-space: normal\"><pre>\nclass construct_from \n{ \n    ... \n}; \n\nvoid main(){ \n    ... \n    Y y; \n    construct_from x(y); \n    ar &lt;&lt; x; \n} \n</pre></code>\n\nSuppose that the above message is not displayed and the code is used as is.\n<ol>\n  <li>this example compiles and executes fine. No tracking is done because \n  construct_from has never been serialized through a pointer. Now some time \n  later, the next programmer(2) comes along and makes an enhancement. He \n  wants the archive to be sort of a log. \n\n<code style=\"white-space: normal\"><pre>\nvoid main(){ \n    ... \n    Y y; \n    construct_from x(y); \n    ar &lt;&lt; x; \n    ... \n    x.f(); // change x in some way \n   ... \n    ar &lt;&lt; x \n} \n</pre></code>\n  <p>\n  Again no problem. He gets two different of copies in the archive, each one is different. \n  That is he gets exactly what he expects and is naturally delighted. \n  <p>\n  <li>Now sometime later, a third programmer(3) sees construct_from and says - \n  oh cool, just what I need. He writes a function in a totally disjoint \n  module. (The project is so big, he doesn't even realize the existence of \n  the original usage) and writes something like: \n\n<code style=\"white-space: normal\"><pre>\nclass K { \n    shared_ptr &lt;construct_from&gt; z; \n    template &lt;class Archive&gt; \n    void serialize(Archive &amp; ar, const unsigned version){ \n        ar &lt;&lt; z; \n    } \n}; \n</pre></code>\n\n  <p>\n  He builds and runs the program and tests his new functionality. It works \n  great and he's delighted. \n  <p>\n  <li>Things continue smoothly as before.  A month goes by and it's \n  discovered that when loading the archives made in the last month (reading the \n  log). Things don't work. The second log entry is always the same as the \n  first. After a series of very long and increasingly acrimonious email exchanges, \nit's discovered \n  that programmer(3) accidentally broke programmer(2)'s code .This is because by \n  serializing via a pointer, the \"log\" object is now being tracked.  This is because\n  the default tracking behavior is \"track_selectively\".  This means that class\n  instances are tracked only if they are serialized through pointers anywhere in\n  the program. Now multiple saves from the same address result in only the first one \n  being written to the archive. Subsequent saves only add the address - even though the \n  data might have been changed.  When it comes time to load the data, all instances of the log record show the same data.\n  In this way, the behavior of a functioning piece of code is changed due the side\n  effect of a change in an otherwise disjoint module.\n  Worse yet, the data has been lost and cannot be recovered from the archives.\n  People are really upset and disappointed with boost (at least the serialization system).\n  <p>\n  <li>\n  After a lot of investigation, it's discovered what the source of the problem is\n  and class construct_from is marked \"track_never\" by including:\n<code style=\"white-space: normal\"><pre>\nBOOST_CLASS_TRACKING(construct_from, track_never) \n</pre></code>\n  <li>Now everything works again. Or - so it seems.\n  <p>\n  <li><code style=\"white-space: normal\">shared_ptr&lt;construct_from&gt;</code>\nis not going to have a single raw pointer shared amongst the instances. Each loaded \n<code style=\"white-space: normal\">shared_ptr&lt;construct_from&gt;</code> is going to \nhave its own distinct raw pointer. This will break \n<code style=\"white-space: normal\">shared_ptr</code> and cause a memory leak.  Again,\nThe cause of this problem is very far removed from the point of discovery.  It could \nwell be that the problem is not even discovered until after the archives are loaded.\nNow we not only have a difficult to find and fix program bug, but we have a bunch of\ninvalid archives and lost data.\n</ol>\n\n<p>Now consider what happens when the message is displayed:\n\n<ol>\n  <p>\n  <li>Right away, the program traps at \n<code style=\"white-space: normal\"><pre>\nar &lt;&lt; x; \n</pre></code>\n  <p>\n  <li>The programmer curses (another %^&*&* hoop to jump through). He's in a \n  hurry (and who isn't) and would prefer not to <code style=\"white-space: normal\">const_cast</code>\n  - because it looks bad.  So he'll just make the following change an move on. \n<code style=\"white-space: normal\"><pre>\nY y; \nconst construct_from x(y); \nar &lt;&lt; x; \n</pre></code>\n  <p>\n  Things work fine and he moves on. \n  <p>\n  <li>Now programmer (2) wants to make his change - and again another \n  annoying const issue; \n<code style=\"white-space: normal\"><pre>\nY y; \nconst construct_from x(y); \n... \nx.f(); // change x in some way ; compile error f() is not const \n... \nar &lt;&lt; x \n</pre></code>\n  <p>\n  He's mildly annoyed now he tries the following: \n  <ul>\n    <li>He considers making f() a const - but presumably that shifts the const \n    error to somewhere else. And he doesn't want to fiddle with \"his\" code to \n    work around a quirk in the serializaition system \n    <p>\n    <li>He removes the <code style=\"white-space: normal\">const</code>\n    from <code style=\"white-space: normal\">const construct_from</code> above - damn now he \n    gets the trap. If he looks at the comment code where the \n    <code style=\"white-space: normal\">BOOST_STATIC_ASSERT</code>\n    occurs, he'll do one of two things \n    <ol>\n      <p>\n      <li>This is just crazy. Its making my life needlessly difficult and flagging \n      code that is just fine. So I'll fix this with a <code style=\"white-space: normal\">const_cast</code>\n      and fire off a complaint to the list and maybe they will fix it. \n      In this case, the story branches off to the previous scenario.\n      <p>\n      <li>Oh, this trap is suggesting that the default serialization isn't really \n      what I want. Of course in this particular program it doesn't matter. But \n      then the code in the trap can't really evaluate code in other modules (which \n      might not even be written yet). OK, I'll add the following to my \n      construct_from.hpp to solve the problem. \n<code style=\"white-space: normal\"><pre>\nBOOST_CLASS_TRACKING(construct_from, track_never) \n</pre></code>\n    </ol>\n  </ul>\n  <p>\n  <li>Now programmer (3) comes along and make his change. The behavior of the \n  original (and distant module) remains unchanged because the \n  <code style=\"white-space: normal\">construct_from</code> trait has been set to \n  \"track_never\" so he should always get copies and the log should be what we expect.\n  <p>\n  <li>But now he gets another trap - trying to save an object of a \n  class marked \"track_never\" through a pointer. So he goes back to \n  construct_from.hpp and comments out the \n  <code style=\"white-space: normal\">BOOST_CLASS_TRACKING</code> that \n  was inserted. Now the second trap is avoided, But damn - the first trap is \n  popping up again. Eventually, after some code restructuring, the differing\n  requirements of serializating <code style=\"white-space: normal\">construct_from</code>\n  are reconciled.\n</ol>\nNote that in this second scenario\n<ul>\n  <li>all errors are trapped at compile time.\n  <li>no invalid archives are created.\n  <li>no data is lost.\n  <li>no runtime errors occur.\n</ul>\n\nIt's true that these messages may sometimes flag code that is currently correct and\nthat this may be annoying to some programmers.  However, this example illustrates\nmy view that these messages are useful and that any such annoyance is a small price to\npay to avoid particularly vexing programming errors.\n\n</dd>\n\n<dt><h2><a name=\"pointer_level\">pointer_level</a> - warning</h2></dt>\n<dd>\nThis trap addresses the following situation when serializing \na pointer:\n<ul>\n<li>A type doesn't save class information in the\narchive. That is, the serialization trait implementation\nlevel &lt;= object_serializable.\n<li>Tracking for this type is set to \"track selectively\"\nin this case, indication that an object is tracked is\nnot stored in the archive itself - see level == object_serializable.\nSince class information is not saved in the archive, the existence\nor absence of the operation <code style=\"white-space: normal\">ar &lt;&lt; T *</code> anywhere else in the \nprogram is used to infer that an object of this type should be tracked.\n<p>\nA problem arises when a program which reads an archive\nincludes the operation <code style=\"white-space: normal\">ar &gt;&gt; T *</code> so that tracking information\nwill be included in the archive. When a program which\ncreates the archive doesn't include <code style=\"white-space: normal\">ar &lt;&lt; T</code> it is presumed\nthat the archive doesn't include tracking information and\nthe archive will fail to load.  Also the reverse situation could \ntrigger a similar problem.\n<p>\nThough this situation is unlikely for several reasons, \nit is possible - hence this warning. \n</ul>\nSo if your program traps here, consider changing the \ntracking or implementation level traits - or not\nserializing via a pointer.\n</dd>\n\n<dt><h2><a name=\"pointer_tracking\">pointer_tracking</a> - warning</h2></dt>\n<dd>\nSerializing an object of a type marked \"track_never\" through a pointer\ncould result in creating more objects than were saved! There are cases\nin which a user might really want to do this so we leave it as a warning.\n</dd>\n\n<dt><h2><a name=\"const_loading\">const_loading</a> - error</h2></dt>\n<dd>\nOne cannot load data into a \"const\" object unless it's a\nwrapper around some other non-const object.\n</dd>\n</dl>\n\n<hr>\n<p><i>&copy; Copyright <a href=\"http://www.rrsd.com\">Robert Ramey</a> 2002-2004 and Matthias Troyer 2006. \nDistributed under the Boost Software License, Version 1.0. (See\naccompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n</i></p>\n</body>\n</html>\n"
  },
  {
    "path": "doc/tutorial.html",
    "content": "<!doctype HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">\n<html>\n<!--\n(C) Copyright 2002-4 Robert Ramey - http://www.rrsd.com .\nUse, modification and distribution is subject to the Boost Software\nLicense, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\nhttp://www.boost.org/LICENSE_1_0.txt)\n-->\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\n<link rel=\"stylesheet\" type=\"text/css\" href=\"../../../boost.css\">\n<link rel=\"stylesheet\" type=\"text/css\" href=\"style.css\">\n<title>Serialization - Tutorial</title>\n</head>\n<body link=\"#0000ff\" vlink=\"#800080\">\n<table border=\"0\" cellpadding=\"7\" cellspacing=\"0\" width=\"100%\" summary=\"header\">\n  <tr>\n    <td valign=\"top\" width=\"300\">\n       <h3><a href=\"../../../index.htm\"><img height=\"86\" width=\"277\" alt=\"C++ Boost\" src=\"../../../boost.png\" border=\"0\"></a></h3>\n    </td>\n    <td valign=\"top\">\n      <h1 align=\"center\">Serialization</h1>\n      <h2 align=\"center\">Tutorial</h2>\n    </td>\n  </tr>\n</table>\n<hr>\n<dl class=\"page-index\">\n  <dt><a href=\"#simplecase\">A Very Simple Case</a>\n  <dt><a href=\"#nonintrusiveversion\">Non Intrusive Version</a>\n  <dt><a href=\"#serializablemembers\">Serializable Members</a>\n  <dt><a href=\"#derivedclasses\">Derived Classes</a>\n  <dt><a href=\"#pointers\">Pointers</a>\n  <dt><a href=\"#arrays\">Arrays</a>\n  <dt><a href=\"#stl\">STL Collections</a>\n  <dt><a href=\"#versioning\">Class Versioning</a>\n  <dt><a href=\"#splitting\">Splitting <code style=\"white-space: normal\">serialize</code> into <code style=\"white-space: normal\">save/load</code></a>\n  <dt><a href=\"#archives\">Archives</a>\n  <dt><a href=\"#examples\">List of examples</a>\n</dl>\nAn output archive is similar to an output data stream. Data can be saved to the archive\nwith either the &lt;&lt; or the &amp; operator:\n<pre><code>\nar &lt;&lt; data;\nar &amp; data;\n</code></pre>\nAn input archive is similar to an input datastream.  Data can be loaded from the archive\nwith either the &gt;&gt; or the &amp; operator.\n<pre><code>\nar &gt;&gt; data;\nar &amp; data;\n</code></pre>\n<p>\nWhen these operators are invoked for primitive data types, the data is simply saved/loaded\nto/from the archive. When invoked for class data types, the class\n<code style=\"white-space: normal\">serialize</code> function is invoked. Each\n<code style=\"white-space: normal\">serialize</code> function is uses the above operators\nto save/load its data members.  This process will continue in a recursive manner until\nall the data contained in the class is saved/loaded.\n\n<h3><a name=\"simplecase\">A Very Simple Case</a></h3>\nThese operators are used inside the <code style=\"white-space: normal\">serialize</code>\nfunction to save and load class data members.\n<p>\nIncluded in this library is a program called\n<a href=\"../example/demo.cpp\" target=\"demo_cpp\">demo.cpp</a> which illustrates how\nto use this system. Below we excerpt code from this program to\nillustrate with the simplest possible case how this library is\nintended to be used.\n<pre>\n<code>\n#include &lt;fstream&gt;\n\n// include headers that implement a archive in simple text format\n#include &lt;boost/archive/text_oarchive.hpp&gt;\n#include &lt;boost/archive/text_iarchive.hpp&gt;\n\n/////////////////////////////////////////////////////////////\n// gps coordinate\n//\n// illustrates serialization for a simple type\n//\nclass gps_position\n{\nprivate:\n    friend class boost::serialization::access;\n    // When the class Archive corresponds to an output archive, the\n    // &amp; operator is defined similar to &lt;&lt;.  Likewise, when the class Archive\n    // is a type of input archive the &amp; operator is defined similar to &gt;&gt;.\n    template&lt;class Archive&gt;\n    void serialize(Archive &amp; ar, const unsigned int version)\n    {\n        ar &amp; degrees;\n        ar &amp; minutes;\n        ar &amp; seconds;\n    }\n    int degrees;\n    int minutes;\n    float seconds;\npublic:\n    gps_position(){};\n    gps_position(int d, int m, float s) :\n        degrees(d), minutes(m), seconds(s)\n    {}\n};\n\nint main() {\n    // create and open a character archive for output\n    std::ofstream ofs(\"filename\");\n\n    // create class instance\n    const gps_position g(35, 59, 24.567f);\n\n    // save data to archive\n    {\n        boost::archive::text_oarchive oa(ofs);\n        // write class instance to archive\n        oa &lt;&lt; g;\n    \t// archive and stream closed when destructors are called\n    }\n\n    // ... some time later restore the class instance to its orginal state\n    gps_position newg;\n    {\n        // create and open an archive for input\n        std::ifstream ifs(\"filename\");\n        boost::archive::text_iarchive ia(ifs);\n        // read class state from archive\n        ia &gt;&gt; newg;\n        // archive and stream closed when destructors are called\n    }\n    return 0;\n}\n</code>\n</pre>\n<p>For each class to be saved via serialization, there must exist a function to\nsave all the class members which define the state of the class.\nFor each class to be loaded via serialization, there must exist a function to\nload these class members in the same sequence as they were saved.\nIn the above example, these functions are generated by the\ntemplate member function <code style=\"white-space: normal\">serialize</code>.\n\n<h3><a name=\"nonintrusiveversion\">Non Intrusive Version</a></h3>\n<p>The above formulation is intrusive. That is, it requires\nthat classes whose instances are to be serialized be\naltered. This can be inconvenient in some cases.\nAn equivalent alternative formulation permitted by the\nsystem would be:\n<pre><code>\n#include &lt;boost/archive/text_oarchive.hpp&gt;\n#include &lt;boost/archive/text_iarchive.hpp&gt;\n\nclass gps_position\n{\npublic:\n    int degrees;\n    int minutes;\n    float seconds;\n    gps_position(){};\n    gps_position(int d, int m, float s) :\n        degrees(d), minutes(m), seconds(s)\n    {}\n};\n\nnamespace boost {\nnamespace serialization {\n\ntemplate&lt;class Archive&gt;\nvoid serialize(Archive &amp; ar, gps_position &amp; g, const unsigned int version)\n{\n    ar &amp; g.degrees;\n    ar &amp; g.minutes;\n    ar &amp; g.seconds;\n}\n\n} // namespace serialization\n} // namespace boost\n</code></pre>\n<p>\nIn this case the generated serialize functions are not members of the\n<code style=\"white-space: normal\">gps_position</code> class.  The two formulations function\nin exactly the same way.\n<p>\nThe main application of non-intrusive serialization is to permit serialization\nto be implemented for classes without changing the class definition.\nIn order for this to be possible, the class must expose enough information\nto reconstruct the class state.  In this example, we presumed that the\nclass had <code style=\"white-space: normal\">public</code> members - not a common occurrence.  Only\nclasses which expose enough information to save and restore the class\nstate will be serializable without changing the class definition.\n<h3><a name=\"serializablemembers\">Serializable Members</a></h3>\n<p>\nA serializable class with serializable members would look like this:\n<pre><code>\nclass bus_stop\n{\n    friend class boost::serialization::access;\n    template&lt;class Archive&gt;\n    void serialize(Archive &amp; ar, const unsigned int version)\n    {\n        ar &amp; latitude;\n        ar &amp; longitude;\n    }\n    gps_position latitude;\n    gps_position longitude;\nprotected:\n    bus_stop(const gps_position &amp; lat_, const gps_position &amp; long_) :\n    latitude(lat_), longitude(long_)\n    {}\npublic:\n    bus_stop(){}\n    // See item # 14 in Effective C++ by Scott Meyers.\n    // re non-virtual destructors in base classes.\n    virtual ~bus_stop(){}\n};\n</code></pre>\n<p>That is, members of class type are serialized just as\nmembers of primitive types are.\n<p>\nNote that saving an instance of the class <code style=\"white-space: normal\">bus_stop</code>\nwith one of the archive operators will invoke the\n<code style=\"white-space: normal\">serialize</code> function which saves\n<code style=\"white-space: normal\">latitude</code> and\n<code style=\"white-space: normal\">longitude</code>. Each of these in turn will be saved by invoking\n<code style=\"white-space: normal\">serialize</code> in the definition of\n<code style=\"white-space: normal\">gps_position</code>.  In this manner the whole\ndata structure is saved by the application of an archive operator to\njust its root item.\n\n\n<h3><a name=\"derivedclasses\">Derived Classes</a></h3>\n<p>Derived classes should include serializations of their base classes.\n<pre><code>\n#include &lt;boost/serialization/base_object.hpp&gt;\n\nclass bus_stop_corner : public bus_stop\n{\n    friend class boost::serialization::access;\n    template&lt;class Archive&gt;\n    void serialize(Archive &amp; ar, const unsigned int version)\n    {\n        // serialize base class information\n        ar &amp; boost::serialization::base_object&lt;bus_stop&gt;(*this);\n        ar &amp; street1;\n        ar &amp; street2;\n    }\n    std::string street1;\n    std::string street2;\n    virtual std::string description() const\n    {\n        return street1 + \" and \" + street2;\n    }\npublic:\n    bus_stop_corner(){}\n    bus_stop_corner(const gps_position &amp; lat_, const gps_position &amp; long_,\n        const std::string &amp; s1_, const std::string &amp; s2_\n    ) :\n        bus_stop(lat_, long_), street1(s1_), street2(s2_)\n    {}\n};\n</code>\n</pre>\n<p>\nNote the serialization of the base classes from the derived\nclass. Do <b>NOT</b> directly call the base class serialize\nfunctions. Doing so might seem to work but will bypass the code\nthat tracks instances written to storage to eliminate redundancies.\nIt will also bypass the writing of class version information into\nthe archive. For this reason, it is advisable to always make member\n<code style=\"white-space: normal\">serialize</code> functions private.  The declaration\n<code style=\"white-space: normal\">friend boost::serialization::access</code> will grant to the\nserialization library access to private member variables and functions.\n<p>\n<h3><a name=\"pointers\">Pointers</a></h3>\nSuppose we define a bus route as an array of bus stops.  Given that\n<ol>\n    <li>we might have several types of bus stops (remember bus_stop is\na base class)\n    <li>a given bus_stop might appear in more than one route.\n</ol>\nit's convenient to represent a bus route with an array of pointers\nto <code style=\"white-space: normal\">bus_stop</code>.\n<pre>\n<code>\nclass bus_route\n{\n    friend class boost::serialization::access;\n    bus_stop * stops[10];\n    template&lt;class Archive&gt;\n    void serialize(Archive &amp; ar, const unsigned int version)\n    {\n        int i;\n        for(i = 0; i &lt; 10; ++i)\n            ar &amp; stops[i];\n    }\npublic:\n    bus_route(){}\n};\n</code>\n</pre>\nEach member of the array <code style=\"white-space: normal\">stops</code> will be serialized.\nBut remember each member is a pointer - so what can this really\nmean?  The whole object of this serialization is to permit\nreconstruction of the original data structures at another place\nand time.  In order to accomplish this with a pointer, it is\nnot sufficient to save the value of the pointer, rather the\nobject it points to must be saved.  When the member is later\nloaded, a new object has to be created and a new pointer has\nto be loaded into the class member.\n<p>\nIf the same pointer is serialized more than once, only one instance\nis be added to the archive.  When read back, no data is read back in.\nThe only operation that occurs is for the second pointer is set equal to the first\n<p>\nNote that, in this example, the array consists of polymorphic pointers.\nThat is, each array element point to one of several possible \nkinds of bus stops.  So when the pointer is saved, some sort of class\nidentifier must be saved.  When the pointer is loaded, the class\nidentifier must be read and and instance of the corresponding class\nmust be constructed. Finally the data can be loaded to newly created\ninstance of the correct type.\n\nAs can be seen in \n<a href=\"../example/demo.cpp\" target=\"demo_cpp\">demo.cpp</a>,\nserialization of pointers to derived classes through a base\nclas pointer may require explicit enumeration of the derived\nclasses to be serialized. This is referred to as \"registration\" or \"export\"\nof derived classes.  This requirement and the methods of\nsatisfying it are explained in detail\n<a href=\"serialization.html#derivedpointers\">here</a>.\n<p>\nAll this is accomplished automatically by the serialization\nlibrary.  The above code is all that is necessary to accomplish\nthe saving and loading of objects accessed through pointers.\n<p>\n<h3><a name=\"arrays\">Arrays</a></h3>\nThe above formulation is in fact more complex than necessary.\nThe serialization library detects when the object being\nserialized is an array and emits code equivalent to the above.\nSo the above can be shortened to:\n<pre>\n<code>\nclass bus_route\n{\n    friend class boost::serialization::access;\n    bus_stop * stops[10];\n    template&lt;class Archive&gt;\n    void serialize(Archive &amp; ar, const unsigned int version)\n    {\n        ar &amp; stops;\n    }\npublic:\n    bus_route(){}\n};\n</code>\n</pre>\n<h3><a name=\"stl\">STL Collections</a></h3>\nThe above example uses an array of members.  More likely such\nan application would use an STL collection for such a purpose.\nThe serialization library contains code for serialization\nof all STL classes.  Hence, the reformulation below will\nalso work as one would expect.\n<pre>\n<code>\n#include &lt;boost/serialization/list.hpp&gt;\n\nclass bus_route\n{\n    friend class boost::serialization::access;\n    std::list&lt;bus_stop *&gt; stops;\n    template&lt;class Archive&gt;\n    void serialize(Archive &amp; ar, const unsigned int version)\n    {\n        ar &amp; stops;\n    }\npublic:\n    bus_route(){}\n};\n</code>\n</pre>\n<h3><a name=\"versioning\">Class Versioning</a></h3>\n<p>\nSuppose we're satisfied with our <code style=\"white-space: normal\">bus_route</code> class, build a program\nthat uses it and ship the product.  Some time later, it's decided\nthat the program needs enhancement and the <code style=\"white-space: normal\">bus_route</code> class is\naltered to include the name of the driver of the route. So the\nnew version looks like:\n<pre>\n<code>\n#include &lt;boost/serialization/list.hpp&gt;\n#include &lt;boost/serialization/string.hpp&gt;\n\nclass bus_route\n{\n    friend class boost::serialization::access;\n    std::list&lt;bus_stop *&gt; stops;\n    std::string driver_name;\n    template&lt;class Archive&gt;\n    void serialize(Archive &amp; ar, const unsigned int version)\n    {\n        ar &amp; driver_name;\n        ar &amp; stops;\n    }\npublic:\n    bus_route(){}\n};\n</code>\n</pre>\nGreat, we're all done. Except... what about people using our application\nwho now have a bunch of files created under the previous program.\nHow can these be used with our new program version?\n<p>\nIn general, the serialization library stores a version number in the\narchive for each class serialized.  By default this version number is 0.\nWhen the archive is loaded, the version number under which it was saved\nis read.  The above code can be altered to exploit this\n<pre>\n<code>\n#include &lt;boost/serialization/list.hpp&gt;\n#include &lt;boost/serialization/string.hpp&gt;\n#include &lt;boost/serialization/version.hpp&gt;\n\nclass bus_route\n{\n    friend class boost::serialization::access;\n    std::list&lt;bus_stop *&gt; stops;\n    std::string driver_name;\n    template&lt;class Archive&gt;\n    void serialize(Archive &amp; ar, const unsigned int version)\n    {\n        // only save/load driver_name for newer archives\n        if(version &gt; 0)\n            ar &amp; driver_name;\n        ar &amp; stops;\n    }\npublic:\n    bus_route(){}\n};\n\nBOOST_CLASS_VERSION(bus_route, 1)\n</code>\n</pre>\nBy application of versioning to each class, there is no need to\ntry to maintain a versioning of files.  That is, a file version\nis the combination of the versions of all its constituent classes.\n\nThis system permits programs to be always compatible with archives\ncreated by all previous versions of a program with no more\neffort than required by this example.\n\n<h3><a name=\"splitting\">Splitting <code style=\"white-space: normal\">serialize</code>\ninto <code style=\"white-space: normal\">save/load</code></a></h3>\nThe <code style=\"white-space: normal\">serialize</code> function is simple, concise, and guarantees\nthat class members are saved and loaded in the same sequence\n- the key to the serialization system.  However, there are cases\nwhere the load and save operations are not as similar as the examples\nused here.  For example, this could occur with a class that has evolved through\nmultiple versions.  The above class can be reformulated as:\n<pre>\n<code>\n#include &lt;boost/serialization/list.hpp&gt;\n#include &lt;boost/serialization/string.hpp&gt;\n#include &lt;boost/serialization/version.hpp&gt;\n#include &lt;boost/serialization/split_member.hpp&gt;\n\nclass bus_route\n{\n    friend class boost::serialization::access;\n    std::list&lt;bus_stop *&gt; stops;\n    std::string driver_name;\n    template&lt;class Archive&gt;\n    void save(Archive &amp; ar, const unsigned int version) const\n    {\n        // note, version is always the latest when saving\n        ar  &amp; driver_name;\n        ar  &amp; stops;\n    }\n    template&lt;class Archive&gt;\n    void load(Archive &amp; ar, const unsigned int version)\n    {\n        if(version &gt; 0)\n            ar &amp; driver_name;\n        ar  &amp; stops;\n    }\n    BOOST_SERIALIZATION_SPLIT_MEMBER()\npublic:\n    bus_route(){}\n};\n\nBOOST_CLASS_VERSION(bus_route, 1)\n</code>\n</pre>\nThe macro <code style=\"white-space: normal\">BOOST_SERIALIZATION_SPLIT_MEMBER()</code> generates\ncode which invokes the <code style=\"white-space: normal\">save</code>\nor <code style=\"white-space: normal\">load</code>\ndepending on whether the archive is used for saving or loading.\n<h3><a name=\"archives\">Archives</a></h3>\nOur discussion here has focused on adding serialization\ncapability to classes.  The actual rendering of the data to be serialized\nis implemented in the archive class.  Thus the stream of serialized\ndata is a product of the serialization of the class and the\narchive selected.  It is a key design decision that these two\ncomponents be independent.  This permits any serialization specification\nto be usable with any archive.\n<p>\nIn this tutorial, we have used a particular\narchive class - <code style=\"white-space: normal\">text_oarchive</code> for saving and\n<code style=\"white-space: normal\">text_iarchive</code> for loading.\ntext archives render data as text and are portable across platforms.  In addition\nto text archives, the library includes archive class for native binary data\nand xml formatted data.  Interfaces to all archive classes are all identical.\nOnce serialization has been defined for a class, that class can be serialized to \nany type of archive.\n<p>\nIf the current set of archive classes doesn't provide the\nattributes, format, or behavior needed for a particular application,\none can either make a new archive class or derive from an existing one.\nThis is described later in the manual.\n\n<h3><a name=\"examples\">List of Examples</h3>\n<dl>\n    <dt><a href=\"../example/demo.cpp\" target=\"demo_cpp\">demo.cpp</a>\n    <dd>This is the completed example used in this tutorial.\n    It does the following:\n    <ol>\n        <li>Creates a structure of differing kinds of stops, routes and schedules\n        <li>Displays it\n        <li>Serializes it to a file named \"testfile.txt\" with one\n        statement\n        <li>Restores to another structure\n        <li>Displays the restored structure\n    </ol>\n    <a href=\"../example/demo_output.txt\" target=\"demo_output\">Output of\n    this program</a> is sufficient to verify that all the\n    originally stated requirements for a serialization system\n    are met with this system. The <a href=\"../example/demofile.txt\"\n    target=\"test_file\">contents of the archive file</a> can\n    also be displayed as serialization files are ASCII text.\n\n    <dt><a href=\"../example/demo_xml.cpp\" target=\"demo_xml_cpp\">demo_xml.cpp</a>\n    <dd>This is a variation the original demo which supports xml archives in addition\n    to the others. The extra wrapping macro, BOOST_SERIALIZATION_NVP(name), is \n    needed to associate a data item name with the corresponding xml \n    tag. It is important that 'name' be a valid xml tag, else it \n    will be impossible to restore the archive. \n    For more information see\n    <a target=\"detail\" href=\"wrappers.html#nvp\">Name-Value Pairs</a>.\n    <a href=\"../example/demo_save.xml\" target=\"demo_save_xml\">Here</a>\n    is what an xml archive looks like.\n\n    <dt><a href=\"../example/demo_xml_save.cpp\" target=\"demo_xml_save_cpp\">demo_xml_save.cpp</a>\n    and <a href=\"../example/demo_xml_load.cpp\" target=\"demo_xml_load_cpp\">demo_xml_load.cpp</a>\n    <dd>Note also that though our examples save and load the program data\n    to an archive within the same program, this merely a convenience\n    for purposes of illustration.  In general, the archive may or may\n    not be loaded by the same program that created it.\n</dl>\n<p>\nThe astute reader might notice that these examples contain a subtle but important flaw.\nThey leak memory. The bus stops are created in the <code style=\"white-space: normal\">\nmain</code> function.  The bus schedules may refer to these bus stops\nany number of times.  At the end of the main function after the bus schedules are destroyed,\nthe bus stops are destroyed.  This seems fine.  But what about the structure\n<code style=\"white-space: normal\">new_schedule</code> data item created by the\nprocess of loading from an archive? This contains its own separate set of bus stops\nthat are not referenced outside of the bus schedule.  These won't be destroyed\nanywhere in the program - a memory leak.\n<p>\nThere are couple of ways of fixing this.  One way is to explicitly manage the bus stops.\nHowever, a more robust and transparent is to use \n<code style=\"white-space: normal\">shared_ptr</code> rather than raw pointers. Along\nwith serialization implementations for the Standard Library, the serialization library\nincludes implementation of serialization for \n<code style=\"white-space: normal\">boost::shared ptr</code>.  Given this, it should be\neasy to alter any of these examples to eliminate the memory leak. This is left \nas an exercise for the reader.\n\n<hr>\n<p><i>&copy; Copyright <a href=\"http://www.rrsd.com\">Robert Ramey</a> 2002-2004. \nDistributed under the Boost Software License, Version 1.0. (See\naccompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n</i></p>\n</body>\n</html>\n"
  },
  {
    "path": "doc/void_cast.html",
    "content": "﻿<!doctype HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">\n<html>\n<!--\n(C) Copyright 2002-4 Robert Ramey - http://www.rrsd.com . \nUse, modification and distribution is subject to the Boost Software\nLicense, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\nhttp://www.boost.org/LICENSE_1_0.txt)\n-->\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\n<link rel=\"stylesheet\" type=\"text/css\" href=\"../../../boost.css\">\n<link rel=\"stylesheet\" type=\"text/css\" href=\"style.css\">\n<title>Serialization - BOOST_STATIC_WARNING</title>\n</head>\n<body link=\"#0000ff\" vlink=\"#800080\">\n<table border=\"0\" cellpadding=\"7\" cellspacing=\"0\" width=\"100%\" summary=\"header\">\n  <tr> \n    <td valign=\"top\" width=\"300\"> \n      <h3><a href=\"../../../index.htm\"><img height=\"86\" width=\"277\" alt=\"C++ Boost\" src=\"../../../boost.png\" border=\"0\"></a></h3>\n    </td>\n    <td valign=\"top\"> \n      <h1 align=\"center\">Serialization</h1>\n      <h2 align=\"center\"><code>void_cast</code></h2>\n    </td>\n  </tr>\n</table>\n<hr>\n<h3>Motivation</h3>\nC++ includes the operator <code style=\"white-space: normal\">dynamic_cast&lt;T&gt;(U * u)</code>\nfor casting a pointer at runtime between two related types. However, this can only be \nused for polymorphic classes.  That is, it can only be used with related classes which have at least one virtual function.\nLimiting the serialization of pointers to only such classes would diminish the applicability\nof the library.\n\n<h3>Usage</h3>\n\nThe following functions are defined in the header\n<a target=\"void_cast\" href=\"../../../boost/serialization/void_cast.hpp\">void_cast.hpp</a>.\nThey are declared in the namespace\n<code style=\"white-space: normal\">boost::serialization</code>.\n\n<dl>\n<dt><h4><pre><code>\ntemplate&lt;class Derived, class Base&gt;\nconst void_cast_detail::void_caster &amp;\nvoid_cast_register(\n    Derived const * derived = NULL, \n    Base * const base = NULL\n);\n</code></pre></h4></dt>\n<dd>\nThis function \"registers\" a pair of related types.  It stores the fact that\n<code style=\"white-space: normal\">Derived</code> is immediately derived from \n<code style=\"white-space: normal\">Base</code> in a global table. \n<ul>\n  <li>This \"registration\" can be invoked anywhere in the program.  The table is built at\n  pre-runtime and is available anywhere else in the program.\n  <li>only adjacent base/derived pairs need be registered.  That is,\n  <pre><code>\n  void_cast_register&lt;A, B&gt;();\n  void_cast_register&lt;B, C&gt;();\n  </code></pre>\n  automatically derives the fact that A can be upcast to C and vice-versa.\n</ul>\n</dd>\n\n<dt><h4><pre><code>\nvoid *\nvoid_upcast(\n    extended_type_info const &amp; derived_type,\n    extended_type_info const &amp; base_type,\n    void * const t \n);\n</code></pre></h4></dt>\n\n<dt><h4><pre><code>\nvoid *\nvoid_downcast(\n    extended_type_info const &amp; derived_type,\n    extended_type_info const &amp; base_type,\n    void * const t \n);\n</code></pre></h4></dt>\n<dd>\nThese functions cast a void pointer from one type to another.  The source and\ndefinition types are specified by passing references to the corresponding\n<a href=\"extended_type_info.html\"><code style=\"white-space: normal\">\nextended_type_info</code></a>\nrecords.  An attempt to cast between types not \"registered\" with\n<code style=\"white-space: normal\">void_cast_register</code> \nwill throw a\n<a href=\"exceptions.html\"><code style=\"white-space: normal\">boost::archive::archive_exception</code></a>\nwith value equal to\n<code style=\"white-space: normal\">unregistered_cast</code>\n</dd>\n</dl>\n\n<hr>\n<p><i>&copy; Copyright <a href=\"http://www.rrsd.com\">Robert Ramey</a> 2002-2004. \nDistributed under the Boost Software License, Version 1.0. (See\naccompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n</i></p>\n</body>\n</html>\n"
  },
  {
    "path": "doc/wrappers.html",
    "content": "﻿<!doctype HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">\n<html>\n<!--\n(C) Copyright 2002-4 Robert Ramey - http://www.rrsd.com . \nUse, modification and distribution is subject to the Boost Software\nLicense, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\nhttp://www.boost.org/LICENSE_1_0.txt)\n-->\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\n<link rel=\"stylesheet\" type=\"text/css\" href=\"../../../boost.css\">\n<link rel=\"stylesheet\" type=\"text/css\" href=\"style.css\">\n<title>Serialization - Serialization Wrappers</title>\n</head>\n<body link=\"#0000ff\" vlink=\"#800080\">\n<table border=\"0\" cellpadding=\"7\" cellspacing=\"0\" width=\"100%\" summary=\"header\">\n  <tr> \n    <td valign=\"top\" width=\"300\"> \n      <h3><a href=\"../../../index.htm\"><img height=\"86\" width=\"277\" alt=\"C++ Boost\" src=\"../../../boost.png\" border=\"0\"></a></h3>\n    </td>\n    <td valign=\"top\"> \n      <h1 align=\"center\">Serialization</h1>\n      <h2 align=\"center\">Serialization Wrappers</h2>\n    </td>\n  </tr>\n</table>\n<hr>\n<dl class=\"page-index\">\n  <dt><a href=\"#binaryobjects\">Binary Objects</a>\n  <dt><a href=\"#arrays\">Arrays</a>\n  <dt><a href=\"#strong_type\"><code style=\"white-space: normal\">BOOST_STRONG_TYPEDEF</code></a>\n  <dt><a href=\"#collection_size_type\">Collection Sizes</a>\n  <dt><a href=\"#nvp\">Name-Value Pairs</a>\n  <dt><a href=\"#composition\">Composition</a>\n</dl>\nSometimes it convenient to create a temporary object just to support serialization\nof some underlying data. This permits an archive class to define special\nhandling of this type.  The library includes several such types for varying \npurposes.\n<p>\nWrappers need to be treated in a special way by some archives, and hence\nthe <A href=\"traits.html#wrappers\"><code>is_wrapper</code></a> trait for \nthese wrapper classes is set to true.\n\n<h3><a name=\"binaryobjects\">Binary Objects</a></h3>\nA binary object is just a sequence of bytes stored as raw\nbinary data.  This would most likely be used for a large amount\nof \"light weight\" data such as a pixel map or embedded binary file.\nThe header file \n<a href=\"../../../boost/serialization/binary_object.hpp\" target=\"binary_object_hpp\">\nbinary_object.hpp\n</a>\nincludes the constructors:\n<pre><code>\nboost::serialization::binary_object(void * t, size_t size);\nboost::serialization::make_binary_object(void * t, size_t size);\n</code></pre>\nwhich will construct a temporary binary object that can be serialized just like any other object.\nIts default serialization is to use archive class primitives \n<code style=\"white-space: normal\">save_binary</code> and <code>load_binary</code>.  \nNote that it doesn't allocated any storage or create any objects.\nIts sole purpose is to pass the data size and address as a pair to the archive class.  \n\n\n<h3><a name=\"arrays\">Arrays</a></h3>\nAn array is a contiguous sequence of homogeneous data types, such as a builtin\nC-array, a <code>boost::array&lt;T&gt;</code> or a <code>std::vector&lt;T&gt;</code>. \nThe purpose of this wrapper is to support archive types (such as binary\narchives) that provide optimized serialization for contiguous sequences of \nobjects of the same type. \n\nThe header file \n<a href=\"../../../boost/serialization/array.hpp\" target=\"array_hpp\">\narray.hpp\n</a>\nincludes the function\n<pre><code>\ntemplate &lt;T&gt;\nboost::serialization::make_array(T* t, std::size_t size);\n</code></pre>\nwhich will construct a temporary <code>array</code> object\n<pre><code>\ntemplate&lt;class T&gt;\nclass array\n{\npublic:    \n    typedef T value_type;\n    array(value_type* t, std::size_t s);\n    value_type* address() const;\n    std::size_t count() const;\n};\n</code></pre>\nthat can be serialized just like any other object.\nIts default serialization is to serialize each array element.  \nNote that it doesn't allocated any storage or create any objects.\nIts sole purpose is to pass the data type, size and address to the archive class.\n\nArchive types that can provide optimized implementations for contiguous\narrays of homogeneous data types should overload the serialization of\n<code>array</code>.\n\n \n<h3><a name=\"strong_type\"><code style=\"white-space: normal\">BOOST_STRONG_TYPEDEF</code></h3>\nAnother example of a serialization wrapper is the \n<a href=\"strong_typedef.html\"><code style=\"white-space: normal\">BOOST_STRONG_TYPEDEF</code></a> template.\nThe serialization libraries uses these to pass particular kinds of integers such\nas object_id, version, etc. to an archive class. Given that these integers\nare now distinguishable according to their type,  XML archives can apply\nspecial handling to these types.  For example, a version number is rendered\nas an XML attribute in the form \"version=12\".  In the absence of any specific override,\nthese types are automatically converted to the underlying integer type so the\nspecial overrides used for XML archives aren't needed for other archives.\n\n\n\n<h3><a name=\"collection_size_type\">Collection Sizes</h3>\nAn example of a strong typedef is the <code>collection_size_type</code> in the\nheader file\n<a href=\"../../../boost/serialization/collection_size_type.hpp\" target=\"collection_size_type_hpp\">\ncollection_size_type.hpp\n</a>. This type should be used for serializing the size of a C++ collection, so\nthat the archive can pick the best integral representation for the serialization\nof collection sizes. This is necessary since, although <code>std::size_t</code>\nis guaranteed to be an integral type large enough to represent the size of\na collection on a specific platform, the archive might want to serialize\nthe size differently than this type. For example, the <code>collection_size_type</code>\nmight be serialized as a variable length integer in a portable binary archive.\n\n\n\n\n\n\n<h3><a name=\"nvp\">Name-Value Pairs</h3>\nXML archives present a somewhat special case. XML format has a nested\nstructure that maps well to the \"recursive class member visitor\" pattern used\nby the serialization system.  However, XML differs from other formats\nin that it requires a name for each class data member.  Our goal is to\nadd this information to the class serialization specification while\nstill permiting the the serialization code to be used with any archive.\n<p>\nOur solution is to wrap class members to be serialized in a\n<strong>name-value-pair</strong>. This structure is defined in\n<a href=\"../../../boost/serialization/nvp.hpp\" target=\"nvp_hpp\">nvp.hpp</a>.\nIt is just a reference to the data member coupled with a pointer to\nto a <code style=\"white-space: normal\">const char *</code> which \ncorresponds to the XML name.  It implements the default\nserialization functions for a name-value pair.  This default\naction is to just ignore the item name and serialize the\ndata value in the normal manner.  For archive classes that\ndon't make any special provision for name-value pairs, this\nis the action which will be invoked when the name-value pair\nis serialized.  Hence, wrapping a data value into a name-value\npair will have no effect when used with archives which\nmake no special provision for this wrapper.\n<p>\nThe xml archive classes contain code similar to:\n<pre><code>\n// special treatment for name-value pairs.\ntemplate&lt;class T&gt;\nxml_oarchive &amp; operator&amp;(const boost::serialization::nvp&lt;T&gt; &amp; t)\n{\n    // write an xml start tag\n    start_tag(t.name());\n\n    // serialize the data as usual\n    *this &amp; t.value();\n\n    // write an xml end tag\n    end_tag(t.name());\n}\n</code></pre>\nThe most obvious and convenient name to assign to as the XML data item name\nis - surprise! - the name of the C++ class data member.  So our serialization\ncode will look like:\n<pre><code>\nar &amp; make_nvp(\"my_variable\", my_variable);\n</code></pre>\nTo simplify typing and enhance readability a macro is defined so we can write:\n<pre><code>\nar &amp; BOOST_SERIALIZATION_NVP(my_variable);\n</code></pre>\nSimilarly there exists a macro definition that permits us to write:\n<pre><code>\nBOOST_SERIALIZATION_BASE_OBJECT_NVP(my_base_class)\n</code></pre>\n\nNote that these macros must be used in the namespace of the class, \nand without qualifying the namespace in the argument. \n\n<p>\n<a href=\"../example/demo_gps.hpp\" target=\"demo_gps_hpp\">demo_gps.hpp<a>\nincludes NVP wrappers or all data members.\n<a href=\"../example/demo_xml.cpp\" target=\"demo_xml_cpp\">demo_xml.cpp<a>\nsaves and loads data to an XML archive.\n<a href=\"../example/demo_save.xml\" target=\"demo_save_xml\">Here</a>\nis example of the XML Archive corresponding to our tutorial example.\n\n<h3><a name=\"composition\">Composition</h3>\nWrappers should be designed so that they can be composed as necessary.\nFor example, to pass binary data as a name value pair use:\n<pre><code>\nar &amp; make_nvp(\"named_binary_object\", make_binary_object(address, size));\n</code></pre>\n</html>\n<hr>\n<p><i>&copy; Copyright <a href=\"http://www.rrsd.com\">Robert Ramey</a> 2002-2004. \nDistributed under the Boost Software License, Version 1.0. (See\naccompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n</i></p>\n</body>\n</html>\n\n"
  },
  {
    "path": "example/Jamfile.v2",
    "content": "# Boost serialization Library Build Jamfile\n#  (C) Copyright Robert Ramey 2002-2004.\n#  Use, modification, and distribution are subject to the\n#  Boost Software License, Version 1.0. (See accompanying file\n#  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n#\n#  See http://www.boost.org/libs/serialization for the library home page.\n\nproject libs/serialization/example\n    : id serialization_example\n    : requirements <library>../build//boost_serialization\n    ;\n\nimport ../util/test :\n    run-template\n    run-invoke\n    run-winvoke\n    test-bsl-run-no-lib\n    test-bsl-run\n    test-bsl-run_archive\n    test-bsl-run_files\n;\n\ntest-suite \"demo-suite\" :\n    # demos\n    [ test-bsl-run demo ]\n    [ test-bsl-run demo_auto_ptr ]\n    [ test-bsl-run demo_exception ]\n    [ test-bsl-run demo_fast_archive ]\n    [ test-bsl-run demo_log : log_archive ]\n    [ test-bsl-run demo_pimpl : demo_pimpl_A ]\n    [ test-bsl-run demo_polymorphic : demo_polymorphic_A ]\n    [ test-bsl-run demo_portable_archive : portable_binary_iarchive portable_binary_oarchive ]\n    [ test-bsl-run demo_shared_ptr ]\n    [ test-bsl-run demo_simple_log ]\n    [ test-bsl-run demo_trivial_archive ]\n    [ test-bsl-run demo_xml ]\n    [ test-bsl-run demo_xml_save ]\n    [ test-bsl-run demo_xml_load : : : <dependency>demo_xml_save ]\n;\n\n"
  },
  {
    "path": "example/demo.cpp",
    "content": "/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// demo.cpp\n//\n// (C) Copyright 2002-4 Robert Ramey - http://www.rrsd.com .\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n\n#include <cstddef> // NULL\n#include <iomanip>\n#include <iostream>\n#include <fstream>\n#include <string>\n\n#include <boost/archive/tmpdir.hpp>\n\n#include <boost/archive/text_iarchive.hpp>\n#include <boost/archive/text_oarchive.hpp>\n\n#include <boost/serialization/base_object.hpp>\n#include <boost/serialization/utility.hpp>\n#include <boost/serialization/list.hpp>\n#include <boost/serialization/assume_abstract.hpp>\n\n/////////////////////////////////////////////////////////////\n// The intent of this program is to serve as a tutorial for\n// users of the serialization package.  An attempt has been made\n// to illustrate most of the facilities of the package.\n//\n// The intent is to create an example sufficiently complete to\n// illustrate the usage and utility of the package while\n// including a minimum of other code.\n//\n// This illustration models the bus system of a small city.\n// This includes, multiple bus stops,  bus routes and schedules.\n// There are different kinds of stops.  Bus stops in general\n// will appear on multiple routes.  A schedule will include\n// multiple trips on the same route.\n\n/////////////////////////////////////////////////////////////\n// gps coordinate\n//\n// illustrates serialization for a simple type\n//\nclass gps_position\n{\n    friend std::ostream & operator<<(std::ostream &os, const gps_position &gp);\n    friend class boost::serialization::access;\n    int degrees;\n    int minutes;\n    float seconds;\n    template<class Archive>\n    void serialize(Archive & ar, const unsigned int /* file_version */){\n        ar & degrees & minutes & seconds;\n    }\npublic:\n    // every serializable class needs a constructor\n    gps_position(){};\n    gps_position(int _d, int _m, float _s) :\n        degrees(_d), minutes(_m), seconds(_s)\n    {}\n};\nstd::ostream & operator<<(std::ostream &os, const gps_position &gp)\n{\n    return os << ' ' << gp.degrees << (unsigned char)186 << gp.minutes << '\\'' << gp.seconds << '\"';\n}\n\n/////////////////////////////////////////////////////////////\n// One bus stop\n//\n// illustrates serialization of serializable members\n//\n\nclass bus_stop\n{\n    friend class boost::serialization::access;\n    friend std::ostream & operator<<(std::ostream &os, const bus_stop &gp);\n    virtual std::string description() const = 0;\n    gps_position latitude;\n    gps_position longitude;\n    template<class Archive>\n    void serialize(Archive &ar, const unsigned int version)\n    {\n        ar & latitude;\n        ar & longitude;\n    }\nprotected:\n    bus_stop(const gps_position & _lat, const gps_position & _long) :\n        latitude(_lat), longitude(_long)\n    {}\npublic:\n    bus_stop(){}\n    virtual ~bus_stop(){}\n};\n\nBOOST_SERIALIZATION_ASSUME_ABSTRACT(bus_stop)\n\nstd::ostream & operator<<(std::ostream &os, const bus_stop &bs)\n{\n    return os << bs.latitude << bs.longitude << ' ' << bs.description();\n}\n\n/////////////////////////////////////////////////////////////\n// Several kinds of bus stops\n//\n// illustrates serialization of derived types\n//\nclass bus_stop_corner : public bus_stop\n{\n    friend class boost::serialization::access;\n    std::string street1;\n    std::string street2;\n    virtual std::string description() const\n    {\n        return street1 + \" and \" + street2;\n    }\n    template<class Archive>\n    void serialize(Archive &ar, const unsigned int version)\n    {\n        // save/load base class information\n        ar & boost::serialization::base_object<bus_stop>(*this);\n        ar & street1 & street2;\n    }\n\npublic:\n    bus_stop_corner(){}\n    bus_stop_corner(const gps_position & _lat, const gps_position & _long,\n        const std::string & _s1, const std::string & _s2\n    ) :\n        bus_stop(_lat, _long), street1(_s1), street2(_s2)\n    {\n    }\n};\n\nclass bus_stop_destination : public bus_stop\n{\n    friend class boost::serialization::access;\n    std::string name;\n    virtual std::string description() const\n    {\n        return name;\n    }\n    template<class Archive>\n    void serialize(Archive &ar, const unsigned int version)\n    {\n        ar & boost::serialization::base_object<bus_stop>(*this) & name;\n    }\npublic:\n\n    bus_stop_destination(){}\n    bus_stop_destination(\n        const gps_position & _lat, const gps_position & _long, const std::string & _name\n    ) :\n        bus_stop(_lat, _long), name(_name)\n    {\n    }\n};\n\n/////////////////////////////////////////////////////////////\n// a bus route is a collection of bus stops\n//\n// illustrates serialization of STL collection templates.\n//\n// illustrates serialization of polymorphic pointer (bus stop *);\n//\n// illustrates storage and recovery of shared pointers is correct\n// and efficient.  That is objects pointed to by more than one\n// pointer are stored only once.  In such cases only one such\n// object is restored and pointers are restored to point to it\n//\nclass bus_route\n{\n    friend class boost::serialization::access;\n    friend std::ostream & operator<<(std::ostream &os, const bus_route &br);\n    typedef bus_stop * bus_stop_pointer;\n    std::list<bus_stop_pointer> stops;\n    template<class Archive>\n    void serialize(Archive &ar, const unsigned int version)\n    {\n        // in this program, these classes are never serialized directly but rather\n        // through a pointer to the base class bus_stop. So we need a way to be\n        // sure that the archive contains information about these derived classes.\n        //ar.template register_type<bus_stop_corner>();\n        ar.register_type(static_cast<bus_stop_corner *>(NULL));\n        //ar.template register_type<bus_stop_destination>();\n        ar.register_type(static_cast<bus_stop_destination *>(NULL));\n        // serialization of stl collections is already defined\n        // in the header\n        ar & stops;\n    }\npublic:\n    bus_route(){}\n    void append(bus_stop *_bs)\n    {\n        stops.insert(stops.end(), _bs);\n    }\n};\nstd::ostream & operator<<(std::ostream &os, const bus_route &br)\n{\n    std::list<bus_stop *>::const_iterator it;\n    // note: we're displaying the pointer to permit verification\n    // that duplicated pointers are properly restored.\n    for(it = br.stops.begin(); it != br.stops.end(); it++){\n        os << '\\n' << std::hex << \"0x\" << *it << std::dec << ' ' << **it;\n    }\n    return os;\n}\n\n/////////////////////////////////////////////////////////////\n// a bus schedule is a collection of routes each with a starting time\n//\n// Illustrates serialization of STL objects(pair) in a non-intrusive way.\n// See definition of operator<< <pair<F, S> >(ar, pair) and others in\n// serialization.hpp\n//\n// illustrates nesting of serializable classes\n//\n// illustrates use of version number to automatically grandfather older\n// versions of the same class.\n\nclass bus_schedule\n{\npublic:\n    // note: this structure was made public. because the friend declarations\n    // didn't seem to work as expected.\n    struct trip_info\n    {\n        template<class Archive>\n        void serialize(Archive &ar, const unsigned int file_version)\n        {\n            // in versions 2 or later\n            if(file_version >= 2)\n                // read the drivers name\n                ar & driver;\n            // all versions have the following info\n            ar & hour & minute;\n        }\n\n        // starting time\n        int hour;\n        int minute;\n        // only after system shipped was the driver's name added to the class\n        std::string driver;\n\n        trip_info(){}\n        trip_info(int _h, int _m, const std::string &_d) :\n            hour(_h), minute(_m), driver(_d)\n        {}\n    };\nprivate:\n    friend class boost::serialization::access;\n    friend std::ostream & operator<<(std::ostream &os, const bus_schedule &bs);\n    friend std::ostream & operator<<(std::ostream &os, const bus_schedule::trip_info &ti);\n    std::list<std::pair<trip_info, bus_route *> > schedule;\n    template<class Archive>\n    void serialize(Archive &ar, const unsigned int version)\n    {\n        ar & schedule;\n    }\npublic:\n    void append(const std::string &_d, int _h, int _m, bus_route *_br)\n    {\n        schedule.insert(schedule.end(), std::make_pair(trip_info(_h, _m, _d), _br));\n    }\n    bus_schedule(){}\n};\nBOOST_CLASS_VERSION(bus_schedule::trip_info, 2)\n\nstd::ostream & operator<<(std::ostream &os, const bus_schedule::trip_info &ti)\n{\n    return os << '\\n' << ti.hour << ':' << ti.minute << ' ' << ti.driver << ' ';\n}\nstd::ostream & operator<<(std::ostream &os, const bus_schedule &bs)\n{\n    std::list<std::pair<bus_schedule::trip_info, bus_route *> >::const_iterator it;\n    for(it = bs.schedule.begin(); it != bs.schedule.end(); it++){\n        os << it->first << *(it->second);\n    }\n    return os;\n}\n\nvoid save_schedule(const bus_schedule &s, const char * filename){\n    // make an archive\n    std::ofstream ofs(filename);\n    boost::archive::text_oarchive oa(ofs);\n    oa << s;\n}\n\nvoid\nrestore_schedule(bus_schedule &s, const char * filename)\n{\n    // open the archive\n    std::ifstream ifs(filename);\n    boost::archive::text_iarchive ia(ifs);\n\n    // restore the schedule from the archive\n    ia >> s;\n}\n\nint main(int argc, char *argv[])\n{\n    // make the schedule\n    bus_schedule original_schedule;\n\n    // fill in the data\n    // make a few stops\n    bus_stop *bs0 = new bus_stop_corner(\n        gps_position(34, 135, 52.560f),\n        gps_position(134, 22, 78.30f),\n        \"24th Street\", \"10th Avenue\"\n    );\n    bus_stop *bs1 = new bus_stop_corner(\n        gps_position(35, 137, 23.456f),\n        gps_position(133, 35, 54.12f),\n        \"State street\", \"Cathedral Vista Lane\"\n    );\n    bus_stop *bs2 = new bus_stop_destination(\n        gps_position(35, 136, 15.456f),\n        gps_position(133, 32, 15.300f),\n        \"White House\"\n    );\n    bus_stop *bs3 = new bus_stop_destination(\n        gps_position(35, 134, 48.789f),\n        gps_position(133, 32, 16.230f),\n        \"Lincoln Memorial\"\n    );\n\n    // make a route\n    bus_route route0;\n    route0.append(bs0);\n    route0.append(bs1);\n    route0.append(bs2);\n\n    // add trips to schedule\n    original_schedule.append(\"bob\", 6, 24, &route0);\n    original_schedule.append(\"bob\", 9, 57, &route0);\n    original_schedule.append(\"alice\", 11, 02, &route0);\n\n    // make another route\n    bus_route route1;\n    route1.append(bs3);\n    route1.append(bs2);\n    route1.append(bs1);\n\n    // add trips to schedule\n    original_schedule.append(\"ted\", 7, 17, &route1);\n    original_schedule.append(\"ted\", 9, 38, &route1);\n    original_schedule.append(\"alice\", 11, 47, &route1);\n\n    // display the complete schedule\n    std::cout << \"original schedule\";\n    std::cout << original_schedule;\n\n    std::string filename(boost::archive::tmpdir());\n    filename += \"/demofile.txt\";\n\n    // save the schedule\n    save_schedule(original_schedule, filename.c_str());\n\n    // ... some time later\n    // make a new schedule\n    bus_schedule new_schedule;\n\n    restore_schedule(new_schedule, filename.c_str());\n\n    // and display\n    std::cout << \"\\nrestored schedule\";\n    std::cout << new_schedule;\n    // should be the same as the old one. (except for the pointer values)\n\n    delete bs0;\n    delete bs1;\n    delete bs2;\n    delete bs3;\n    return 0;\n}\n"
  },
  {
    "path": "example/demo_auto_ptr.cpp",
    "content": "/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// demo_auto_ptr.cpp\n\n// (C) Copyright 2002-4 Robert Ramey - http://www.rrsd.com .\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n#include <list>\n#include <memory>\n#include <fstream>\n#include <string>\n\n#include <cstdio> // remove, std::autoptr inteface wrong in dinkumware\n#include <boost/config.hpp>\n#if defined(BOOST_NO_STDC_NAMESPACE)\nnamespace std{\n    using ::remove;\n}\n#endif\n\n#include <boost/archive/tmpdir.hpp>\n#include <boost/archive/text_oarchive.hpp>\n#include <boost/archive/text_iarchive.hpp>\n\n#include <boost/serialization/split_free.hpp>\n\nnamespace boost {\nnamespace serialization {\n\n/////////////////////////////////////////////////////////////\n// implement serialization for auto_ptr< T >\n// note: this must be added to the boost namespace in order to\n// be called by the library\ntemplate<class Archive, class T>\ninline void save(\n    Archive & ar,\n    const std::auto_ptr< T > &t,\n    const unsigned int file_version\n){\n    // only the raw pointer has to be saved\n    // the ref count is rebuilt automatically on load\n    const T * const tx = t.get();\n    ar << tx;\n}\n\ntemplate<class Archive, class T>\ninline void load(\n    Archive & ar,\n    std::auto_ptr< T > &t,\n    const unsigned int file_version\n){\n    T *pTarget;\n    ar >> pTarget;\n    // note that the reset automagically maintains the reference count\n    #if BOOST_WORKAROUND(BOOST_DINKUMWARE_STDLIB, == 1)\n        t.release();\n        t = std::auto_ptr< T >(pTarget);\n    #else\n        t.reset(pTarget);\n    #endif\n}\n\n// split non-intrusive serialization function member into separate\n// non intrusive save/load member functions\ntemplate<class Archive, class T>\ninline void serialize(\n    Archive & ar,\n    std::auto_ptr< T > &t,\n    const unsigned int file_version\n){\n    boost::serialization::split_free(ar, t, file_version);\n}\n\n} // namespace serialization\n} // namespace boost\n\n/////////////////////////////////////////////////////////////\n// test auto_ptr serialization\nclass A\n{\nprivate:\n    friend class boost::serialization::access;\n    int x;\n    template<class Archive>\n    void serialize(Archive &ar, const unsigned int /* file_version */){\n        ar & x;\n    }\npublic:\n    A(){}    // default constructor\n    ~A(){}   // default destructor\n};\n\nvoid save(const std::auto_ptr<A> & spa, const char *filename)\n{\n    std::ofstream ofs(filename);\n    boost::archive::text_oarchive oa(ofs);\n    oa << spa;\n}\n\nvoid load(std::auto_ptr<A> & spa, const char *filename)\n{\n    // open the archive\n    std::ifstream ifs(filename);\n    boost::archive::text_iarchive ia(ifs);\n\n    // restore the schedule from the archive\n    ia >> spa;\n}\n\nint main(int argc, char *argv[])\n{\n    std::string filename = boost::archive::tmpdir();\n    filename += \"/testfile\";\n\n    // create  a new auto pointer to ta new object of type A\n    std::auto_ptr<A> spa(new A);\n    // serialize it\n    save(spa, filename.c_str());\n    // reset the auto pointer to NULL\n    // thereby destroying the object of type A\n    // note that the reset automagically maintains the reference count\n    #if BOOST_WORKAROUND(BOOST_DINKUMWARE_STDLIB, == 1)\n        spa.release();\n    #else\n        spa.reset();\n    #endif\n    // restore state to one equivalent to the original\n    // creating a new type A object\n    load(spa, filename.c_str());\n    // obj of type A gets destroyed\n    // as auto_ptr goes out of scope\n    std::remove(filename.c_str());\n    return 0;\n}\n"
  },
  {
    "path": "example/demo_dll_a.hpp",
    "content": "#ifndef BOOST_SERIALIZATION_TEST_A_HPP\n#define BOOST_SERIALIZATION_TEST_A_HPP\n\n// MS compatible compilers support #pragma once\n#if defined(_MSC_VER)\n# pragma once\n#endif\n\n/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// A.hpp    simple class test\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for updates, documentation, and revision history.\n\n#include <cassert>\n#include <cstdlib> // for rand()\n#include <cmath> // for fabs()\n#include <cstddef> // size_t\n#include <boost/math/special_functions/next.hpp>\n\n#include <boost/config.hpp>\n#if defined(BOOST_NO_STDC_NAMESPACE)\nnamespace std{\n    using ::rand;\n    using ::fabs;\n    using ::size_t;\n}\n#endif\n\n//#include <boost/test/test_exec_monitor.hpp>\n#include <boost/limits.hpp>\n#include <boost/cstdint.hpp>\n\n#include <boost/detail/workaround.hpp>\n#if BOOST_WORKAROUND(BOOST_DINKUMWARE_STDLIB, == 1)\n#include <boost/archive/dinkumware.hpp>\n#endif\n\n#include <boost/serialization/nvp.hpp>\n#include <boost/serialization/string.hpp>\n#include <boost/serialization/access.hpp>\n\nclass A\n{\nprivate:\n    friend class boost::serialization::access;\n    // note: from an aesthetic perspective, I would much prefer to have this\n    // defined out of line.  Unfortunately, this trips a bug in the VC 6.0\n    // compiler. So hold our nose and put it her to permit running of tests.\n    template<class Archive>\n    void serialize(\n        Archive &ar,\n        const unsigned int /* file_version */\n    ){\n        ar & BOOST_SERIALIZATION_NVP(b);\n        #ifndef BOOST_NO_INT64_T\n        ar & BOOST_SERIALIZATION_NVP(f);\n        ar & BOOST_SERIALIZATION_NVP(g);\n        #endif\n        #if BOOST_WORKAROUND(BOOST_BORLANDC,  <= 0x551 )\n            int i;\n            if(BOOST_DEDUCED_TYPENAME Archive::is_saving::value){\n                i = l;\n                ar & BOOST_SERIALIZATION_NVP(i);\n            }\n            else{\n                ar & BOOST_SERIALIZATION_NVP(i);\n                l = i;\n            }\n        #else\n            ar & BOOST_SERIALIZATION_NVP(l);\n        #endif\n        ar & BOOST_SERIALIZATION_NVP(m);\n        ar & BOOST_SERIALIZATION_NVP(n);\n        ar & BOOST_SERIALIZATION_NVP(o);\n        ar & BOOST_SERIALIZATION_NVP(p);\n        ar & BOOST_SERIALIZATION_NVP(q);\n        #ifndef BOOST_NO_CWCHAR\n        ar & BOOST_SERIALIZATION_NVP(r);\n        #endif\n        ar & BOOST_SERIALIZATION_NVP(c);\n        ar & BOOST_SERIALIZATION_NVP(s);\n        ar & BOOST_SERIALIZATION_NVP(t);\n        ar & BOOST_SERIALIZATION_NVP(u);\n        ar & BOOST_SERIALIZATION_NVP(v);\n        ar & BOOST_SERIALIZATION_NVP(w);\n        ar & BOOST_SERIALIZATION_NVP(x);\n        ar & BOOST_SERIALIZATION_NVP(y);\n        #ifndef BOOST_NO_STD_WSTRING\n        ar & BOOST_SERIALIZATION_NVP(z);\n        #endif\n    }\n    bool b;\n    #ifndef BOOST_NO_INT64_T\n    boost::int64_t f;\n    boost::uint64_t g;\n    #endif\n    enum h {\n        i = 0,\n        j,\n        k\n    } l;\n    std::size_t m;\n    signed long n;\n    unsigned long o;\n    signed  short p;\n    unsigned short q;\n    #ifndef BOOST_NO_CWCHAR\n    wchar_t r;\n    #endif\n    char c;\n    signed char s;\n    unsigned char t;\n    signed int u;\n    unsigned int v;\n    float w;\n    double x;\n    std::string y;\n    #ifndef BOOST_NO_STD_WSTRING\n    std::wstring z;\n    #endif\npublic:\n    A();\n    bool operator==(const A &rhs) const;\n    bool operator!=(const A &rhs) const;\n    bool operator<(const A &rhs) const; // used by less\n    // hash function for class A\n    operator std::size_t () const;\n    friend std::ostream & operator<<(std::ostream & os, A const & a);\n    friend std::istream & operator>>(std::istream & is, A & a);\n};\n\n//BOOST_TEST_DONT_PRINT_LOG_VALUE(A);\n\ntemplate<class S>\nvoid randomize(S &x)\n{\n    assert(0 == x.size());\n    for(;;){\n        unsigned int i = std::rand() % 27;\n        if(0 == i)\n            break;\n        x += static_cast<BOOST_DEDUCED_TYPENAME S::value_type>('a' - 1 + i);\n    }\n}\n\ntemplate<class T>\nvoid accumulate(std::size_t & s, const T & t){\n    const char * tptr = (const char *)(& t);\n    unsigned int count = sizeof(t);\n    while(count-- > 0){\n        s += *tptr++;\n    }\n}\n\nA::operator std::size_t () const {\n    std::size_t retval = 0;\n    accumulate(retval, b);\n    #ifndef BOOST_NO_INT64_T\n    accumulate(retval, f);\n    accumulate(retval, g);\n    #endif\n    accumulate(retval, l);\n    accumulate(retval, m);\n    accumulate(retval, n);\n    accumulate(retval, o);\n    accumulate(retval, p);\n    accumulate(retval, q);\n    #ifndef BOOST_NO_CWCHAR\n    accumulate(retval, r);\n    #endif\n    accumulate(retval, c);\n    accumulate(retval, s);\n    accumulate(retval, t);\n    accumulate(retval, u);\n    accumulate(retval, v);\n    return retval;\n}\n\ninline A::A() :\n    b(true),\n    #ifndef BOOST_NO_INT64_T\n    f(std::rand() * std::rand()),\n    g(std::rand() * std::rand()),\n    #endif\n    l(static_cast<enum h>(std::rand() % 3)),\n    m(std::rand()),\n    n(std::rand()),\n    o(std::rand()),\n    p(std::rand()),\n    q(std::rand()),\n    #ifndef BOOST_NO_CWCHAR\n    r(std::rand()),\n    #endif\n    c(std::rand()),\n    s(std::rand()),\n    t(std::rand()),\n    u(std::rand()),\n    v(std::rand()),\n    w((float)std::rand()),\n    x((double)std::rand())\n{\n    randomize(y);\n    #ifndef BOOST_NO_STD_WSTRING\n    randomize(z);\n    #endif\n}\n\ninline bool A::operator==(const A &rhs) const\n{\n    if(b != rhs.b)\n        return false;\n    if(l != rhs.l)\n        return false;\n    #ifndef BOOST_NO_INT64_T\n    if(f != rhs.f)\n        return false;\n    if(g != rhs.g)\n        return false;\n    #endif\n    if(m != rhs.m)\n        return false;\n    if(n != rhs.n)\n        return false;\n    if(o != rhs.o)\n        return false;\n    if(p != rhs.p)\n        return false;\n    if(q != rhs.q)\n        return false;\n    #ifndef BOOST_NO_CWCHAR\n    if(r != rhs.r)\n        return false;\n    #endif\n    if(c != rhs.c)\n        return false;\n    if(s != rhs.s)\n        return false;\n    if(t != rhs.t)\n        return false;\n    if(u != rhs.u)\n        return false;\n    if(v != rhs.v)\n        return false;\n    if(std::abs( boost::math::float_distance(w, rhs.w)) > 1)\n        return false;\n    if(std::abs( boost::math::float_distance(x, rhs.x)) > 1)\n        return false;\n    if(0 != y.compare(rhs.y))\n        return false;\n    #ifndef BOOST_NO_STD_WSTRING\n    if(0 != z.compare(rhs.z))\n        return false;\n    #endif\n    return true;\n}\n\ninline bool A::operator!=(const A &rhs) const\n{\n    return ! (*this == rhs);\n}\n\ninline bool A::operator<(const A &rhs) const\n{\n    if(b != rhs.b)\n        return b < rhs.b;\n    #ifndef BOOST_NO_INT64_T\n    if(f != rhs.f)\n        return f < rhs.f;\n    if(g != rhs.g)\n        return g < rhs.g;\n    #endif\n    if(l != rhs.l )\n        return l < rhs.l;\n    if(m != rhs.m )\n        return m < rhs.m;\n    if(n != rhs.n )\n        return n < rhs.n;\n    if(o != rhs.o )\n        return o < rhs.o;\n    if(p != rhs.p )\n        return p < rhs.p;\n    if(q != rhs.q )\n        return q < rhs.q;\n    #ifndef BOOST_NO_CWCHAR\n    if(r != rhs.r )\n        return r < rhs.r;\n    #endif\n    if(c != rhs.c )\n        return c < rhs.c;\n    if(s != rhs.s )\n        return s < rhs.s;\n    if(t != rhs.t )\n        return t < rhs.t;\n    if(u != rhs.u )\n        return u < rhs.u;\n    if(v != rhs.v )\n        return v < rhs.v;\n    if(w != rhs.w )\n        return w < rhs.w;\n    if(x != rhs.x )\n        return x < rhs.x;\n    int i = y.compare(rhs.y);\n    if(i !=  0 )\n        return i < 0;\n    #ifndef BOOST_NO_STD_WSTRING\n    int j = z.compare(rhs.z);\n    if(j !=  0 )\n        return j < 0;\n    #endif\n    return false;\n}\n\n#endif // BOOST_SERIALIZATION_TEST_A_HPP\n"
  },
  {
    "path": "example/demo_dll_a.ipp",
    "content": "#ifndef BOOST_SERIALIZATION_TEST_A_HPP\n#define BOOST_SERIALIZATION_TEST_A_HPP\n\n// MS compatible compilers support #pragma once\n#if defined(_MSC_VER)\n# pragma once\n#endif\n\n/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// A.hpp    simple class test\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com . \n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for updates, documentation, and revision history.\n\n#include <cassert>\n#include <cstdlib> // for rand()\n#include <cmath> // for fabs()\n#include <cstddef> // size_t\n\n#include <boost/config.hpp>\n#if defined(BOOST_NO_STDC_NAMESPACE)\nnamespace std{\n    using ::rand; \n    using ::fabs;\n    using ::size_t;\n}\n#endif\n\n//#include <boost/test/test_exec_monitor.hpp>\n#include <boost/limits.hpp>\n#include <boost/cstdint.hpp>\n\n#include <boost/detail/workaround.hpp>\n#if BOOST_WORKAROUND(BOOST_DINKUMWARE_STDLIB, == 1)\n#include <boost/archive/dinkumware.hpp>\n#endif\n\n#include <boost/serialization/nvp.hpp>\n#include <boost/serialization/string.hpp>\n#include <boost/serialization/access.hpp>\n\nclass A\n{\nprivate:\n    friend class boost::serialization::access;\n    // note: from an aesthetic perspective, I would much prefer to have this\n    // defined out of line.  Unfortunately, this trips a bug in the VC 6.0\n    // compiler. So hold our nose and put it her to permit running of tests.\n    template<class Archive>\n    void serialize(\n        Archive &ar,\n        const unsigned int /* file_version */\n    ){\n        ar & BOOST_SERIALIZATION_NVP(b);\n        #ifndef BOOST_NO_INT64_T\n        ar & BOOST_SERIALIZATION_NVP(f);\n        ar & BOOST_SERIALIZATION_NVP(g);\n        #endif\n        #if BOOST_WORKAROUND(BOOST_BORLANDC,  <= 0x551 )\n            int i;\n            if(BOOST_DEDUCED_TYPENAME Archive::is_saving::value){\n                i = l;\n                ar & BOOST_SERIALIZATION_NVP(i);\n            }\n            else{\n                ar & BOOST_SERIALIZATION_NVP(i);\n                l = i;\n            }\n        #else\n            ar & BOOST_SERIALIZATION_NVP(l);\n        #endif\n        ar & BOOST_SERIALIZATION_NVP(m);\n        ar & BOOST_SERIALIZATION_NVP(n);\n        ar & BOOST_SERIALIZATION_NVP(o);\n        ar & BOOST_SERIALIZATION_NVP(p);\n        ar & BOOST_SERIALIZATION_NVP(q);\n        #ifndef BOOST_NO_CWCHAR\n        ar & BOOST_SERIALIZATION_NVP(r);\n        #endif\n        ar & BOOST_SERIALIZATION_NVP(c);\n        ar & BOOST_SERIALIZATION_NVP(s);\n        ar & BOOST_SERIALIZATION_NVP(t);\n        ar & BOOST_SERIALIZATION_NVP(u);\n        ar & BOOST_SERIALIZATION_NVP(v);\n        ar & BOOST_SERIALIZATION_NVP(w);\n        ar & BOOST_SERIALIZATION_NVP(x);\n        ar & BOOST_SERIALIZATION_NVP(y);\n        #ifndef BOOST_NO_STD_WSTRING\n        ar & BOOST_SERIALIZATION_NVP(z);\n        #endif\n    }\n    bool b;\n    #ifndef BOOST_NO_INT64_T\n    boost::int64_t f;\n    boost::uint64_t g;\n    #endif\n    enum h {\n        i = 0,\n        j,\n        k\n    } l;\n    std::size_t m;\n    signed long n;\n    unsigned long o;\n    signed  short p;\n    unsigned short q;\n    #ifndef BOOST_NO_CWCHAR\n    wchar_t r;\n    #endif\n    char c;\n    signed char s;\n    unsigned char t;\n    signed int u;\n    unsigned int v;\n    float w;\n    double x;\n    std::string y;\n    #ifndef BOOST_NO_STD_WSTRING\n    std::wstring z;\n    #endif\npublic:\n    A();\n    bool operator==(const A &rhs) const;\n    bool operator!=(const A &rhs) const;\n    bool operator<(const A &rhs) const; // used by less\n    // hash function for class A\n    operator std::size_t () const;\n    friend std::ostream & operator<<(std::ostream & os, A const & a);\n    friend std::istream & operator>>(std::istream & is, A & a);\n};\n\n//BOOST_TEST_DONT_PRINT_LOG_VALUE(A);\n\ntemplate<class S>\nvoid randomize(S &x)\n{\n    assert(0 == x.size());\n    for(;;){\n        unsigned int i = std::rand() % 27;\n        if(0 == i)\n            break;\n        x += static_cast<BOOST_DEDUCED_TYPENAME S::value_type>('a' - 1 + i);\n    }\n}\n\ntemplate<class T>\nvoid accumulate(std::size_t & s, const T & t){\n    const char * tptr = (const char *)(& t);\n    unsigned int count = sizeof(t);\n    while(count-- > 0){\n        s += *tptr++;\n    }\n}\n\nA::operator std::size_t () const {\n    std::size_t retval = 0;\n    accumulate(retval, b);\n    #ifndef BOOST_NO_INT64_T\n    accumulate(retval, f);\n    accumulate(retval, g);\n    #endif\n    accumulate(retval, l);\n    accumulate(retval, m);\n    accumulate(retval, n);\n    accumulate(retval, o);\n    accumulate(retval, p);\n    accumulate(retval, q);\n    #ifndef BOOST_NO_CWCHAR\n    accumulate(retval, r);\n    #endif\n    accumulate(retval, c);\n    accumulate(retval, s);\n    accumulate(retval, t);\n    accumulate(retval, u);\n    accumulate(retval, v);\n    return retval;\n}\n\ninline A::A() :\n    b(true),\n    #ifndef BOOST_NO_INT64_T\n    f(std::rand() * std::rand()),\n    g(std::rand() * std::rand()),\n    #endif\n    l(static_cast<enum h>(std::rand() % 3)),\n    m(std::rand()),\n    n(std::rand()),\n    o(std::rand()),\n    p(std::rand()),\n    q(std::rand()),\n    #ifndef BOOST_NO_CWCHAR\n    r(std::rand()),\n    #endif\n    c(std::rand()),\n    s(std::rand()),\n    t(std::rand()),\n    u(std::rand()),\n    v(std::rand()),\n    w((float)std::rand()),\n    x((double)std::rand())\n{\n    randomize(y);\n    #ifndef BOOST_NO_STD_WSTRING\n    randomize(z);\n    #endif\n}\n\ninline bool A::operator==(const A &rhs) const\n{\n    if(b != rhs.b)\n        return false;\n    if(l != rhs.l)\n        return false;\n    #ifndef BOOST_NO_INT64_T\n    if(f != rhs.f)\n        return false;\n    if(g != rhs.g)\n        return false;\n    #endif\n    if(m != rhs.m)\n        return false;\n    if(n != rhs.n)\n        return false;\n    if(o != rhs.o)\n        return false;\n    if(p != rhs.p)\n        return false; \n    if(q != rhs.q)\n        return false;\n    #ifndef BOOST_NO_CWCHAR\n    if(r != rhs.r)\n        return false; \n    #endif\n    if(c != rhs.c)\n        return false;\n    if(s != rhs.s)\n        return false;\n    if(t != rhs.t)\n        return false;\n    if(u != rhs.u)\n        return false; \n    if(v != rhs.v)\n        return false;\n    if(std::abs( boost::math::float_distance(w, rhs.w)) > 1)\n        return false;\n    if(std::abs( boost::math::float_distance(x, rhs.x)) > 1)\n        return false;\n    if(0 != y.compare(rhs.y))\n        return false;\n    #ifndef BOOST_NO_STD_WSTRING\n    if(0 != z.compare(rhs.z))\n        return false;\n    #endif      \n    return true;\n}\n\ninline bool A::operator!=(const A &rhs) const\n{\n    return ! (*this == rhs);\n}\n\ninline bool A::operator<(const A &rhs) const\n{\n    if(b != rhs.b)\n        return b < rhs.b;\n    #ifndef BOOST_NO_INT64_T\n    if(f != rhs.f)\n        return f < rhs.f;\n    if(g != rhs.g)\n        return g < rhs.g;\n    #endif\n    if(l != rhs.l )\n        return l < rhs.l;\n    if(m != rhs.m )\n        return m < rhs.m;\n    if(n != rhs.n )\n        return n < rhs.n;\n    if(o != rhs.o )\n        return o < rhs.o;\n    if(p != rhs.p )\n        return p < rhs.p;\n    if(q != rhs.q )\n        return q < rhs.q;\n    #ifndef BOOST_NO_CWCHAR\n    if(r != rhs.r )\n        return r < rhs.r;\n    #endif\n    if(c != rhs.c )\n        return c < rhs.c;\n    if(s != rhs.s )\n        return s < rhs.s;\n    if(t != rhs.t )\n        return t < rhs.t;\n    if(u != rhs.u )\n        return u < rhs.u; \n    if(v != rhs.v )\n        return v < rhs.v;\n    if(w != rhs.w )\n        return w < rhs.w; \n    if(x != rhs.x )\n        return x < rhs.x;\n    int i = y.compare(rhs.y);\n    if(i !=  0 )\n        return i < 0;\n    #ifndef BOOST_NO_STD_WSTRING\n    int j = z.compare(rhs.z);\n    if(j !=  0 )\n        return j < 0;\n    #endif\n    return false;\n}\n\n#endif // BOOST_SERIALIZATION_TEST_A_HPP\n"
  },
  {
    "path": "example/demo_dll_b.hpp",
    "content": "#ifndef BOOST_SERIALIZATION_TEST_B_HPP\n#define BOOST_SERIALIZATION_TEST_B_HPP\n\n// MS compatible compilers support #pragma once\n#if defined(_MSC_VER)\n# pragma once\n#endif\n\n/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// B.hpp\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for updates, documentation, and revision history.\n\n#include <cstdlib> // for rand()\n#include <boost/math/special_functions/next.hpp>\n\n#include <boost/config.hpp>\n#if defined(BOOST_NO_STDC_NAMESPACE)\nnamespace std{\n    using ::rand;\n}\n#endif\n\n#include <boost/serialization/version.hpp>\n#include <boost/serialization/split_member.hpp>\n#include <boost/serialization/base_object.hpp>\n\n#include \"A.hpp\"\n\n///////////////////////////////////////////////////////\n// Derived class test\nclass B : public A\n{\nprivate:\n    friend class boost::serialization::access;\n    template<class Archive>\n    void save(Archive &ar, const unsigned int /* file_version */) const\n    {\n        // write any base class info to the archive\n        ar << BOOST_SERIALIZATION_BASE_OBJECT_NVP(A);\n\n        // write out members\n        ar << BOOST_SERIALIZATION_NVP(s);\n        ar << BOOST_SERIALIZATION_NVP(t);\n        ar << BOOST_SERIALIZATION_NVP(u);\n        ar << BOOST_SERIALIZATION_NVP(v);\n        ar << BOOST_SERIALIZATION_NVP(w);\n        ar << BOOST_SERIALIZATION_NVP(x);\n    }\n\n    template<class Archive>\n    void load(Archive & ar, const unsigned int file_version)\n    {\n        // read any base class info to the archive\n        ar >> BOOST_SERIALIZATION_BASE_OBJECT_NVP(A);\n        switch(file_version){\n        case 1:\n        case 2:\n            ar >> BOOST_SERIALIZATION_NVP(s);\n            ar >> BOOST_SERIALIZATION_NVP(t);\n            ar >> BOOST_SERIALIZATION_NVP(u);\n            ar >> BOOST_SERIALIZATION_NVP(v);\n            ar >> BOOST_SERIALIZATION_NVP(w);\n            ar >> BOOST_SERIALIZATION_NVP(x);\n        default:\n            break;\n        }\n    }\n\n    BOOST_SERIALIZATION_SPLIT_MEMBER()\n    signed char s;\n    unsigned char t;\n    signed int u;\n    unsigned int v;\n    float w;\n    double x;\npublic:\n    B();\n    virtual ~B(){};\n    bool operator==(const B &rhs) const;\n};\n\nB::B() :\n    s(std::rand()),\n    t(std::rand()),\n    u(std::rand()),\n    v(std::rand()),\n    w((float)std::rand() / std::rand()),\n    x((double)std::rand() / std::rand())\n{\n}\n\nBOOST_CLASS_VERSION(B, 2)\n\ninline bool B::operator==(const B &rhs) const\n{\n    return\n        A::operator==(rhs)\n        && s == rhs.s\n        && t == rhs.t\n        && u == rhs.u\n        && v == rhs.v\n        && std::abs( boost::math::float_distance(w, rhs.w)) < 2\n        && std::abs( boost::math::float_distance(x, rhs.x)) < 2\n    ;\n}\n\n#endif // BOOST_SERIALIZATION_TEST_B_HPP\n"
  },
  {
    "path": "example/demo_dll_b.ipp",
    "content": "#ifndef BOOST_SERIALIZATION_TEST_B_HPP\n#define BOOST_SERIALIZATION_TEST_B_HPP\n\n// MS compatible compilers support #pragma once\n#if defined(_MSC_VER)\n# pragma once\n#endif\n\n/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// B.hpp\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com . \n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for updates, documentation, and revision history.\n\n#include <cstdlib> // for rand()\n\n#include <boost/config.hpp>\n#if defined(BOOST_NO_STDC_NAMESPACE)\nnamespace std{\n    using ::rand; \n}\n#endif\n\n#include <boost/serialization/version.hpp>\n#include <boost/serialization/split_member.hpp>\n#include <boost/serialization/base_object.hpp>\n\n#include \"A.hpp\"\n\n///////////////////////////////////////////////////////\n// Derived class test\nclass B : public A\n{\nprivate:\n    friend class boost::serialization::access;\n    template<class Archive>\n    void save(Archive &ar, const unsigned int /* file_version */) const\n    {\n        // write any base class info to the archive\n        ar << BOOST_SERIALIZATION_BASE_OBJECT_NVP(A);\n\n        // write out members\n        ar << BOOST_SERIALIZATION_NVP(s);\n        ar << BOOST_SERIALIZATION_NVP(t);\n        ar << BOOST_SERIALIZATION_NVP(u);\n        ar << BOOST_SERIALIZATION_NVP(v);\n        ar << BOOST_SERIALIZATION_NVP(w);\n        ar << BOOST_SERIALIZATION_NVP(x);\n    }\n\n    template<class Archive>\n    void load(Archive & ar, const unsigned int file_version)\n    {\n        // read any base class info to the archive\n        ar >> BOOST_SERIALIZATION_BASE_OBJECT_NVP(A);\n        switch(file_version){\n        case 1:\n        case 2:\n            ar >> BOOST_SERIALIZATION_NVP(s);\n            ar >> BOOST_SERIALIZATION_NVP(t);\n            ar >> BOOST_SERIALIZATION_NVP(u);\n            ar >> BOOST_SERIALIZATION_NVP(v);\n            ar >> BOOST_SERIALIZATION_NVP(w);\n            ar >> BOOST_SERIALIZATION_NVP(x);\n        default:\n            break;\n        }\n    }\n\n    BOOST_SERIALIZATION_SPLIT_MEMBER()\n    signed char s;\n    unsigned char t;\n    signed int u;\n    unsigned int v;\n    float w;\n    double x;\npublic:\n    B();\n    virtual ~B(){};\n    bool operator==(const B &rhs) const;\n};\n\nB::B() :\n    s(std::rand()),\n    t(std::rand()),\n    u(std::rand()),\n    v(std::rand()),\n    w((float)std::rand() / std::rand()),\n    x((double)std::rand() / std::rand())\n{\n}\n\nBOOST_CLASS_VERSION(B, 2)\n\ninline bool B::operator==(const B &rhs) const\n{\n    return\n        A::operator==(rhs)\n        && s == rhs.s \n        && t == rhs.t \n        && u == rhs.u \n        && v == rhs.v \n        && std::abs( boost::math::float_distance(w, rhs.w)) < 2\n        && std::abs( boost::math::float_distance(x, rhs.x)) < 2\n    ;\n}\n\n#endif // BOOST_SERIALIZATION_TEST_B_HPP\n"
  },
  {
    "path": "example/demo_exception.cpp",
    "content": "/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// demo_exception.cpp\n\n// (C) Copyright 2002-4 Robert Ramey - http://www.rrsd.com .\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n// Example of safe exception handling for pointer de-serialization\n//\n// This example was prepared by Robert Ramey to demonstrate and test\n// safe exception handling during the de-serialization of pointers in\n// a non-trivial example.\n//\n// Hopefully, this addresses exception issues raised by\n// Vahan Margaryan who spent considerable time and effort\n// in the analysis and testing of issues of exception safety\n// of the serialization library.\n\n#include <algorithm>\n#include <iostream>\n#include <cstddef> // NULL\n#include <fstream>\n#include <string>\n\n#include <cstdio> // remove\n#include <boost/config.hpp>\n#if defined(BOOST_NO_STDC_NAMESPACE)\nnamespace std{\n    using ::remove;\n}\n#endif\n\n#include <boost/archive/tmpdir.hpp>\n\n#ifndef BOOST_NO_EXCEPTIONS\n#include <exception>\n#endif\n\n#include <boost/archive/text_iarchive.hpp>\n#include <boost/archive/text_oarchive.hpp>\n\n#include <boost/serialization/list.hpp>\n#include <boost/serialization/split_member.hpp>\n\ntemplate<class TPTR>\nstruct deleter\n{\n    void operator()(TPTR t){\n        delete t;\n    }\n};\n\nclass Course;\nclass Student;\n\nclass Student\n{\npublic:\n    static int count;\n    Student(){\n        count++;\n    }\n    ~Student(){\n        some_courses.clear();\n        count--;\n    }\n    std::list<Course *> some_courses;\nprivate:\n    friend class boost::serialization::access;\n    template<class Archive>\n    void serialize(Archive & ar, const unsigned int /* file_version */){\n        ar & some_courses;\n    }\n};\n\nint Student::count = 0;\n\nclass Course\n{\npublic:\n    static int count;\n    Course(){\n        count++;\n    }\n    ~Course(){\n        // doesnt delete pointers in list\n        // since it doesn't \"own\" them\n        some_students.clear();\n        count--;\n    }\n    std::list<Student *> some_students;\nprivate:\n    friend class boost::serialization::access;\n    template<class Archive>\n    void serialize(Archive & ar, const unsigned int /* file_version */){\n        ar & some_students;\n    }\n};\n\nint Course::count = 0;\n\nclass School\n{\npublic:\n    ~School(){\n        // must delete all the students because\n        // it \"owns\" them\n        std::for_each(all_students.begin(), all_students.end(), deleter<Student *>());\n        all_students.clear();\n        // as well as courses\n        std::for_each(all_courses.begin(), all_courses.end(), deleter<Course *>());\n        all_courses.clear();\n    }\n    std::list<Student *> all_students;\n    std::list<Course *> all_courses;\nprivate:\n    friend class boost::serialization::access;\n    BOOST_SERIALIZATION_SPLIT_MEMBER()\n    template<class Archive>\n    void save(Archive & ar, const unsigned int file_version) const;\n    template<class Archive>\n    void load(Archive & ar, const unsigned int file_version);\n};\n\n#if 0\n// case 1:\ntemplate<class Archive>\nvoid School::serialize(Archive & ar, const unsigned int /* file_version */){\n    // if an exception occurs while loading courses\n    // the structure courses may have some courses each\n    // with students\n    ar & all_courses;\n    // while all_students will have no members.\n    ar & all_students; // create students that have no courses\n    // so ~School() will delete all members of courses\n    // but this will NOT delete any students - see above\n    // a memory leak will be the result.\n}\n\n// switching the order of serialization doesn't help in this case\n// case 2:\ntemplate<class Archive>\nvoid School::serialize(Archive & ar, const unsigned int /* file_version */){\n    ar & all_students;\n    ar >> all_courses;  // create any courses that have no students\n}\n#endif\n\ntemplate<class Archive>\nvoid School::save(Archive & ar, const unsigned int /* file_version */) const {\n    ar << all_students;\n    ar << all_courses;\n}\n\ntemplate<class Archive>\nvoid School::load(Archive & ar, const unsigned int /* file_version */){\n    // if an exception occurs while loading courses\n    // the structure courses may have some courses each\n    // with students\n    try{\n        // deserialization of a Course * will in general provoke the\n        // deserialization of Student * which are added to the list of\n        // students for a class.  That is, this process will result\n        // in the copying of a pointer.\n        ar >> all_courses;\n        ar >> all_students; // create students that have no courses\n    }\n    catch(std::exception){\n        // eliminate any dangling references\n        all_courses.clear();\n        all_students.clear();\n        throw;\n    }\n}\n\nvoid init(School *school){\n    Student *bob = new Student();\n    Student *ted = new Student();\n    Student *carol = new Student();\n    Student *alice = new Student();\n\n    school->all_students.push_back(bob);\n    school->all_students.push_back(ted);\n    school->all_students.push_back(carol);\n    school->all_students.push_back(alice);\n\n    Course *math = new Course();\n    Course *history = new Course();\n    Course *literature = new Course();\n    Course *gym = new Course();\n\n    school->all_courses.push_back(math);\n    school->all_courses.push_back(history);\n    school->all_courses.push_back(literature);\n    school->all_courses.push_back(gym);\n\n    bob->some_courses.push_back(math);\n    math->some_students.push_back(bob);\n    bob->some_courses.push_back(literature);\n    literature->some_students.push_back(bob);\n\n    ted->some_courses.push_back(math);\n    math->some_students.push_back(ted);\n    ted->some_courses.push_back(history);\n    history->some_students.push_back(ted);\n\n    alice->some_courses.push_back(literature);\n    literature->some_students.push_back(alice);\n    alice->some_courses.push_back(history);\n    history->some_students.push_back(alice);\n\n    // no students signed up for gym\n    // carol has no courses\n}\n\nvoid save(const School * const school, const char *filename){\n    std::ofstream ofile(filename);\n    boost::archive::text_oarchive ar(ofile);\n    ar << school;\n}\n\nvoid load(School * & school, const char *filename){\n    std::ifstream ifile(filename);\n    boost::archive::text_iarchive ar(ifile);\n    try{\n        ar >> school;\n    }\n    catch(std::exception){\n        // eliminate dangling reference\n        school = NULL;\n    }\n}\n\nint main(int argc, char *argv[]){\n    std::string filename(boost::archive::tmpdir());\n    filename += \"/demofile.txt\";\n\n    School *school = new School();\n    std::cout << \"1. student count = \" << Student::count << std::endl;\n    std::cout << \"2. class count = \" << Course::count << std::endl;\n    init(school);\n    std::cout << \"3. student count = \" << Student::count << std::endl;\n    std::cout << \"4. class count = \" << Course::count << std::endl;\n    save(school, filename.c_str());\n    delete school;\n    school = NULL;\n    std::cout << \"5. student count = \" << Student::count << std::endl;\n    std::cout << \"6. class count = \" << Course::count << std::endl;\n    load(school, filename.c_str());\n    std::cout << \"7. student count = \" << Student::count << std::endl;\n    std::cout << \"8. class count = \" << Course::count << std::endl;\n    delete school;\n    std::cout << \"9. student count = \" << Student::count << std::endl;\n    std::cout << \"10. class count = \" << Course::count << std::endl;\n    std::remove(filename.c_str());\n    return Student::count + Course::count;\n}\n"
  },
  {
    "path": "example/demo_fast_archive.cpp",
    "content": "/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// demo_fast_binary_archive.cpp\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n// should pass compilation and execution\n#include <sstream>\n\n#include <boost/static_assert.hpp>\n#include <boost/type_traits/is_array.hpp>\n\n#define BOOST_ARCHIVE_SOURCE\n#include <boost/archive/binary_oarchive_impl.hpp>\n#include <boost/archive/binary_iarchive_impl.hpp>\n#include <boost/archive/detail/register_archive.hpp>\n\n// include template definitions for base classes used.  Otherwise\n// you'll get link failure with undefined symbols\n#include <boost/archive/impl/basic_binary_oprimitive.ipp>\n#include <boost/archive/impl/basic_binary_iprimitive.ipp>\n#include <boost/archive/impl/basic_binary_oarchive.ipp>\n#include <boost/archive/impl/basic_binary_iarchive.ipp>\n\nusing namespace boost::archive;\n\n/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// \"Fast\" output binary archive.  This is a variation of the native binary\nclass fast_binary_oarchive :\n    // don't derive from binary_oarchive !!!\n    public binary_oarchive_impl<\n        fast_binary_oarchive,\n        std::ostream::char_type,\n        std::ostream::traits_type\n    >\n{\n    typedef fast_binary_oarchive derived_t;\n    typedef binary_oarchive_impl<\n        fast_binary_oarchive,\n        std::ostream::char_type,\n        std::ostream::traits_type\n    > base_t;\n#ifndef BOOST_NO_MEMBER_TEMPLATE_FRIENDS\npublic:\n#else\n    friend class boost::archive::detail::interface_oarchive<derived_t>;\n    friend class basic_binary_oarchive<derived_t>;\n    friend class basic_binary_oprimitive<\n        derived_t,\n        std::ostream::char_type,\n        std::ostream::traits_type\n    >;\n    friend class boost::archive::save_access;\n#endif\n    // add base class to the places considered when matching\n    // save function to a specific set of arguments.  Note, this didn't\n    // work on my MSVC 7.0 system using\n    // binary_oarchive_impl<derived_t>::load_override;\n    // so we use the sure-fire method below.  This failed to work as well\n    template<class T>\n    void save_override(T & t){\n        base_t::save_override(t);\n        // verify that this program is in fact working by making sure\n        // that arrays are getting passed here\n        BOOST_STATIC_ASSERT(! (boost::is_array<T>::value) );\n    }\n    template<int N>\n    void save_override(const int (& t)[N]){\n        save_binary(t, sizeof(t));\n    }\n    template<int N>\n    void save_override(const unsigned int (& t)[N]){\n        save_binary(t, sizeof(t));\n    }\n    template<int N>\n    void save_override(const long (& t)[N]){\n        save_binary(t, sizeof(t));\n    }\n    template<int N>\n    void save_override(const unsigned long (& t)[N]){\n        save_binary(t, sizeof(t));\n    }\npublic:\n    fast_binary_oarchive(std::ostream & os, unsigned flags = 0) :\n       base_t(os, flags)\n    {}\n    fast_binary_oarchive(std::streambuf & bsb, unsigned int flags = 0) :\n        base_t(bsb, flags)\n    {}\n};\n\n// required by export\nBOOST_SERIALIZATION_REGISTER_ARCHIVE(fast_binary_oarchive)\n\n/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// \"Fast\" input binary archive.  This is a variation of the native binary\nclass fast_binary_iarchive :\n    // don't derive from binary_oarchive !!!\n    public binary_iarchive_impl<\n        fast_binary_iarchive,\n        std::istream::char_type,\n        std::istream::traits_type\n    >\n{\n    typedef fast_binary_iarchive derived_t;\n    typedef binary_iarchive_impl<\n        fast_binary_iarchive,\n        std::istream::char_type,\n        std::istream::traits_type\n    > base_t;\n#ifndef BOOST_NO_MEMBER_TEMPLATE_FRIENDS\npublic:\n#else\n    friend class boost::archive::detail::interface_iarchive<derived_t>;\n    friend class basic_binary_iarchive<derived_t>;\n    friend class basic_binary_iprimitive<\n        derived_t,\n        std::ostream::char_type,\n        std::ostream::traits_type\n    >;\n    friend class boost::archive::load_access;\n#endif\n    // add base class to the places considered when matching\n    // save function to a specific set of arguments.  Note, this didn't\n    // work on my MSVC 7.0 system using\n    // binary_oarchive_impl<derived_t>::load_override;\n    // so we use the sure-fire method below.  This failed to work as well\n    template<class T>\n    void load_override(T & t){\n        base_t::load_override(t);\n        BOOST_STATIC_ASSERT(! (boost::is_array<T>::value) );\n    }\n    template<int N>\n    void load_override(int (& t)[N]){\n        load_binary(t, sizeof(t));\n    }\n    template<int N>\n    void load_override(unsigned int (& t)[N]){\n        load_binary(t, sizeof(t));\n    }\n    template<int N>\n    void load_override(long (& t)[N]){\n        load_binary(t, sizeof(t));\n    }\n    template<int N>\n    void load_override(unsigned long (& t)[N]){\n        load_binary(t, sizeof(t));\n    }\npublic:\n    fast_binary_iarchive(std::istream & is, unsigned int flags = 0) :\n        base_t(is, flags)\n    {}\n    fast_binary_iarchive(std::streambuf & bsb, unsigned int flags = 0) :\n        base_t(bsb, flags)\n    {}\n};\n\n// required by export\nBOOST_SERIALIZATION_REGISTER_ARCHIVE(fast_binary_iarchive)\n\nint main( int argc, char* argv[] )\n{\n    const int a[3] = {1, 2, 3};\n    int a1[3] = {4, 5, 6};\n\n    std::stringstream ss;\n    {\n        fast_binary_oarchive pboa(ss);\n        pboa << a;\n    }\n    {\n        fast_binary_iarchive pbia(ss);\n        pbia >> a1;\n    }\n    return (a[0] != a1[0]) || (a[1] != a1[1]) || (a[2] != a1[2]);\n}\n\n\n"
  },
  {
    "path": "example/demo_gps.hpp",
    "content": "#ifndef BOOST_SERIALIZATION_EXAMPLE_DEMO_GPS_HPP\n#define BOOST_SERIALIZATION_EXAMPLE_DEMO_GPS_HPP\n\n/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n//\n// demo_gps.hpp\n//\n// (C) Copyright 2002-4 Robert Ramey - http://www.rrsd.com .\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n#include <iomanip>\n#include <iostream>\n#include <fstream>\n\n#include <boost/serialization/string.hpp>\n#include <boost/serialization/nvp.hpp>\n#include <boost/serialization/utility.hpp>\n#include <boost/serialization/list.hpp>\n#include <boost/serialization/version.hpp>\n#include <boost/serialization/assume_abstract.hpp>\n\n// This illustration models the bus system of a small city.\n// This includes, multiple bus stops,  bus routes and schedules.\n// There are different kinds of stops.  Bus stops in general\n// will appear on multiple routes.  A schedule will include\n// multiple trips on the same route.\n\n/////////////////////////////////////////////////////////////\n// gps coordinate\n//\n// illustrates serialization for a simple type\n//\nclass gps_position\n{\n    friend class boost::serialization::access;\n    friend std::ostream & operator<<(std::ostream &os, const gps_position &gp);\n\n    int degrees;\n    int minutes;\n    float seconds;\n\n    template<class Archive>\n    void serialize(Archive & ar, const unsigned int /* file_version */){\n        ar  & BOOST_SERIALIZATION_NVP(degrees)\n            & BOOST_SERIALIZATION_NVP(minutes)\n            & BOOST_SERIALIZATION_NVP(seconds);\n    }\n\npublic:\n    // every serializable class needs a constructor\n    gps_position(){};\n    gps_position(int _d, int _m, float _s) :\n        degrees(_d), minutes(_m), seconds(_s)\n    {}\n};\n\nstd::ostream & operator<<(std::ostream &os, const gps_position &gp)\n{\n    return os << ' ' << gp.degrees << (unsigned char)186 << gp.minutes << '\\'' << gp.seconds << '\"';\n}\n\n/////////////////////////////////////////////////////////////\n// One bus stop\n//\n// illustrates serialization of serializable members\n//\n\nclass bus_stop\n{\n    friend class boost::serialization::access;\n    virtual std::string description() const = 0;\n    gps_position latitude;\n    gps_position longitude;\n\n    template<class Archive>\n    void serialize(Archive &ar, const unsigned int version)\n    {\n        ar & BOOST_SERIALIZATION_NVP(latitude);\n        ar & BOOST_SERIALIZATION_NVP(longitude);\n    }\n\nprotected:\n    bus_stop(const gps_position & _lat, const gps_position & _long) :\n        latitude(_lat), longitude(_long)\n    {}\npublic:\n    bus_stop(){}\n    friend std::ostream & operator<<(std::ostream &os, const bus_stop &gp);\n    virtual ~bus_stop(){}\n};\n\nBOOST_SERIALIZATION_ASSUME_ABSTRACT(bus_stop)\n\nstd::ostream & operator<<(std::ostream &os, const bus_stop &bs)\n{\n    return os << bs.latitude << bs.longitude << ' ' << bs.description();\n}\n\n/////////////////////////////////////////////////////////////\n// Several kinds of bus stops\n//\n// illustrates serialization of derived types\n//\nclass bus_stop_corner : public bus_stop\n{\n    friend class boost::serialization::access;\n    std::string street1;\n    std::string street2;\n    virtual std::string description() const\n    {\n        return street1 + \" and \" + street2;\n    }\n    template<class Archive>\n    void serialize(Archive &ar, const unsigned int version)\n    {\n        // save/load base class information\n        ar & BOOST_SERIALIZATION_BASE_OBJECT_NVP(bus_stop);\n        ar & BOOST_SERIALIZATION_NVP(street1);\n        ar & BOOST_SERIALIZATION_NVP(street2);\n    }\npublic:\n    bus_stop_corner(){}\n    bus_stop_corner(const gps_position & _lat, const gps_position & _long,\n        const std::string & _s1, const std::string & _s2\n    ) :\n        bus_stop(_lat, _long), street1(_s1), street2(_s2)\n    {\n    }\n};\n\nclass bus_stop_destination : public bus_stop\n{\n    friend class boost::serialization::access;\n    std::string name;\n    virtual std::string description() const\n    {\n        return name;\n    }\n    template<class Archive>\n    void serialize(Archive &ar, const unsigned int version)\n    {\n        ar  & BOOST_SERIALIZATION_BASE_OBJECT_NVP(bus_stop)\n            & BOOST_SERIALIZATION_NVP(name);\n    }\npublic:\n    bus_stop_destination(){}\n    bus_stop_destination(\n        const gps_position & _lat, const gps_position & _long, const std::string & _name\n    ) :\n        bus_stop(_lat, _long), name(_name)\n    {\n    }\n};\n\n/////////////////////////////////////////////////////////////\n// a bus route is a collection of bus stops\n//\n// illustrates serialization of STL collection templates.\n//\n// illustrates serialization of polymorphic pointer (bus stop *);\n//\n// illustrates storage and recovery of shared pointers is correct\n// and efficient.  That is objects pointed to by more than one\n// pointer are stored only once.  In such cases only one such\n// object is restored and pointers are restored to point to it\n//\nclass bus_route\n{\n    friend class boost::serialization::access;\n    friend std::ostream & operator<<(std::ostream &os, const bus_route &br);\n    typedef bus_stop * bus_stop_pointer;\n    std::list<bus_stop_pointer> stops;\n    template<class Archive>\n    void serialize(Archive &ar, const unsigned int version)\n    {\n        // in this program, these classes are never serialized directly but rather\n        // through a pointer to the base class bus_stop. So we need a way to be\n        // sure that the archive contains information about these derived classes.\n        //ar.template register_type<bus_stop_corner>();\n        ar.register_type(static_cast<bus_stop_corner *>(NULL));\n        //ar.template register_type<bus_stop_destination>();\n        ar.register_type(static_cast<bus_stop_destination *>(NULL));\n        // serialization of stl collections is already defined\n        // in the header\n        ar & BOOST_SERIALIZATION_NVP(stops);\n    }\npublic:\n    bus_route(){}\n    void append(bus_stop *_bs)\n    {\n        stops.insert(stops.end(), _bs);\n    }\n};\nstd::ostream & operator<<(std::ostream &os, const bus_route &br)\n{\n    std::list<bus_stop *>::const_iterator it;\n    // note: we're displaying the pointer to permit verification\n    // that duplicated pointers are properly restored.\n    for(it = br.stops.begin(); it != br.stops.end(); it++){\n        os << '\\n' << std::hex << \"0x\" << *it << std::dec << ' ' << **it;\n    }\n    return os;\n}\n\n/////////////////////////////////////////////////////////////\n// a bus schedule is a collection of routes each with a starting time\n//\n// Illustrates serialization of STL objects(pair) in a non-intrusive way.\n// See definition of operator<< <pair<F, S> >(ar, pair)\n//\n// illustrates nesting of serializable classes\n//\n// illustrates use of version number to automatically grandfather older\n// versions of the same class.\n\nclass bus_schedule\n{\n    friend class boost::serialization::access;\n    friend std::ostream & operator<<(std::ostream &os, const bus_schedule &bs);\n    template<class Archive>\n    void serialize(Archive &ar, const unsigned int version)\n    {\n        ar & BOOST_SERIALIZATION_NVP(schedule);\n    }\n    // note: this structure was made public. because the friend declarations\n    // didn't seem to work as expected.\npublic:\n    struct trip_info\n    {\n        template<class Archive>\n        void serialize(Archive &ar, const unsigned int file_version)\n        {\n            // in versions 2 or later\n            if(file_version >= 2)\n                // read the drivers name\n                ar & BOOST_SERIALIZATION_NVP(driver);\n            // all versions have the following info\n            ar  & BOOST_SERIALIZATION_NVP(hour)\n                & BOOST_SERIALIZATION_NVP(minute);\n        }\n\n        // starting time\n        int hour;\n        int minute;\n        // only after system shipped was the driver's name added to the class\n        std::string driver;\n\n        trip_info(){}\n        trip_info(int _h, int _m, const std::string &_d) :\n            hour(_h), minute(_m), driver(_d)\n        {}\n        ~trip_info(){\n        }\n    };\n//  friend std::ostream & operator<<(std::ostream &os, const trip_info &ti);\nprivate:\n    std::list<std::pair<trip_info, bus_route *> > schedule;\npublic:\n    void append(const std::string &_d, int _h, int _m, bus_route *_br)\n    {\n        schedule.insert(schedule.end(), std::make_pair(trip_info(_h, _m, _d), _br));\n    }\n    bus_schedule(){}\n};\n\nBOOST_CLASS_VERSION(bus_schedule::trip_info, 3)\nBOOST_CLASS_VERSION(bus_schedule, 2)\n\nstd::ostream & operator<<(std::ostream &os, const bus_schedule::trip_info &ti)\n{\n    return os << '\\n' << ti.hour << ':' << ti.minute << ' ' << ti.driver << ' ';\n}\nstd::ostream & operator<<(std::ostream &os, const bus_schedule &bs)\n{\n    std::list<std::pair<bus_schedule::trip_info, bus_route *> >::const_iterator it;\n    for(it = bs.schedule.begin(); it != bs.schedule.end(); it++){\n        os << it->first << *(it->second);\n    }\n    return os;\n}\n\n#endif // BOOST_SERIALIZATION_EXAMPLE_DEMO_GPS_HPP\n"
  },
  {
    "path": "example/demo_log.cpp",
    "content": "/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n//\n// demo_log.cpp\n//\n// (C) Copyright 2009 Robert Ramey - http://www.rrsd.com .\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n#include <iostream>\n#include <cstdio>\n\n#include \"demo_gps.hpp\"\n#include \"log_archive.hpp\"\n\nint main(int argc, char *argv[]){\n    // make the schedule\n    bus_schedule schedule;\n\n    // fill in the data\n    // make a few stops\n    bus_stop *bs0 = new bus_stop_corner(\n        gps_position(34, 135, 52.560f),\n        gps_position(134, 22, 78.30f),\n        \"24th Street\", \"10th Avenue\"\n    );\n    bus_stop *bs1 = new bus_stop_corner(\n        gps_position(35, 137, 23.456f),\n        gps_position(133, 35, 54.12f),\n        \"State street\", \"Cathedral Vista Lane\"\n    );\n    bus_stop *bs2 = new bus_stop_destination(\n        gps_position(35, 136, 15.456f),\n        gps_position(133, 32, 15.300f),\n        \"White House\"\n    );\n    bus_stop *bs3 = new bus_stop_destination(\n        gps_position(35, 134, 48.789f),\n        gps_position(133, 32, 16.230f),\n        \"Lincoln Memorial\"\n    );\n\n    // make a route\n    bus_route route0;\n    route0.append(bs0);\n    route0.append(bs1);\n    route0.append(bs2);\n\n    // add trips to schedule\n    schedule.append(\"bob\", 6, 24, &route0);\n    schedule.append(\"bob\", 9, 57, &route0);\n    schedule.append(\"alice\", 11, 02, &route0);\n\n    // make another route\n    bus_route route1;\n    route1.append(bs3);\n    route1.append(bs2);\n    route1.append(bs1);\n\n    // add trips to schedule\n    schedule.append(\"ted\", 7, 17, &route1);\n    schedule.append(\"ted\", 9, 38, &route1);\n    schedule.append(\"alice\", 11, 47, &route1);\n\n    // display the complete schedule\n    log_archive oa(std::cout);\n    oa << BOOST_SERIALIZATION_NVP(schedule);\n    oa << schedule;\n\n    delete bs0;\n    delete bs1;\n    delete bs2;\n    delete bs3;\n    return 0;\n}\n\n"
  },
  {
    "path": "example/demo_output.txt",
    "content": "original schedule\n6:24 bob \n0x003265C8  34135'52.56\" 13422'78.3\" 24th Street and 10th Avenue\n0x00326648  35137'23.456\" 13335'54.12\" State street and Cathedral Vista Lane\n0x00326768  35136'15.456\" 13332'15.3\" White House\n9:57 bob \n0x003265C8  34135'52.56\" 13422'78.3\" 24th Street and 10th Avenue\n0x00326648  35137'23.456\" 13335'54.12\" State street and Cathedral Vista Lane\n0x00326768  35136'15.456\" 13332'15.3\" White House\n11:2 alice \n0x003265C8  34135'52.56\" 13422'78.3\" 24th Street and 10th Avenue\n0x00326648  35137'23.456\" 13335'54.12\" State street and Cathedral Vista Lane\n0x00326768  35136'15.456\" 13332'15.3\" White House\n7:17 ted \n0x003267D0  35134'48.789\" 13332'16.23\" Lincoln Memorial\n0x00326768  35136'15.456\" 13332'15.3\" White House\n0x00326648  35137'23.456\" 13335'54.12\" State street and Cathedral Vista Lane\n9:38 ted \n0x003267D0  35134'48.789\" 13332'16.23\" Lincoln Memorial\n0x00326768  35136'15.456\" 13332'15.3\" White House\n0x00326648  35137'23.456\" 13335'54.12\" State street and Cathedral Vista Lane\n11:47 alice \n0x003267D0  35134'48.789\" 13332'16.23\" Lincoln Memorial\n0x00326768  35136'15.456\" 13332'15.3\" White House\n0x00326648  35137'23.456\" 13335'54.12\" State street and Cathedral Vista Lane\nrestored schedule\n6:24  \n0x0032A2F8  34135'52.56\" 13422'78.3\" 24th Street and 10th Avenue\n0x0032A508  35137'23.456\" 13335'54.12\" State street and Cathedral Vista Lane\n0x0032A628  35136'15.456\" 13332'15.3\" White House\n9:57  \n0x0032A2F8  34135'52.56\" 13422'78.3\" 24th Street and 10th Avenue\n0x0032A508  35137'23.456\" 13335'54.12\" State street and Cathedral Vista Lane\n0x0032A628  35136'15.456\" 13332'15.3\" White House\n11:2  \n0x0032A2F8  34135'52.56\" 13422'78.3\" 24th Street and 10th Avenue\n0x0032A508  35137'23.456\" 13335'54.12\" State street and Cathedral Vista Lane\n0x0032A628  35136'15.456\" 13332'15.3\" White House\n7:17  \n0x0032A8C0  35134'48.789\" 13332'16.23\" Lincoln Memorial\n0x0032A628  35136'15.456\" 13332'15.3\" White House\n0x0032A508  35137'23.456\" 13335'54.12\" State street and Cathedral Vista Lane\n9:38  \n0x0032A8C0  35134'48.789\" 13332'16.23\" Lincoln Memorial\n0x0032A628  35136'15.456\" 13332'15.3\" White House\n0x0032A508  35137'23.456\" 13335'54.12\" State street and Cathedral Vista Lane\n11:47  \n0x0032A8C0  35134'48.789\" 13332'16.23\" Lincoln Memorial\n0x0032A628  35136'15.456\" 13332'15.3\" White House\n0x0032A508  35137'23.456\" 13335'54.12\" State street and Cathedral Vista Lane\n*** No errors detected\n"
  },
  {
    "path": "example/demo_pimpl.cpp",
    "content": "/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// demo_pimpl.cpp\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n// should pass compilation and execution\n\n#include <sstream>\n\n#include <boost/archive/text_iarchive.hpp>\n#include <boost/archive/text_oarchive.hpp>\n\n#include \"demo_pimpl_A.hpp\"\n\nint main(int argc, char* argv[])\n{\n    std::stringstream ss;\n\n    const A a;\n    {\n        boost::archive::text_oarchive oa(ss);\n        oa << a;\n    }\n    A a1;\n    {\n        boost::archive::text_iarchive ia(ss);\n        ia >> a1;\n    }\n    return 0;\n}\n\n"
  },
  {
    "path": "example/demo_pimpl_A.cpp",
    "content": "/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// demo_pimpl_A.cpp\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n#include <boost/archive/text_iarchive.hpp>\n#include <boost/archive/text_oarchive.hpp>\n\n#include \"demo_pimpl_A.hpp\"\n\n// \"hidden\" definition of class B\nstruct B {\n    int b;\n    template<class Archive>\n    void serialize(Archive & ar, const unsigned int /* file_version */){\n        ar & b;\n    }\n};\n\nA::A() :\n    pimpl(new B)\n{}\nA::~A(){\n    delete pimpl;\n}\n// now we can define the serialization for class A\ntemplate<class Archive>\nvoid A::serialize(Archive & ar, const unsigned int /* file_version */){\n    ar & pimpl;\n}\n\n// without the explicit instantiation below, the program will\n// fail to link for lack of instantiation of the above function\n// note: the following failed to fix link errors for vc 7.0 !\ntemplate void A::serialize<boost::archive::text_iarchive>(\n    boost::archive::text_iarchive & ar,\n    const unsigned int file_version\n);\ntemplate void A::serialize<boost::archive::text_oarchive>(\n    boost::archive::text_oarchive & ar,\n    const unsigned int file_version\n);\n"
  },
  {
    "path": "example/demo_pimpl_A.hpp",
    "content": "#ifndef BOOST_SERIALIZATION_EXAMPLE_DEMO_PIMPL_A_HPP\n#define BOOST_SERIALIZATION_EXAMPLE_DEMO_PIMPL_A_HPP\n\n/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// demo_pimpl_A.hpp\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n// class whose declaration is hidden by a pointer\nstruct B;\n\nstruct A {\n    // class a contains a pointer to a \"hidden\" declaration\n    B *pimpl;\n    template<class Archive>\n    void serialize(Archive & ar, const unsigned int file_version);\n    A();\n    ~A();\n};\n\n#endif // BOOST_SERIALIZATION_EXAMPLE_DEMO_PIMPL_A_HPP\n"
  },
  {
    "path": "example/demo_polymorphic.cpp",
    "content": "/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// demo_polymorphic.cpp\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n// should pass compilation and execution\n\n#include <sstream>\n\n#include <boost/archive/polymorphic_text_iarchive.hpp>\n#include <boost/archive/polymorphic_text_oarchive.hpp>\n\n#include <boost/archive/polymorphic_binary_iarchive.hpp>\n#include <boost/archive/polymorphic_binary_oarchive.hpp>\n\n#include \"demo_polymorphic_A.hpp\"\n\nint main(int argc, char* argv[])\n{\n    const A a;\n    A a1;\n    {\n        // test with a text archive\n        std::stringstream ss;\n        {\n            // instantiate archive which inherits polymorphic interface\n            // and the normal text archive implementation\n            boost::archive::polymorphic_text_oarchive oa(ss);\n            boost::archive::polymorphic_oarchive & oa_interface = oa;\n            // we can just just the interface for saving\n            oa_interface << a;\n        }\n        {\n            // or we can use the implementation directly\n            boost::archive::polymorphic_text_iarchive ia(ss);\n            ia >> a1;\n        }\n    }\n    if(! (a == a1))\n        return 1;\n    {\n        //test with a binary archive\n        std::stringstream ss;\n        {\n            // instantiate archive which inherits polymorphic interface\n            // and the normal binary archive implementation\n            boost::archive::polymorphic_binary_oarchive oa(ss);\n            oa << a;\n        }\n        {\n            // see above\n            boost::archive::polymorphic_binary_iarchive ia(ss);\n            boost::archive::polymorphic_iarchive & ia_interface = ia;\n            // use just the polymorphic interface for loading.\n            ia_interface >> a1;\n        }\n    }\n    if(! (a == a1))\n        return 1;\n    return 0;\n}\n\n"
  },
  {
    "path": "example/demo_polymorphic_A.cpp",
    "content": "/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// demo_polymorphic_A.cpp\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n\n#include <boost/archive/polymorphic_iarchive.hpp>\n#include <boost/archive/polymorphic_oarchive.hpp>\n\n#include \"demo_polymorphic_A.hpp\"\n\n// explicitly instantiate templates for polymorphic archives\n// used by this demo.\ntemplate\nvoid A::serialize<boost::archive::polymorphic_iarchive>(\n    boost::archive::polymorphic_iarchive &,\n    const unsigned int\n);\ntemplate\nvoid A::serialize<boost::archive::polymorphic_oarchive>(\n    boost::archive::polymorphic_oarchive &,\n    const unsigned int\n);\n"
  },
  {
    "path": "example/demo_polymorphic_A.hpp",
    "content": "#ifndef BOOST_SERIALIZATION_EXAMPLE_DEMO_POLYMORPHIC_A_HPP\n#define BOOST_SERIALIZATION_EXAMPLE_DEMO_POLYMORPHIC_A_HPP\n\n/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// demo_polymorphic_A.hpp\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\nnamespace boost {\nnamespace archive {\n\nclass polymorphic_iarchive;\nclass polymorphic_oarchive;\n\n} // namespace archive\n} // namespace boost\n\nstruct A {\n    // class a contains a pointer to a \"hidden\" declaration\n    template<class Archive>\n    void serialize(\n        Archive & ar,\n        const unsigned int file_version\n    ){\n        ar & data;\n    }\n    int data;\n    bool operator==(const A & rhs) const {\n        return data == rhs.data;\n    }\n    A() :\n        data(0)\n    {}\n};\n\n#endif // BOOST_SERIALIZATION_EXAMPLE_DEMO_POLYMORPHIC_A_HPP\n"
  },
  {
    "path": "example/demo_portable_archive.cpp",
    "content": "/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n//\n// demo_portable_archive.cpp\n//\n// (C) Copyright 2002-4 Robert Ramey - http://www.rrsd.com .\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n// should pass compilation and execution\n\n// note:: this example can only be built with the static library\n// (at least with MSVC - due to conflicts related to import of library\n// code and instantiation of templates.\n#include <sstream>\n\n#include \"portable_binary_oarchive.hpp\"\n#include \"portable_binary_iarchive.hpp\"\n\n#include <cstdlib>\n#include <boost/config.hpp>\n#if defined(BOOST_NO_STDC_NAMESPACE)\nnamespace std{ using ::rand; }\n#endif\n\nclass A\n{\n    friend class boost::serialization::access;\n    char c;\n    A *pa;\n    int i;\n    int i2; // special tricky case to check sign extension\n    unsigned int ui;\n    long l;\n    unsigned long ul;\n    template<class Archive>\n    void serialize(Archive & ar, const unsigned int /* version */){\n        ar & c & i & i2 & ui & l & ul ;\n    }\npublic:\n    bool operator==(const A & rhs) const {\n        return\n            c == rhs.c\n            && i == rhs.i\n            && i2 == rhs.i2\n            && ui == rhs.ui\n            && l == rhs.l\n            && ul == rhs.ul\n        ;\n    }\n    A() :\n        c(0xFF & std::rand()),\n        pa(0),\n        i(std::rand()),\n        i2(0x80),\n        ui(std::rand()),\n        l(std::rand() * std::rand()),\n        ul(std::rand())\n    {}\n};\n\nint main( int /* argc */, char* /* argv */[] )\n{\n    const A a;\n    A a1;\n\n    std::stringstream ss;\n    {\n        portable_binary_oarchive pboa(ss);\n        pboa << a;\n    }\n    {\n        portable_binary_iarchive pbia(ss);\n        pbia >> a1;\n    }\n    if(! (a == a1))\n        return 1;\n\n    ss.clear();\n    {\n        portable_binary_oarchive pboa(ss, endian_big);\n        pboa << a;\n    }\n    {\n        portable_binary_iarchive pbia(ss, endian_big);\n        pbia >> a1;\n    }\n    if(! (a == a1))\n        return 1;\n\n    ss.clear();\n    {\n        portable_binary_oarchive pboa(ss, endian_big);\n        pboa << a;\n    }\n    {\n        portable_binary_iarchive pbia(ss, endian_big);\n        pbia >> a1;\n    }\n\n    return !(a == a1);\n}\n\n\n"
  },
  {
    "path": "example/demo_save.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\" ?>\n<!DOCTYPE boost_serialization>\n<boost_serialization signature=\"serialization::archive\" version=\"3\">\n<s class_id=\"0\" tracking_level=\"0\" version=\"2\">\n\t<schedule class_id=\"1\" tracking_level=\"0\">\n\t\t<count>6</count>\n\t\t<item class_id=\"2\" tracking_level=\"0\">\n\t\t\t<first class_id=\"3\" tracking_level=\"0\" version=\"3\">\n\t\t\t\t<driver>bob</driver>\n\t\t\t\t<hour>6</hour>\n\t\t\t\t<minute>24</minute>\n\t\t\t</first>\n\t\t\t<second class_id=\"4\" tracking_level=\"1\" object_id=\"_0\">\n\t\t\t\t<stops class_id=\"7\" tracking_level=\"0\">\n\t\t\t\t\t<count>3</count>\n\t\t\t\t\t<item class_id=\"5\" tracking_level=\"1\" object_id=\"_1\">\n\t\t\t\t\t\t<bus_stop class_id=\"8\" tracking_level=\"0\">\n\t\t\t\t\t\t\t<latitude class_id=\"9\" tracking_level=\"0\">\n\t\t\t\t\t\t\t\t<degrees>34</degrees>\n\t\t\t\t\t\t\t\t<minutes>135</minutes>\n\t\t\t\t\t\t\t\t<seconds>52.560001</seconds>\n\t\t\t\t\t\t\t</latitude>\n\t\t\t\t\t\t\t<longitude>\n\t\t\t\t\t\t\t\t<degrees>134</degrees>\n\t\t\t\t\t\t\t\t<minutes>22</minutes>\n\t\t\t\t\t\t\t\t<seconds>78.300003</seconds>\n\t\t\t\t\t\t\t</longitude>\n\t\t\t\t\t\t</bus_stop>\n\t\t\t\t\t\t<street1>24th Street</street1>\n\t\t\t\t\t\t<street2>10th Avenue</street2>\n\t\t\t\t\t</item>\n\t\t\t\t\t<item class_id_reference=\"5\" object_id=\"_2\">\n\t\t\t\t\t\t<bus_stop>\n\t\t\t\t\t\t\t<latitude>\n\t\t\t\t\t\t\t\t<degrees>35</degrees>\n\t\t\t\t\t\t\t\t<minutes>137</minutes>\n\t\t\t\t\t\t\t\t<seconds>23.455999</seconds>\n\t\t\t\t\t\t\t</latitude>\n\t\t\t\t\t\t\t<longitude>\n\t\t\t\t\t\t\t\t<degrees>133</degrees>\n\t\t\t\t\t\t\t\t<minutes>35</minutes>\n\t\t\t\t\t\t\t\t<seconds>54.119999</seconds>\n\t\t\t\t\t\t\t</longitude>\n\t\t\t\t\t\t</bus_stop>\n\t\t\t\t\t\t<street1>State street</street1>\n\t\t\t\t\t\t<street2>Cathedral Vista Lane</street2>\n\t\t\t\t\t</item>\n\t\t\t\t\t<item class_id=\"6\" tracking_level=\"1\" object_id=\"_3\">\n\t\t\t\t\t\t<bus_stop>\n\t\t\t\t\t\t\t<latitude>\n\t\t\t\t\t\t\t\t<degrees>35</degrees>\n\t\t\t\t\t\t\t\t<minutes>136</minutes>\n\t\t\t\t\t\t\t\t<seconds>15.456</seconds>\n\t\t\t\t\t\t\t</latitude>\n\t\t\t\t\t\t\t<longitude>\n\t\t\t\t\t\t\t\t<degrees>133</degrees>\n\t\t\t\t\t\t\t\t<minutes>32</minutes>\n\t\t\t\t\t\t\t\t<seconds>15.3</seconds>\n\t\t\t\t\t\t\t</longitude>\n\t\t\t\t\t\t</bus_stop>\n\t\t\t\t\t\t<name>White House</name>\n\t\t\t\t\t</item>\n\t\t\t\t</stops>\n\t\t\t</second>\n\t\t</item>\n\t\t<item>\n\t\t\t<first>\n\t\t\t\t<driver>bob</driver>\n\t\t\t\t<hour>9</hour>\n\t\t\t\t<minute>57</minute>\n\t\t\t</first>\n\t\t\t<second class_id_reference=\"4\" object_id_reference=\"_0\"></second>\n\t\t</item>\n\t\t<item>\n\t\t\t<first>\n\t\t\t\t<driver>alice</driver>\n\t\t\t\t<hour>11</hour>\n\t\t\t\t<minute>2</minute>\n\t\t\t</first>\n\t\t\t<second class_id_reference=\"4\" object_id_reference=\"_0\"></second>\n\t\t</item>\n\t\t<item>\n\t\t\t<first>\n\t\t\t\t<driver>ted</driver>\n\t\t\t\t<hour>7</hour>\n\t\t\t\t<minute>17</minute>\n\t\t\t</first>\n\t\t\t<second class_id_reference=\"4\" object_id=\"_4\">\n\t\t\t\t<stops>\n\t\t\t\t\t<count>3</count>\n\t\t\t\t\t<item class_id_reference=\"6\" object_id=\"_5\">\n\t\t\t\t\t\t<bus_stop>\n\t\t\t\t\t\t\t<latitude>\n\t\t\t\t\t\t\t\t<degrees>35</degrees>\n\t\t\t\t\t\t\t\t<minutes>134</minutes>\n\t\t\t\t\t\t\t\t<seconds>48.789001</seconds>\n\t\t\t\t\t\t\t</latitude>\n\t\t\t\t\t\t\t<longitude>\n\t\t\t\t\t\t\t\t<degrees>133</degrees>\n\t\t\t\t\t\t\t\t<minutes>32</minutes>\n\t\t\t\t\t\t\t\t<seconds>16.23</seconds>\n\t\t\t\t\t\t\t</longitude>\n\t\t\t\t\t\t</bus_stop>\n\t\t\t\t\t\t<name>Lincoln Memorial</name>\n\t\t\t\t\t</item>\n\t\t\t\t\t<item class_id_reference=\"6\" object_id_reference=\"_3\"></item>\n\t\t\t\t\t<item class_id_reference=\"5\" object_id_reference=\"_2\"></item>\n\t\t\t\t</stops>\n\t\t\t</second>\n\t\t</item>\n\t\t<item>\n\t\t\t<first>\n\t\t\t\t<driver>ted</driver>\n\t\t\t\t<hour>9</hour>\n\t\t\t\t<minute>38</minute>\n\t\t\t</first>\n\t\t\t<second class_id_reference=\"4\" object_id_reference=\"_4\"></second>\n\t\t</item>\n\t\t<item>\n\t\t\t<first>\n\t\t\t\t<driver>alice</driver>\n\t\t\t\t<hour>11</hour>\n\t\t\t\t<minute>47</minute>\n\t\t\t</first>\n\t\t\t<second class_id_reference=\"4\" object_id_reference=\"_4\"></second>\n\t\t</item>\n\t</schedule>\n</s>\n</boost_serialization>\n"
  },
  {
    "path": "example/demo_shared_ptr.cpp",
    "content": "// demo_shared_ptr.cpp : demonstrates adding serialization to a template\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com . Polymorphic\n// derived pointer example by David Tonge.\n\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n//\n//  See http://www.boost.org for updates, documentation, and revision history.\n\n#include <iomanip>\n#include <iostream>\n#include <cstddef> // NULL\n#include <fstream>\n#include <string>\n\n#include <cstdio> // remove\n#include <boost/config.hpp>\n#if defined(BOOST_NO_STDC_NAMESPACE)\nnamespace std{\n    using ::remove;\n}\n#endif\n\n#include <boost/archive/text_oarchive.hpp>\n#include <boost/archive/text_iarchive.hpp>\n#include <boost/archive/tmpdir.hpp>\n\n#include <boost/serialization/shared_ptr.hpp>\n\n///////////////////////////\n// test shared_ptr serialization\nclass A\n{\nprivate:\n    friend class boost::serialization::access;\n    int x;\n    template<class Archive>\n    void serialize(Archive & ar, const unsigned int /* file_version */){\n        ar & x;\n    }\npublic:\n    static int count;\n    A(){++count;}    // default constructor\n    virtual ~A(){--count;}   // default destructor\n};\n\nBOOST_SERIALIZATION_SHARED_PTR(A)\n\n/////////////////\n// ADDITION BY DT\nclass B : public A\n{\nprivate:\n    friend class boost::serialization::access;\n    int x;\n    template<class Archive>\n    void serialize(Archive & ar, const unsigned int /* file_version */){\n        ar & boost::serialization::base_object<A>(*this);\n    }\npublic:\n    static int count;\n    B() : A() {};\n    virtual ~B() {};\n};\n\nBOOST_SERIALIZATION_SHARED_PTR(B)\n\n/////////////////\n\nint A::count = 0;\n\nvoid display(boost::shared_ptr<A> &spa, boost::shared_ptr<A> &spa1)\n{\n    std::cout << \"a = 0x\" << std::hex << spa.get() << \" \";\n    if (spa.get()) std::cout << \"is a \" << typeid(*(spa.get())).name() << \"* \";\n    std::cout << \"use count = \" << std::dec << spa.use_count() << std::endl;\n    std::cout << \"a1 = 0x\" << std::hex << spa1.get() << \" \";\n    if (spa1.get()) std::cout << \"is a \" << typeid(*(spa1.get())).name() << \"* \";\n    std::cout << \"use count = \" << std::dec << spa1.use_count() << std::endl;\n    std::cout << \"unique element count = \" << A::count << std::endl;\n}\n\nint main(int /* argc */, char * /*argv*/[])\n{\n    std::string filename(boost::archive::tmpdir());\n    filename += \"/testfile\";\n\n    // create  a new shared pointer to ta new object of type A\n    boost::shared_ptr<A> spa(new A);\n    boost::shared_ptr<A> spa1;\n    spa1 = spa;\n    display(spa, spa1);\n    // serialize it\n    {\n        std::ofstream ofs(filename.c_str());\n        boost::archive::text_oarchive oa(ofs);\n        oa << spa;\n        oa << spa1;\n    }\n    // reset the shared pointer to NULL\n    // thereby destroying the object of type A\n    spa.reset();\n    spa1.reset();\n    display(spa, spa1);\n    // restore state to one equivalent to the original\n    // creating a new type A object\n    {\n        // open the archive\n        std::ifstream ifs(filename.c_str());\n        boost::archive::text_iarchive ia(ifs);\n\n        // restore the schedule from the archive\n        ia >> spa;\n        ia >> spa1;\n    }\n    display(spa, spa1);\n    spa.reset();\n    spa1.reset();\n\n    std::cout << std::endl;\n    std::cout << std::endl;\n    std::cout << \"New tests\" << std::endl;\n\n    /////////////////\n    // ADDITION BY DT\n    // create  a new shared pointer to ta new object of type A\n    spa = boost::shared_ptr<A>(new B);\n    spa1 = spa;\n    display(spa, spa1);\n    // serialize it\n    {\n        std::ofstream ofs(filename.c_str());\n        boost::archive::text_oarchive oa(ofs);\n        oa.register_type(static_cast<B *>(NULL));\n        oa << spa;\n        oa << spa1;\n    }\n    // reset the shared pointer to NULL\n    // thereby destroying the object of type B\n    spa.reset();\n    spa1.reset();\n    display(spa, spa1);\n    // restore state to one equivalent to the original\n    // creating a new type B object\n    {\n        // open the archive\n        std::ifstream ifs(filename.c_str());\n        boost::archive::text_iarchive ia(ifs);\n\n        // restore the schedule from the archive\n        ia.register_type(static_cast<B *>(NULL));\n        ia >> spa;\n        ia >> spa1;\n    }\n    display(spa, spa1);\n    ///////////////\n    std::remove(filename.c_str());\n\n    // obj of type A gets destroyed\n    // as smart_ptr goes out of scope\n    return 0;\n}\n"
  },
  {
    "path": "example/demo_simple_log.cpp",
    "content": "/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n//\n// demo_log.cpp\n//\n// (C) Copyright 2009 Robert Ramey - http://www.rrsd.com .\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n#include <iostream>\n#include <cstdio>\n\n#include \"demo_gps.hpp\"\n#include \"simple_log_archive.hpp\"\n\nint main(int argc, char *argv[])\n{\n    // make the schedule\n    bus_schedule schedule;\n\n    // fill in the data\n    // make a few stops\n    bus_stop *bs0 = new bus_stop_corner(\n        gps_position(34, 135, 52.560f),\n        gps_position(134, 22, 78.30f),\n        \"24th Street\", \"10th Avenue\"\n    );\n    bus_stop *bs1 = new bus_stop_corner(\n        gps_position(35, 137, 23.456f),\n        gps_position(133, 35, 54.12f),\n        \"State street\", \"Cathedral Vista Lane\"\n    );\n    bus_stop *bs2 = new bus_stop_destination(\n        gps_position(35, 136, 15.456f),\n        gps_position(133, 32, 15.300f),\n        \"White House\"\n    );\n    bus_stop *bs3 = new bus_stop_destination(\n        gps_position(35, 134, 48.789f),\n        gps_position(133, 32, 16.230f),\n        \"Lincoln Memorial\"\n    );\n\n    // make a route\n    bus_route route0;\n    route0.append(bs0);\n    route0.append(bs1);\n    route0.append(bs2);\n\n    // add trips to schedule\n    schedule.append(\"bob\", 6, 24, &route0);\n    schedule.append(\"bob\", 9, 57, &route0);\n    schedule.append(\"alice\", 11, 02, &route0);\n\n    // make another route\n    bus_route route1;\n    route1.append(bs3);\n    route1.append(bs2);\n    route1.append(bs1);\n\n    // add trips to schedule\n    schedule.append(\"ted\", 7, 17, &route1);\n    schedule.append(\"ted\", 9, 38, &route1);\n    schedule.append(\"alice\", 11, 47, &route1);\n\n    // display the complete schedule\n    simple_log_archive log(std::cout);\n    log << schedule;\n\n    delete bs0;\n    delete bs1;\n    delete bs2;\n    delete bs3;\n    return 0;\n}\n"
  },
  {
    "path": "example/demo_trivial_archive.cpp",
    "content": "/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n//\n// demo_trivial_archive.cpp\n//\n// (C) Copyright 2009 Robert Ramey - http://www.rrsd.com .\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n#include <cstddef> // std::size_t\n#include <boost/mpl/bool.hpp>\n\n/////////////////////////////////////////////////////////////////////////\n// class trivial_oarchive\nclass trivial_oarchive {\n\npublic:\n    //////////////////////////////////////////////////////////\n    // public interface used by programs that use the\n    // serialization library\n    typedef boost::mpl::bool_<true> is_saving;\n    typedef boost::mpl::bool_<false> is_loading;\n    template<class T> void register_type(){}\n    template<class T> trivial_oarchive & operator<<(const T & t){\n        return *this;\n    }\n    template<class T> trivial_oarchive & operator&(const T & t){\n        return *this << t;\n    }\n    void save_binary(void *address, std::size_t count){};\n};\n\n#include \"demo_gps.hpp\"\n\nint main(int argc, char *argv[])\n{\n    // make the schedule\n    bus_schedule schedule;\n\n    // fill in the data\n    // make a few stops\n    bus_stop *bs0 = new bus_stop_corner(\n        gps_position(34, 135, 52.560f),\n        gps_position(134, 22, 78.30f),\n        \"24th Street\", \"10th Avenue\"\n    );\n    bus_stop *bs1 = new bus_stop_corner(\n        gps_position(35, 137, 23.456f),\n        gps_position(133, 35, 54.12f),\n        \"State street\", \"Cathedral Vista Lane\"\n    );\n    bus_stop *bs2 = new bus_stop_destination(\n        gps_position(35, 136, 15.456f),\n        gps_position(133, 32, 15.300f),\n        \"White House\"\n    );\n    bus_stop *bs3 = new bus_stop_destination(\n        gps_position(35, 134, 48.789f),\n        gps_position(133, 32, 16.230f),\n        \"Lincoln Memorial\"\n    );\n\n    // make a route\n    bus_route route0;\n    route0.append(bs0);\n    route0.append(bs1);\n    route0.append(bs2);\n\n    // add trips to schedule\n    schedule.append(\"bob\", 6, 24, &route0);\n    schedule.append(\"bob\", 9, 57, &route0);\n    schedule.append(\"alice\", 11, 02, &route0);\n\n    // make another route\n    bus_route route1;\n    route1.append(bs3);\n    route1.append(bs2);\n    route1.append(bs1);\n\n    // add trips to schedule\n    schedule.append(\"ted\", 7, 17, &route1);\n    schedule.append(\"ted\", 9, 38, &route1);\n    schedule.append(\"alice\", 11, 47, &route1);\n\n    // display the complete schedule\n    trivial_oarchive ta;\n    ta << schedule;\n\n    delete bs0;\n    delete bs1;\n    delete bs2;\n    delete bs3;\n    return 0;\n}\n"
  },
  {
    "path": "example/demo_xml.cpp",
    "content": "/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n//\n// demo_xml.cpp\n//\n// (C) Copyright 2002-4 Robert Ramey - http://www.rrsd.com .\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n#include <iomanip>\n#include <iostream>\n#include <fstream>\n#include <string>\n\n#include <cstdio> // remove\n#include <boost/config.hpp>\n#if defined(BOOST_NO_STDC_NAMESPACE)\nnamespace std{\n    using ::remove;\n}\n#endif\n\n#include <boost/archive/tmpdir.hpp>\n#include <boost/archive/xml_iarchive.hpp>\n#include <boost/archive/xml_oarchive.hpp>\n\n#include \"demo_gps.hpp\"\n\nvoid save_schedule(const bus_schedule &s, const char * filename){\n    // make an archive\n    std::ofstream ofs(filename);\n    assert(ofs.good());\n    boost::archive::xml_oarchive oa(ofs);\n    oa << BOOST_SERIALIZATION_NVP(s);\n}\n\nvoid\nrestore_schedule(bus_schedule &s, const char * filename)\n{\n    // open the archive\n    std::ifstream ifs(filename);\n    assert(ifs.good());\n    boost::archive::xml_iarchive ia(ifs);\n\n    // restore the schedule from the archive\n    ia >> BOOST_SERIALIZATION_NVP(s);\n}\n\nint main(int argc, char *argv[])\n{\n    // make the schedule\n    bus_schedule original_schedule;\n\n    // fill in the data\n    // make a few stops\n    bus_stop *bs0 = new bus_stop_corner(\n        gps_position(34, 135, 52.560f),\n        gps_position(134, 22, 78.30f),\n        \"24th Street\", \"10th Avenue\"\n    );\n    bus_stop *bs1 = new bus_stop_corner(\n        gps_position(35, 137, 23.456f),\n        gps_position(133, 35, 54.12f),\n        \"State street\", \"Cathedral Vista Lane\"\n    );\n    bus_stop *bs2 = new bus_stop_destination(\n        gps_position(35, 136, 15.456f),\n        gps_position(133, 32, 15.300f),\n        \"White House\"\n    );\n    bus_stop *bs3 = new bus_stop_destination(\n        gps_position(35, 134, 48.789f),\n        gps_position(133, 32, 16.230f),\n        \"Lincoln Memorial\"\n    );\n\n    // make a route\n    bus_route route0;\n    route0.append(bs0);\n    route0.append(bs1);\n    route0.append(bs2);\n\n    // add trips to schedule\n    original_schedule.append(\"bob\", 6, 24, &route0);\n    original_schedule.append(\"bob\", 9, 57, &route0);\n    original_schedule.append(\"alice\", 11, 02, &route0);\n\n    // make another route\n    bus_route route1;\n    route1.append(bs3);\n    route1.append(bs2);\n    route1.append(bs1);\n\n    // add trips to schedule\n    original_schedule.append(\"ted\", 7, 17, &route1);\n    original_schedule.append(\"ted\", 9, 38, &route1);\n    original_schedule.append(\"alice\", 11, 47, &route1);\n\n    // display the complete schedule\n    std::cout << \"original schedule\";\n    std::cout << original_schedule;\n\n    std::string filename(boost::archive::tmpdir());\n    filename += \"/demo.xml\";\n\n    // save the schedule\n    save_schedule(original_schedule, filename.c_str());\n\n    // ... some time later\n    // make a new schedule\n    bus_schedule new_schedule;\n\n    restore_schedule(new_schedule, filename.c_str());\n\n    // and display\n    std::cout << \"\\nrestored schedule\";\n    std::cout << new_schedule;\n    // should be the same as the old one. (except for the pointer values)\n\n    std::remove(filename.c_str());\n\n    delete bs0;\n    delete bs1;\n    delete bs2;\n    delete bs3;\n    return 0;\n}\n"
  },
  {
    "path": "example/demo_xml.hpp",
    "content": "#ifndef BOOST_SERIALIZATION_EXAMPLE_DEMO_XML_HPP\n#define BOOST_SERIALIZATION_EXAMPLE_DEMO_XML_HPP\n\n/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n//\n// demo_xml.hpp\n//\n// (C) Copyright 2002-4 Robert Ramey - http://www.rrsd.com .\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n\n#include <string>\n#include <iomanip>\n#include <iostream>\n#include <fstream>\n\n#include <boost/serialization/nvp.hpp>\n#include <boost/serialization/utility.hpp>\n#include <boost/serialization/list.hpp>\n#include <boost/serialization/version.hpp>\n\n// This illustration models the bus system of a small city.\n// This includes, multiple bus stops,  bus routes and schedules.\n// There are different kinds of stops.  Bus stops in general\n// will appear on multiple routes.  A schedule will include\n// multiple trips on the same route.\n\n/////////////////////////////////////////////////////////////\n// gps coordinate\n//\n// illustrates serialization for a simple type\n//\nclass gps_position\n{\n    friend class boost::serialization::access;\n    friend std::ostream & operator<<(std::ostream &os, const gps_position &gp);\n\n    int degrees;\n    int minutes;\n    float seconds;\n\n    template<class Archive>\n    void serialize(Archive & ar, const unsigned int /* file_version */){\n        ar  & BOOST_SERIALIZATION_NVP(degrees)\n            & BOOST_SERIALIZATION_NVP(minutes)\n            & BOOST_SERIALIZATION_NVP(seconds);\n    }\n\npublic:\n    // every serializable class needs a constructor\n    gps_position(){};\n    gps_position(int _d, int _m, float _s) :\n        degrees(_d), minutes(_m), seconds(_s)\n    {}\n};\n\nstd::ostream & operator<<(std::ostream &os, const gps_position &gp)\n{\n    return os << ' ' << gp.degrees << (unsigned char)186 << gp.minutes << '\\'' << gp.seconds << '\"';\n}\n\n/////////////////////////////////////////////////////////////\n// One bus stop\n//\n// illustrates serialization of serializable members\n//\n\nclass bus_stop\n{\n    friend class boost::serialization::access;\n    virtual std::string description() const = 0;\n    gps_position latitude;\n    gps_position longitude;\n\n    template<class Archive>\n    void serialize(Archive &ar, const unsigned int version)\n    {\n        ar & BOOST_SERIALIZATION_NVP(latitude);\n        ar & BOOST_SERIALIZATION_NVP(longitude);\n    }\n\nprotected:\n    bus_stop(const gps_position & _lat, const gps_position & _long) :\n        latitude(_lat), longitude(_long)\n    {}\npublic:\n    bus_stop(){}\n    friend std::ostream & operator<<(std::ostream &os, const bus_stop &gp);\n    virtual ~bus_stop(){}\n};\n\nBOOST_IS_ABSTRACT(bus_stop)\n\nstd::ostream & operator<<(std::ostream &os, const bus_stop &bs)\n{\n    return os << bs.latitude << bs.longitude << ' ' << bs.description();\n}\n\n/////////////////////////////////////////////////////////////\n// Several kinds of bus stops\n//\n// illustrates serialization of derived types\n//\nclass bus_stop_corner : public bus_stop\n{\n    friend class boost::serialization::access;\n    std::string street1;\n    std::string street2;\n    virtual std::string description() const\n    {\n        return street1 + \" and \" + street2;\n    }\n    template<class Archive>\n    void serialize(Archive &ar, const unsigned int version)\n    {\n        // save/load base class information\n        ar & BOOST_SERIALIZATION_BASE_OBJECT_NVP(bus_stop);\n        ar & BOOST_SERIALIZATION_NVP(street1);\n        ar & BOOST_SERIALIZATION_NVP(street2);\n    }\npublic:\n    bus_stop_corner(){}\n    bus_stop_corner(const gps_position & _lat, const gps_position & _long,\n        const std::string & _s1, const std::string & _s2\n    ) :\n        bus_stop(_lat, _long), street1(_s1), street2(_s2)\n    {\n    }\n};\n\nclass bus_stop_destination : public bus_stop\n{\n    friend class boost::serialization::access;\n    std::string name;\n    virtual std::string description() const\n    {\n        return name;\n    }\n    template<class Archive>\n    void serialize(Archive &ar, const unsigned int version)\n    {\n        ar  & BOOST_SERIALIZATION_BASE_OBJECT_NVP(bus_stop)\n            & BOOST_SERIALIZATION_NVP(name);\n    }\npublic:\n    bus_stop_destination(){}\n    bus_stop_destination(\n        const gps_position & _lat, const gps_position & _long, const std::string & _name\n    ) :\n        bus_stop(_lat, _long), name(_name)\n    {\n    }\n};\n\n/////////////////////////////////////////////////////////////\n// a bus route is a collection of bus stops\n//\n// illustrates serialization of STL collection templates.\n//\n// illustrates serialization of polymorphic pointer (bus stop *);\n//\n// illustrates storage and recovery of shared pointers is correct\n// and efficient.  That is objects pointed to by more than one\n// pointer are stored only once.  In such cases only one such\n// object is restored and pointers are restored to point to it\n//\nclass bus_route\n{\n    friend class boost::serialization::access;\n    friend std::ostream & operator<<(std::ostream &os, const bus_route &br);\n    typedef bus_stop * bus_stop_pointer;\n    std::list<bus_stop_pointer> stops;\n    template<class Archive>\n    void serialize(Archive &ar, const unsigned int version)\n    {\n        // in this program, these classes are never serialized directly but rather\n        // through a pointer to the base class bus_stop. So we need a way to be\n        // sure that the archive contains information about these derived classes.\n        //ar.template register_type<bus_stop_corner>();\n        ar.register_type(static_cast<bus_stop_corner *>(NULL));\n        //ar.template register_type<bus_stop_destination>();\n        ar.register_type(static_cast<bus_stop_destination *>(NULL));\n        // serialization of stl collections is already defined\n        // in the header\n        ar & BOOST_SERIALIZATION_NVP(stops);\n    }\npublic:\n    bus_route(){}\n    void append(bus_stop *_bs)\n    {\n        stops.insert(stops.end(), _bs);\n    }\n};\nstd::ostream & operator<<(std::ostream &os, const bus_route &br)\n{\n    std::list<bus_stop *>::const_iterator it;\n    // note: we're displaying the pointer to permit verification\n    // that duplicated pointers are properly restored.\n    for(it = br.stops.begin(); it != br.stops.end(); it++){\n        os << '\\n' << std::hex << \"0x\" << *it << std::dec << ' ' << **it;\n    }\n    return os;\n}\n\n/////////////////////////////////////////////////////////////\n// a bus schedule is a collection of routes each with a starting time\n//\n// Illustrates serialization of STL objects(pair) in a non-intrusive way.\n// See definition of operator<< <pair<F, S> >(ar, pair)\n//\n// illustrates nesting of serializable classes\n//\n// illustrates use of version number to automatically grandfather older\n// versions of the same class.\n\nclass bus_schedule\n{\n    friend class boost::serialization::access;\n    friend std::ostream & operator<<(std::ostream &os, const bus_schedule &bs);\n    template<class Archive>\n    void serialize(Archive &ar, const unsigned int version)\n    {\n        ar & BOOST_SERIALIZATION_NVP(schedule);\n    }\n    // note: this structure was made public. because the friend declarations\n    // didn't seem to work as expected.\npublic:\n    struct trip_info\n    {\n        template<class Archive>\n        void serialize(Archive &ar, const unsigned int file_version)\n        {\n            // in versions 2 or later\n            if(file_version >= 2)\n                // read the drivers name\n                ar & BOOST_SERIALIZATION_NVP(driver);\n            // all versions have the following info\n            ar  & BOOST_SERIALIZATION_NVP(hour)\n                & BOOST_SERIALIZATION_NVP(minute);\n        }\n\n        // starting time\n        int hour;\n        int minute;\n        // only after system shipped was the driver's name added to the class\n        std::string driver;\n\n        trip_info(){}\n        trip_info(int _h, int _m, const std::string &_d) :\n            hour(_h), minute(_m), driver(_d)\n        {}\n        ~trip_info(){\n        }\n    };\n//  friend std::ostream & operator<<(std::ostream &os, const trip_info &ti);\nprivate:\n    std::list<std::pair<trip_info, bus_route *> > schedule;\npublic:\n    void append(const std::string &_d, int _h, int _m, bus_route *_br)\n    {\n        schedule.insert(schedule.end(), std::make_pair(trip_info(_h, _m, _d), _br));\n    }\n    bus_schedule(){}\n};\n\nBOOST_CLASS_VERSION(bus_schedule::trip_info, 3)\nBOOST_CLASS_VERSION(bus_schedule, 2)\n\nstd::ostream & operator<<(std::ostream &os, const bus_schedule::trip_info &ti)\n{\n    return os << '\\n' << ti.hour << ':' << ti.minute << ' ' << ti.driver << ' ';\n}\nstd::ostream & operator<<(std::ostream &os, const bus_schedule &bs)\n{\n    std::list<std::pair<bus_schedule::trip_info, bus_route *> >::const_iterator it;\n    for(it = bs.schedule.begin(); it != bs.schedule.end(); it++){\n        os << it->first << *(it->second);\n    }\n    return os;\n}\n\n#endif // BOOST_SERIALIZATION_EXAMPLE_DEMO_XML_HPP\n"
  },
  {
    "path": "example/demo_xml_load.cpp",
    "content": "/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n//\n// demo_xml_load.cpp\n//\n// (C) Copyright 2002-4 Robert Ramey - http://www.rrsd.com .\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n#include <iostream>\n#include <string>\n#include <boost/archive/tmpdir.hpp>\n\n#include <boost/archive/xml_iarchive.hpp>\n\n#include \"demo_gps.hpp\"\n\nvoid\nrestore_schedule(bus_schedule &s, const char * filename)\n{\n    // open the archive\n    std::ifstream ifs(filename);\n    assert(ifs.good());\n    boost::archive::xml_iarchive ia(ifs);\n\n    // restore the schedule from the archive\n    ia >> BOOST_SERIALIZATION_NVP(s);\n}\n\nint main(int argc, char *argv[])\n{\n    // make  a new schedule\n    bus_schedule new_schedule;\n\n    std::string filename(boost::archive::tmpdir());\n    filename += \"/demo_save.xml\";\n\n    restore_schedule(new_schedule, filename.c_str());\n\n    // and display\n    std::cout << \"\\nrestored schedule\";\n    std::cout << new_schedule;\n\n    return 0;\n}\n"
  },
  {
    "path": "example/demo_xml_save.cpp",
    "content": "/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n//\n// demo_xml_save.cpp\n//\n// (C) Copyright 2002-4 Robert Ramey - http://www.rrsd.com .\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n#include <iostream>\n#include <string>\n#include <boost/archive/tmpdir.hpp>\n\n#include <boost/archive/xml_oarchive.hpp>\n\n#include \"demo_gps.hpp\"\n\nvoid save_schedule(const bus_schedule &s, const char * filename){\n    // make an archive\n    std::ofstream ofs(filename);\n    assert(ofs.good());\n    boost::archive::xml_oarchive oa(ofs);\n    oa << BOOST_SERIALIZATION_NVP(s);\n}\n\nint main(int argc, char *argv[])\n{\n    // make the schedule\n    bus_schedule original_schedule;\n\n    // fill in the data\n    // make a few stops\n    bus_stop *bs0 = new bus_stop_corner(\n        gps_position(34, 135, 52.560f),\n        gps_position(134, 22, 78.30f),\n        \"24th Street\", \"10th Avenue\"\n    );\n    bus_stop *bs1 = new bus_stop_corner(\n        gps_position(35, 137, 23.456f),\n        gps_position(133, 35, 54.12f),\n        \"State street\", \"Cathedral Vista Lane\"\n    );\n    bus_stop *bs2 = new bus_stop_destination(\n        gps_position(35, 136, 15.456f),\n        gps_position(133, 32, 15.300f),\n        \"White House\"\n    );\n    bus_stop *bs3 = new bus_stop_destination(\n        gps_position(35, 134, 48.789f),\n        gps_position(133, 32, 16.230f),\n        \"Lincoln Memorial\"\n    );\n\n    // make a route\n    bus_route route0;\n    route0.append(bs0);\n    route0.append(bs1);\n    route0.append(bs2);\n\n    // add trips to schedule\n    original_schedule.append(\"bob\", 6, 24, &route0);\n    original_schedule.append(\"bob\", 9, 57, &route0);\n    original_schedule.append(\"alice\", 11, 02, &route0);\n\n    // make an other route\n    bus_route route1;\n    route1.append(bs3);\n    route1.append(bs2);\n    route1.append(bs1);\n\n    // add trips to schedule\n    original_schedule.append(\"ted\", 7, 17, &route1);\n    original_schedule.append(\"ted\", 9, 38, &route1);\n    original_schedule.append(\"alice\", 11, 47, &route1);\n\n    // display the complete schedule\n    std::cout << \"original schedule\";\n    std::cout << original_schedule;\n\n    std::string filename(boost::archive::tmpdir());\n    filename += \"/demo_save.xml\";\n\n    // save the schedule\n    save_schedule(original_schedule, filename.c_str());\n\n    delete bs0;\n    delete bs1;\n    delete bs2;\n    delete bs3;\n    return 0;\n}\n"
  },
  {
    "path": "example/demofile.txt",
    "content": "22 serialization::archive 3 0 2 0 0 6 0 0 0 0 6 24 4 1 0\n0 0 0 3 5 1 0\n1 0 0 0 0 34 135 52.560001 134 22 78.300003 11 24th Street 11 10th Avenue 5\n2 35 137 23.455999 133 35 54.119999 12 State street 20 Cathedral Vista Lane 6 1 0\n3 35 136 15.456 133 32 15.3 11 White House 9 57 4\n0 11 2 4\n0 7 17 4\n4 3 6\n5 35 134 48.789001 133 32 16.23 16 Lincoln Memorial 6\n3 5\n2 9 38 4\n4 11 47 4\n4"
  },
  {
    "path": "example/fix_six.cpp",
    "content": "#include <fstream>\n#include <ios>\n#include <iostream>\n#include <boost/integer_traits.hpp>\n#include <boost/archive/binary_iarchive.hpp>\n\nvoid usage(const char * program_name){\n    std::cout << \"usage:\";\n    std::cout << program_name << \" filename\" << std::endl;\n}\n\nint main(int argc, char *argv[]){\n    if(argc != 2){\n        std::cout << \"invalid number of arguments\" << std::endl;\n        usage(argv[0]);\n        return 1;\n    }\n    std::filebuf fb;\n    fb.open(\n        argv[1],\n        std::ios_base::binary | std::ios_base::in | std::ios_base::out\n    );\n    if(!fb.is_open()){\n        std::cout << argv[1] <<  \" failed to open\" << std::endl;\n        return 1;\n    }\n    boost::archive::binary_iarchive ia(fb);\n    boost::archive::library_version_type lvt = ia.get_library_version();\n    if(boost::archive::library_version_type(6) != lvt){\n        std::cout << \"library version not equal to six\" << std::endl;\n        return 1;\n    }\n    lvt = boost::archive::library_version_type(7);\n    fb.pubseekpos(26, std::ios_base::out);\n    fb.sputn(reinterpret_cast<const char *>(& lvt), sizeof(lvt));\n    fb.close();\n}\n"
  },
  {
    "path": "example/log_archive.cpp",
    "content": "/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// log_archive.cpp:\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for updates, documentation, and revision history.\n\n#if (defined _MSC_VER) && (_MSC_VER == 1200)\n#  pragma warning (disable : 4786) // too long name, harmless warning\n#endif\n\n//#define BOOST_ARCHIVE_SOURCE\n#include \"log_archive.hpp\"\n#include <boost/archive/detail/archive_serializer_map.hpp>\n\n// explicitly instantiate for this type of xml stream\n#include <boost/archive/impl/archive_serializer_map.ipp>\n#include <boost/archive/impl/basic_xml_oarchive.ipp>\n#include <boost/archive/impl/xml_oarchive_impl.ipp>\n\nnamespace boost {\nnamespace archive {\n\ntemplate class detail::archive_serializer_map<log_archive>;\ntemplate class basic_xml_oarchive<log_archive> ;\ntemplate class xml_oarchive_impl<log_archive> ;\n\n} // namespace archive\n} // namespace boost\n"
  },
  {
    "path": "example/log_archive.hpp",
    "content": "#ifndef LOG_ARCHIVE_HPP\n#define LOG_ARCHIVE_HPP\n\n// MS compatible compilers support #pragma once\n#if defined(_MSC_VER)\n# pragma once\n#endif\n\n/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// log_archive.hpp\n\n// (C) Copyright 2010 Robert Ramey - http://www.rrsd.com .\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for updates, documentation, and revision history.\n\n#include <boost/archive/xml_oarchive.hpp>\n\nnamespace boost {\n    namespace archive {\n        namespace detail {\n            template<class Archive> class interface_oarchive;\n        } // namespace detail\n    } // namespace archive\n} // boost\n\n/////////////////////////////////////////////////////////////////////////\n// log data to an output stream.  This illustrates a simpler implementation\n// of text output which is useful for getting a formatted display of\n// any serializable class.  Intended to be useful as a debugging aid.\nclass log_archive :\n    /* protected ? */\n    public boost::archive::xml_oarchive_impl<log_archive>\n{\n    typedef boost::archive::xml_oarchive_impl<log_archive> base;\n    // give serialization implementation access to this class\n    friend class boost::archive::detail::interface_oarchive<log_archive>;\n    friend class boost::archive::basic_xml_oarchive<log_archive>;\n    friend class boost::archive::save_access;\n\n    /////////////////////////////////////////////////////////////////////\n    // Override functions defined in basic_xml_oarchive\n\n    // Anything not an attribute and not a name-value pair is an\n    // error and should be trapped here.\n    template<class T>\n    void save_override(T & t){\n        // make it a name-value pair and pass it on.\n        // this permits this to be used even with data types which\n        // are not wrapped with the name\n        base::save_override(boost::serialization::make_nvp(NULL, t));\n    }\n    template<class T>\n    void save_override(const boost::serialization::nvp< T > & t){\n        // this is here to remove the \"const\" requirement.  Since\n        // this class is to be used only for output, it's not required.\n        base::save_override(t);\n    }\n    // specific overrides for attributes - not name value pairs so we\n    // want to trap them before the above \"fall through\"\n    // since we don't want to see these in the output - make them no-ops.\n    void save_override(const boost::archive::object_id_type & t){}\n    void save_override(const boost::archive::object_reference_type & t){}\n    void save_override(const boost::archive::version_type & t){}\n    void save_override(const boost::archive::class_id_type & t){}\n    void save_override(const boost::archive::class_id_optional_type & t){}\n    void save_override(const boost::archive::class_id_reference_type & t){}\n    void save_override(const boost::archive::class_name_type & t){}\n    void save_override(const boost::archive::tracking_type & t){}\npublic:\n    log_archive(std::ostream & os, unsigned int flags = 0) :\n        boost::archive::xml_oarchive_impl<log_archive>(\n            os,\n            flags | boost::archive::no_header\n        )\n    {}\n};\n\n#endif // LOG_ARCHIVE_HPP\n"
  },
  {
    "path": "example/polymorphic_portable_binary_iarchive.cpp",
    "content": "/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// polymorphic_portable_binary_iarchive.cpp\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for updates, documentation, and revision history.\n\n#include <istream>\n\n#define BOOST_ARCHIVE_SOURCE\n#include \"polymorphic_portable_binary_iarchive.hpp\"\n\n// explicitly instantiate for this type of text stream\n#include <boost/archive/impl/basic_binary_iarchive.ipp>\n#include <boost/archive/impl/archive_pointer_iserializer.ipp>\n#include <boost/archive/impl/basic_binary_iprimitive.ipp>\n\nnamespace boost {\nnamespace archive {\n\ntemplate class binary_iarchive_impl<\n    polymorphic_portable_binary_iarchive,\n    std::istream::char_type,\n    std::istream::traits_type\n>;\ntemplate class detail::archive_pointer_iserializer<\n    polymorphic_portable_binary_iarchive\n> ;\n\n} // namespace archive\n} // namespace boost\n"
  },
  {
    "path": "example/polymorphic_portable_binary_iarchive.hpp",
    "content": "#ifndef BOOST_ARCHIVE_POLYMORPHIC_PORTABLE_BINARY_IARCHIVE_HPP\n#define BOOST_ARCHIVE_POLYMORPHIC_PORTABLE_BINARY_IARCHIVE_HPP\n\n// MS compatible compilers support #pragma once\n#if defined(_MSC_VER)\n# pragma once\n#endif\n\n/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// polymorphic_portable_binary_iarchive.hpp\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for updates, documentation, and revision history.\n\n#include <boost/archive/detail/polymorphic_iarchive_dispatch.hpp>\n#include \"portable_binary_iarchive.hpp\"\n\ntypedef boost::archive::detail::polymorphic_iarchive_dispatch<\n    portable_binary_iarchive\n> polymorphic_portable_binary_iarchive;\n\n#include <boost/version.hpp>\n#if BOOST_VERSION > 103401\n    // required by export\n    BOOST_SERIALIZATION_REGISTER_ARCHIVE(\n        polymorphic_portable_binary_iarchive\n    )\n#endif\n\n#endif // BOOST_ARCHIVE_POLYMORPHIC_PORTABLE_BINARY_OARCHIVE_HPP\n\n"
  },
  {
    "path": "example/polymorphic_portable_binary_oarchive.cpp",
    "content": "/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// polymorphic_portable_binary_oarchive.cpp\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for updates, documentation, and revision history.\n\n#include <ostream>\n\n#define BOOST_ARCHIVE_SOURCE\n#include \"polymorphic_portable_binary_oarchive.hpp\"\n\n// explicitly instantiate for this type of text stream\n#include <boost/archive/impl/basic_binary_oarchive.ipp>\n#include <boost/archive/impl/archive_pointer_oserializer.ipp>\n#include <boost/archive/impl/basic_binary_oprimitive.ipp>\n\nnamespace boost {\nnamespace archive {\n\n// explicitly instantiate for this type of binary stream\ntemplate class binary_oarchive_impl<\n    polymorphic_portable_binary_oarchive,\n    std::ostream::char_type,\n    std::ostream::traits_type\n>;\ntemplate class detail::archive_pointer_oserializer<\n    polymorphic_portable_binary_oarchive\n> ;\n\n} // namespace archive\n} // namespace boost\n"
  },
  {
    "path": "example/polymorphic_portable_binary_oarchive.hpp",
    "content": "#ifndef BOOST_ARCHIVE_POLYMORPHIC_PORTABLE_BINARY_OARCHIVE_HPP\n#define BOOST_ARCHIVE_POLYMORPHIC_PORTABLE_BINARY_OARCHIVE_HPP\n\n// MS compatible compilers support #pragma once\n#if defined(_MSC_VER)\n# pragma once\n#endif\n\n/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// polymorphic_portable_binary_oarchive.hpp\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for updates, documentation, and revision history.\n\n#include <boost/archive/detail/polymorphic_oarchive_dispatch.hpp>\n#include \"portable_binary_oarchive.hpp\"\n\ntypedef boost::archive::detail::polymorphic_oarchive_dispatch<\n    portable_binary_oarchive\n > polymorphic_portable_binary_oarchive;\n\n#include <boost/version.hpp>\n#if BOOST_VERSION > 103401\n    // required by export\n    BOOST_SERIALIZATION_REGISTER_ARCHIVE(\n        polymorphic_portable_binary_oarchive\n    )\n#endif\n\n#endif // BOOST_ARCHIVE_POLYMORPHIC_PORTABLE_BINARY_OARCHIVE_HPP\n"
  },
  {
    "path": "example/portable_binary_archive.hpp",
    "content": "#ifndef PORTABLE_BINARY_ARCHIVE_HPP\n#define PORTABLE_BINARY_ARCHIVE_HPP\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n// MS compatible compilers support #pragma once\n#if defined(_MSC_VER)\n# pragma once\n#endif\n\n#include <boost/config.hpp>\n#include <boost/cstdint.hpp>\n#include <boost/static_assert.hpp>\n\n#include <climits>\n#if CHAR_BIT != 8\n#error This code assumes an eight-bit byte.\n#endif\n\n#include <boost/archive/basic_archive.hpp>\n#include <boost/predef/other/endian.h>\n\nenum portable_binary_archive_flags {\n    endian_big        = 0x4000,\n    endian_little     = 0x8000\n};\n\n//#if ( endian_big <= boost::archive::flags_last )\n//#error archive flags conflict\n//#endif\n\ninline void\nreverse_bytes(char size, char *address){\n    char * first = address;\n    char * last = first + size - 1;\n    for(;first < last;++first, --last){\n        char x = *last;\n        *last = *first;\n        *first = x;\n    }\n}\n\n#endif // PORTABLE_BINARY_ARCHIVE_HPP\n"
  },
  {
    "path": "example/portable_binary_iarchive.cpp",
    "content": "/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// portable_binary_iarchive.cpp\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for updates, documentation, and revision history.\n\n#include <istream>\n#include <string>\n\n#include <boost/predef/other/endian.h>\n#include <boost/serialization/throw_exception.hpp>\n#include <boost/archive/archive_exception.hpp>\n\n#include \"portable_binary_iarchive.hpp\"\n\nvoid\nportable_binary_iarchive::load_impl(boost::intmax_t & l, char maxsize){\n    char size;\n    l = 0;\n    this->primitive_base_t::load(size);\n\n    if(0 == size){\n        return;\n    }\n\n    bool negative = (size < 0);\n    if(negative)\n        size = -size;\n\n    if(size > maxsize)\n        boost::serialization::throw_exception(\n            portable_binary_iarchive_exception()\n        );\n\n    char * cptr = reinterpret_cast<char *>(& l);\n    #if BOOST_ENDIAN_BIG_BYTE\n        cptr += (sizeof(boost::intmax_t) - size);\n    #endif\n    this->primitive_base_t::load_binary(cptr, size);\n\n    #if BOOST_ENDIAN_BIG_BYTE\n        if(m_flags & endian_little)\n    #else\n        if(m_flags & endian_big)\n    #endif\n    reverse_bytes(size, cptr);\n\n    if(negative)\n        l = -l;\n}\n\nvoid\nportable_binary_iarchive::load_override(\n    boost::archive::class_name_type & t\n){\n    std::string cn;\n    cn.reserve(BOOST_SERIALIZATION_MAX_KEY_SIZE);\n    load_override(cn);\n    if(cn.size() > (BOOST_SERIALIZATION_MAX_KEY_SIZE - 1))\n        boost::serialization::throw_exception(\n            boost::archive::archive_exception(\n                boost::archive::archive_exception::invalid_class_name)\n            );\n    std::memcpy(t, cn.data(), cn.size());\n    // borland tweak\n    t.t[cn.size()] = '\\0';\n}\n\nvoid\nportable_binary_iarchive::init(unsigned int flags){\n    if(0 == (flags & boost::archive::no_header)){\n        // read signature in an archive version independent manner\n        std::string file_signature;\n        * this >> file_signature;\n        if(file_signature != boost::archive::BOOST_ARCHIVE_SIGNATURE())\n            boost::serialization::throw_exception(\n                boost::archive::archive_exception(\n                    boost::archive::archive_exception::invalid_signature\n                )\n            );\n        // make sure the version of the reading archive library can\n        // support the format of the archive being read\n        boost::archive::library_version_type input_library_version;\n        * this >> input_library_version;\n\n        // extra little .t is to get around borland quirk\n        if(boost::archive::BOOST_ARCHIVE_VERSION() < input_library_version)\n            boost::serialization::throw_exception(\n                boost::archive::archive_exception(\n                    boost::archive::archive_exception::unsupported_version\n                )\n            );\n\n        #if BOOST_WORKAROUND(__MWERKS__, BOOST_TESTED_AT(0x3205))\n        this->set_library_version(input_library_version);\n        //#else\n        //#if ! BOOST_WORKAROUND(BOOST_MSVC, <= 1200)\n        //detail::\n        //#endif\n        boost::archive::detail::basic_iarchive::set_library_version(\n            input_library_version\n        );\n        #endif\n    }\n    unsigned char x;\n    load(x);\n    m_flags = x << CHAR_BIT;\n}\n\n#include <boost/archive/impl/archive_serializer_map.ipp>\n#include <boost/archive/impl/basic_binary_iprimitive.ipp>\n\nnamespace boost {\nnamespace archive {\n\nnamespace detail {\n    template class archive_serializer_map<portable_binary_iarchive>;\n}\n\ntemplate class basic_binary_iprimitive<\n    portable_binary_iarchive,\n    std::istream::char_type,\n    std::istream::traits_type\n> ;\n\n} // namespace archive\n} // namespace boost\n"
  },
  {
    "path": "example/portable_binary_iarchive.hpp",
    "content": "#ifndef PORTABLE_BINARY_IARCHIVE_HPP\n#define PORTABLE_BINARY_IARCHIVE_HPP\n\n// MS compatible compilers support #pragma once\n#if defined(_MSC_VER)\n# pragma once\n#endif\n\n#if defined(_MSC_VER)\n#pragma warning( push )\n#pragma warning( disable : 4244 )\n#endif\n\n/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// portable_binary_iarchive.hpp\n\n// (C) Copyright 2002-7 Robert Ramey - http://www.rrsd.com .\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for updates, documentation, and revision history.\n\n#include <istream>\n#include <boost/serialization/string.hpp>\n#include <boost/serialization/item_version_type.hpp>\n#include <boost/archive/archive_exception.hpp>\n#include <boost/archive/basic_binary_iprimitive.hpp>\n#include <boost/archive/detail/common_iarchive.hpp>\n#include <boost/archive/detail/register_archive.hpp>\n\n#include \"portable_binary_archive.hpp\"\n\n/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// exception to be thrown if integer read from archive doesn't fit\n// variable being loaded\nclass portable_binary_iarchive_exception :\n    public boost::archive::archive_exception\n{\npublic:\n    enum exception_code {\n        incompatible_integer_size\n    } m_exception_code ;\n    portable_binary_iarchive_exception(exception_code c = incompatible_integer_size ) :\n        boost::archive::archive_exception(boost::archive::archive_exception::other_exception),\n        m_exception_code(c)\n    {}\n    virtual const char *what( ) const throw( )\n    {\n        const char *msg = \"programmer error\";\n        switch(m_exception_code){\n        case incompatible_integer_size:\n            msg = \"integer cannot be represented\";\n            break;\n        default:\n            msg = boost::archive::archive_exception::what();\n            assert(false);\n            break;\n        }\n        return msg;\n    }\n};\n\n/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// \"Portable\" input binary archive.  It addresses integer size and endianness so\n// that binary archives can be passed across systems. Note:floating point types\n// not addressed here\nclass portable_binary_iarchive :\n    public boost::archive::basic_binary_iprimitive<\n        portable_binary_iarchive,\n        std::istream::char_type,\n        std::istream::traits_type\n    >,\n    public boost::archive::detail::common_iarchive<\n        portable_binary_iarchive\n    >\n    {\n    typedef boost::archive::basic_binary_iprimitive<\n        portable_binary_iarchive,\n        std::istream::char_type,\n        std::istream::traits_type\n    > primitive_base_t;\n    typedef boost::archive::detail::common_iarchive<\n        portable_binary_iarchive\n    > archive_base_t;\n#ifndef BOOST_NO_MEMBER_TEMPLATE_FRIENDS\npublic:\n#else\n    friend archive_base_t;\n    friend primitive_base_t; // since with override load below\n    friend class boost::archive::detail::interface_iarchive<\n        portable_binary_iarchive\n    >;\n    friend class boost::archive::load_access;\nprotected:\n#endif\n    unsigned int m_flags;\n    void load_impl(boost::intmax_t & l, char maxsize);\n\n    // default fall through for any types not specified here\n    template<class T>\n    void load(T & t){\n        boost::intmax_t l;\n        load_impl(l, sizeof(T));\n        // use cast to avoid compile time warning\n        //t = static_cast< T >(l);\n        t = T(l);\n    }\n    void load(boost::serialization::item_version_type & t){\n        boost::intmax_t l;\n        load_impl(l, sizeof(boost::serialization::item_version_type));\n        // use cast to avoid compile time warning\n        t = boost::serialization::item_version_type(l);\n    }\n    void load(boost::archive::version_type & t){\n        boost::intmax_t l;\n        load_impl(l, sizeof(boost::archive::version_type));\n        // use cast to avoid compile time warning\n        t = boost::archive::version_type(l);\n    }\n    void load(boost::archive::class_id_type & t){\n        boost::intmax_t l;\n        load_impl(l, sizeof(boost::archive::class_id_type));\n        // use cast to avoid compile time warning\n        t = boost::archive::class_id_type(static_cast<int>(l));\n    }\n    void load(std::string & t){\n        this->primitive_base_t::load(t);\n    }\n    #ifndef BOOST_NO_STD_WSTRING\n    void load(std::wstring & t){\n        this->primitive_base_t::load(t);\n    }\n    #endif\n    void load(float & t){\n        this->primitive_base_t::load(t);\n        // floats not supported\n        //BOOST_STATIC_ASSERT(false);\n    }\n    void load(double & t){\n        this->primitive_base_t::load(t);\n        // doubles not supported\n        //BOOST_STATIC_ASSERT(false);\n    }\n    void load(char & t){\n        this->primitive_base_t::load(t);\n    }\n    void load(unsigned char & t){\n        this->primitive_base_t::load(t);\n    }\n    typedef boost::archive::detail::common_iarchive<portable_binary_iarchive>\n        detail_common_iarchive;\n    template<class T>\n    void load_override(T & t){\n        this->detail_common_iarchive::load_override(t);\n    }\n    void load_override(boost::archive::class_name_type & t);\n    // binary files don't include the optional information\n    void load_override(boost::archive::class_id_optional_type &){}\n\n    void init(unsigned int flags);\npublic:\n    portable_binary_iarchive(std::istream & is, unsigned flags = 0) :\n        primitive_base_t(\n            * is.rdbuf(),\n            0 != (flags & boost::archive::no_codecvt)\n        ),\n        archive_base_t(flags),\n        m_flags(0)\n    {\n        init(flags);\n    }\n\n    portable_binary_iarchive(\n        std::basic_streambuf<\n            std::istream::char_type,\n            std::istream::traits_type\n        > & bsb,\n        unsigned int flags\n    ) :\n        primitive_base_t(\n            bsb,\n            0 != (flags & boost::archive::no_codecvt)\n        ),\n        archive_base_t(flags),\n        m_flags(0)\n    {\n        init(flags);\n    }\n};\n\n// required by export in boost version > 1.34\n#ifdef BOOST_SERIALIZATION_REGISTER_ARCHIVE\n    BOOST_SERIALIZATION_REGISTER_ARCHIVE(portable_binary_iarchive)\n#endif\n\n// required by export in boost <= 1.34\n#define BOOST_ARCHIVE_CUSTOM_IARCHIVE_TYPES portable_binary_iarchive\n\n#if defined(_MSC_VER)\n#pragma warning( pop )\n#endif\n\n#endif // PORTABLE_BINARY_IARCHIVE_HPP\n"
  },
  {
    "path": "example/portable_binary_oarchive.cpp",
    "content": "/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// portable_binary_oarchive.cpp\n\n// (C) Copyright 2002-7 Robert Ramey - http://www.rrsd.com .\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for updates, documentation, and revision history.\n\n#include <ostream>\n#include <boost/predef/other/endian.h>\n#include \"portable_binary_oarchive.hpp\"\n\nvoid\nportable_binary_oarchive::save_impl(\n    const boost::intmax_t l,\n    const char maxsize\n){\n    char size = 0;\n\n    if(l == 0){\n        this->primitive_base_t::save(size);\n        return;\n    }\n\n    boost::intmax_t ll;\n    bool negative = (l < 0);\n    if(negative)\n        ll = -l;\n    else\n        ll = l;\n\n    do{\n        ll >>= CHAR_BIT;\n        ++size;\n    }while(ll != 0);\n\n    this->primitive_base_t::save(\n        static_cast<char>(negative ? -size : size)\n    );\n\n    if(negative)\n        ll = -l;\n    else\n        ll = l;\n    char * cptr = reinterpret_cast<char *>(& ll);\n    #if BOOST_ENDIAN_BIG_BYTE\n        cptr += (sizeof(boost::intmax_t) - size);\n        if(m_flags & endian_little)\n            reverse_bytes(size, cptr);\n    #else\n        if(m_flags & endian_big)\n            reverse_bytes(size, cptr);\n    #endif\n    this->primitive_base_t::save_binary(cptr, size);\n}\n\nvoid\nportable_binary_oarchive::init(unsigned int flags) {\n    if(m_flags == (endian_big | endian_little)){\n        boost::serialization::throw_exception(\n            portable_binary_oarchive_exception()\n        );\n    }\n    if(0 == (flags & boost::archive::no_header)){\n        // write signature in an archive version independent manner\n        const std::string file_signature(\n            boost::archive::BOOST_ARCHIVE_SIGNATURE()\n        );\n        * this << file_signature;\n        // write library version\n        const boost::archive::library_version_type v(\n            boost::archive::BOOST_ARCHIVE_VERSION()\n        );\n        * this << v;\n    }\n    save(static_cast<unsigned char>(m_flags >> CHAR_BIT));\n}\n\n#include <boost/archive/impl/archive_serializer_map.ipp>\n#include <boost/archive/impl/basic_binary_oprimitive.ipp>\n\nnamespace boost {\nnamespace archive {\n\nnamespace detail {\n    template class archive_serializer_map<portable_binary_oarchive>;\n}\n\ntemplate class basic_binary_oprimitive<\n    portable_binary_oarchive,\n    std::ostream::char_type,\n    std::ostream::traits_type\n> ;\n\n} // namespace archive\n} // namespace boost\n"
  },
  {
    "path": "example/portable_binary_oarchive.hpp",
    "content": "#ifndef PORTABLE_BINARY_OARCHIVE_HPP\n#define PORTABLE_BINARY_OARCHIVE_HPP\n\n// MS compatible compilers support #pragma once\n#if defined(_MSC_VER)\n# pragma once\n#endif\n\n#if defined(_MSC_VER)\n#pragma warning( push )\n#pragma warning( disable : 4244 )\n#endif\n\n/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// portable_binary_oarchive.hpp\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for updates, documentation, and revision history.\n\n#include <ostream>\n#include <boost/serialization/string.hpp>\n#include <boost/archive/archive_exception.hpp>\n#include <boost/archive/basic_binary_oprimitive.hpp>\n#include <boost/archive/detail/common_oarchive.hpp>\n#include <boost/archive/detail/register_archive.hpp>\n\n#include \"portable_binary_archive.hpp\"\n\n/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// exception to be thrown if integer read from archive doesn't fit\n// variable being loaded\nclass portable_binary_oarchive_exception :\n    public boost::archive::archive_exception\n{\npublic:\n    typedef enum {\n        invalid_flags\n    } exception_code;\n    portable_binary_oarchive_exception(exception_code c = invalid_flags )\n    {}\n    virtual const char *what( ) const throw( )\n    {\n        const char *msg = \"programmer error\";\n        switch(code){\n        case invalid_flags:\n            msg = \"cannot be both big and little endian\";\n        default:\n            boost::archive::archive_exception::what();\n        }\n        return msg;\n    }\n};\n\n/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// \"Portable\" output binary archive.  This is a variation of the native binary\n// archive. it addresses integer size and endianness so that binary archives can\n// be passed across systems. Note:floating point types not addressed here\n\nclass portable_binary_oarchive :\n    public boost::archive::basic_binary_oprimitive<\n        portable_binary_oarchive,\n        std::ostream::char_type,\n        std::ostream::traits_type\n    >,\n    public boost::archive::detail::common_oarchive<\n        portable_binary_oarchive\n    >\n{\n    typedef boost::archive::basic_binary_oprimitive<\n        portable_binary_oarchive,\n        std::ostream::char_type,\n        std::ostream::traits_type\n    > primitive_base_t;\n    typedef boost::archive::detail::common_oarchive<\n        portable_binary_oarchive\n    > archive_base_t;\n#ifndef BOOST_NO_MEMBER_TEMPLATE_FRIENDS\npublic:\n#else\n    friend archive_base_t;\n    friend primitive_base_t; // since with override save below\n    friend class boost::archive::detail::interface_oarchive<\n        portable_binary_oarchive\n    >;\n    friend class boost::archive::save_access;\nprotected:\n#endif\n    unsigned int m_flags;\n    void save_impl(const boost::intmax_t l, const char maxsize);\n    // add base class to the places considered when matching\n    // save function to a specific set of arguments.  Note, this didn't\n    // work on my MSVC 7.0 system so we use the sure-fire method below\n    // using archive_base_t::save;\n\n    // default fall through for any types not specified here\n    template<class T>\n    void save(const T & t){\n        save_impl(t, sizeof(T));\n    }\n    void save(const std::string & t){\n        this->primitive_base_t::save(t);\n    }\n    #ifndef BOOST_NO_STD_WSTRING\n    void save(const std::wstring & t){\n        this->primitive_base_t::save(t);\n    }\n    #endif\n    void save(const float & t){\n        this->primitive_base_t::save(t);\n        // floats not supported\n        //BOOST_STATIC_ASSERT(false);\n    }\n    void save(const double & t){\n        this->primitive_base_t::save(t);\n        // doubles not supported\n        //BOOST_STATIC_ASSERT(false);\n    }\n    void save(const char & t){\n        this->primitive_base_t::save(t);\n    }\n    void save(const unsigned char & t){\n        this->primitive_base_t::save(t);\n    }\n\n    // default processing - kick back to base class.  Note the\n    // extra stuff to get it passed borland compilers\n    typedef boost::archive::detail::common_oarchive<portable_binary_oarchive>\n        detail_common_oarchive;\n    template<class T>\n    void save_override(T & t){\n        this->detail_common_oarchive::save_override(t);\n    }\n    // explicitly convert to char * to avoid compile ambiguities\n    void save_override(const boost::archive::class_name_type & t){\n        const std::string s(t);\n        * this << s;\n    }\n    // binary files don't include the optional information\n    void save_override(\n        const boost::archive::class_id_optional_type & /* t */\n    ){}\n\n    void init(unsigned int flags);\npublic:\n    portable_binary_oarchive(std::ostream & os, unsigned flags = 0) :\n        primitive_base_t(\n            * os.rdbuf(),\n            0 != (flags & boost::archive::no_codecvt)\n        ),\n        archive_base_t(flags),\n        m_flags(flags & (endian_big | endian_little))\n    {\n        init(flags);\n    }\n\n    portable_binary_oarchive(\n        std::basic_streambuf<\n            std::ostream::char_type,\n            std::ostream::traits_type\n        > & bsb,\n        unsigned int flags\n    ) :\n        primitive_base_t(\n            bsb,\n            0 != (flags & boost::archive::no_codecvt)\n        ),\n        archive_base_t(flags),\n        m_flags(0)\n    {\n        init(flags);\n    }\n};\n\n\n// required by export in boost version > 1.34\n#ifdef BOOST_SERIALIZATION_REGISTER_ARCHIVE\n    BOOST_SERIALIZATION_REGISTER_ARCHIVE(portable_binary_oarchive)\n#endif\n\n// required by export in boost <= 1.34\n#define BOOST_ARCHIVE_CUSTOM_OARCHIVE_TYPES portable_binary_oarchive\n\n#if defined(_MSC_VER)\n#pragma warning( pop )\n#endif\n\n#endif // PORTABLE_BINARY_OARCHIVE_HPP\n"
  },
  {
    "path": "example/simple_log_archive.hpp",
    "content": "#ifndef BOOST_SIMPLE_LOG_ARCHIVE_HPP\n#define BOOST_SIMPLE_LOG_ARCHIVE_HPP\n\n// MS compatible compilers support #pragma once\n#if defined(_MSC_VER)\n# pragma once\n#endif\n\n/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// simple_log_archive.hpp\n\n// (C) Copyright 2010 Robert Ramey - http://www.rrsd.com .\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for updates, documentation, and revision history.\n\n#include <ostream>\n#include <cstddef> // std::size_t\n\n#include <boost/config.hpp>\n#if defined(BOOST_NO_STDC_NAMESPACE)\nnamespace std{\n    using ::size_t;\n} // namespace std\n#endif\n\n#include <boost/type_traits/is_enum.hpp>\n#include <boost/mpl/bool.hpp>\n#include <boost/mpl/eval_if.hpp>\n#include <boost/mpl/int.hpp>\n#include <boost/mpl/equal_to.hpp>\n#include <boost/serialization/nvp.hpp>\n#include <boost/serialization/array.hpp>\n#include <boost/serialization/string.hpp>\n#include <boost/serialization/access.hpp>\n\n/////////////////////////////////////////////////////////////////////////\n// log data to an output stream.  This illustrates a simpler implementation\n// of text output which is useful for getting a formatted display of\n// any serializable class.  Intended to be useful as a debugging aid.\nclass simple_log_archive {\n    std::ostream & m_os;\n    unsigned int m_depth;\n\n    template<class Archive>\n    struct save_enum_type {\n        template<class T>\n        static void invoke(Archive &ar, const T &t){\n            ar.m_os << static_cast<int>(t);\n        }\n    };\n    template<class Archive>\n    struct save_primitive {\n        template<class T>\n        static void invoke(Archive & ar, const T & t){\n            ar.m_os << t;\n        }\n    };\n    template<class Archive>\n    struct save_only {\n        template<class T>\n        static void invoke(Archive & ar, const T & t){\n            // make sure call is routed through the highest interface that might\n            // be specialized by the user.\n            boost::serialization::serialize_adl(\n                ar,\n                const_cast<T &>(t),\n                ::boost::serialization::version< T >::value\n            );\n        }\n    };\n    template<class T>\n    void save(const T &t){\n        typedef\n            BOOST_DEDUCED_TYPENAME boost::mpl::eval_if<boost::is_enum< T >,\n                boost::mpl::identity<save_enum_type<simple_log_archive> >,\n            //else\n            BOOST_DEDUCED_TYPENAME boost::mpl::eval_if<\n                // if its primitive\n                    boost::mpl::equal_to<\n                        boost::serialization::implementation_level< T >,\n                        boost::mpl::int_<boost::serialization::primitive_type>\n                    >,\n                    boost::mpl::identity<save_primitive<simple_log_archive> >,\n            // else\n                boost::mpl::identity<save_only<simple_log_archive> >\n            > >::type typex;\n        typex::invoke(*this, t);\n    }\n    #ifndef BOOST_NO_STD_WSTRING\n    void save(const std::wstring &ws){\n        m_os << \"wide string types not supported in log archive\";\n    }\n    #endif\n\npublic:\n    ///////////////////////////////////////////////////\n    // Implement requirements for archive concept\n\n    typedef boost::mpl::bool_<false> is_loading;\n    typedef boost::mpl::bool_<true> is_saving;\n\n    // this can be a no-op since we ignore pointer polymorphism\n    template<class T>\n    void register_type(const T * = NULL){}\n\n    unsigned int get_library_version(){\n        return 0;\n    }\n\n    void\n    save_binary(const void *address, std::size_t count){\n        m_os << \"save_binary not implemented\";\n    }\n\n    // the << operators\n    template<class T>\n    simple_log_archive & operator<<(T const & t){\n        m_os << ' ';\n        save(t);\n        return * this;\n    }\n    template<class T>\n    simple_log_archive & operator<<(T * const t){\n        m_os << \" ->\";\n        if(NULL == t)\n            m_os << \" null\";\n        else\n            *this << * t;\n        return * this;\n    }\n    template<class T, int N>\n    simple_log_archive & operator<<(const T (&t)[N]){\n        return *this << boost::serialization::make_array(\n            static_cast<const T *>(&t[0]),\n            N\n        );\n    }\n    template<class T>\n    simple_log_archive & operator<<(const boost::serialization::nvp< T > & t){\n        m_os << '\\n'; // start line with each named object\n        // indent according to object depth\n        for(unsigned int i = 0; i < m_depth; ++i)\n            m_os << ' ';\n        ++m_depth;\n        m_os << t.name(); // output the name of the object\n        * this << t.const_value();\n        --m_depth;\n        return * this;\n    }\n\n    // the & operator\n    template<class T>\n    simple_log_archive & operator&(const T & t){\n            return * this << t;\n    }\n    ///////////////////////////////////////////////\n\n    simple_log_archive(std::ostream & os) :\n        m_os(os),\n        m_depth(0)\n    {}\n};\n\n#endif // BOOST_SIMPLE_LOG_ARCHIVE_HPP\n"
  },
  {
    "path": "include/boost/archive/archive_exception.hpp",
    "content": "#ifndef BOOST_ARCHIVE_ARCHIVE_EXCEPTION_HPP\n#define BOOST_ARCHIVE_ARCHIVE_EXCEPTION_HPP\n\n// MS compatible compilers support #pragma once\n#if defined(_MSC_VER)\n# pragma once\n#endif\n\n/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// archive/archive_exception.hpp:\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for updates, documentation, and revision history.\n\n#include <exception>\n#include <boost/assert.hpp>\n#include <string>\n\n#include <boost/config.hpp>\n#include <boost/archive/detail/decl.hpp>\n\n// note: the only reason this is in here is that windows header\n// includes #define exception_code _exception_code (arrrgghhhh!).\n// the most expedient way to address this is be sure that this\n// header is always included whenever this header file is included.\n#if defined(BOOST_WINDOWS)\n#include <excpt.h>\n#endif\n\n#include <boost/archive/detail/abi_prefix.hpp> // must be the last header\n\nnamespace boost {\nnamespace archive {\n\n//////////////////////////////////////////////////////////////////////\n// exceptions thrown by archives\n//\nclass BOOST_SYMBOL_VISIBLE archive_exception :\n    public virtual std::exception\n{\nprivate:\n    char m_buffer[128];\nprotected:\n    BOOST_ARCHIVE_DECL unsigned int\n    append(unsigned int l, const char * a);\n    BOOST_ARCHIVE_DECL\n    archive_exception() BOOST_NOEXCEPT;\npublic:\n    typedef enum {\n        no_exception,       // initialized without code\n        other_exception,    // any exception not listed below\n        unregistered_class, // attempt to serialize a pointer of\n                            // an unregistered class\n        invalid_signature,  // first line of archive does not contain\n                            // expected string\n        unsupported_version,// archive created with library version\n                            // subsequent to this one\n        pointer_conflict,   // an attempt has been made to directly\n                            // serialize an object which has\n                            // already been serialized through a pointer.\n                            // Were this permitted, the archive load would result\n                            // in the creation of an extra copy of the object.\n        incompatible_native_format, // attempt to read native binary format\n                            // on incompatible platform\n        array_size_too_short,// array being loaded doesn't fit in array allocated\n        input_stream_error, // error on input stream\n        invalid_class_name, // class name greater than the maximum permitted.\n                            // most likely a corrupted archive or an attempt\n                            // to insert virus via buffer overrun method.\n        unregistered_cast,   // base - derived relationship not registered with\n                            // void_cast_register\n        unsupported_class_version, // type saved with a version # greater than the\n                            // one used by the program.  This indicates that the program\n                            // needs to be rebuilt.\n        multiple_code_instantiation, // code for implementing serialization for some\n                            // type has been instantiated in more than one module.\n        output_stream_error // error on input stream\n    } exception_code;\n    exception_code code;\n\n    BOOST_ARCHIVE_DECL archive_exception(\n        exception_code c,\n        const char * e1 = NULL,\n        const char * e2 = NULL\n    ) BOOST_NOEXCEPT;\n    BOOST_ARCHIVE_DECL archive_exception(archive_exception const &) BOOST_NOEXCEPT;\n    BOOST_ARCHIVE_DECL ~archive_exception() BOOST_NOEXCEPT_OR_NOTHROW BOOST_OVERRIDE;\n    BOOST_ARCHIVE_DECL const char * what() const BOOST_NOEXCEPT_OR_NOTHROW BOOST_OVERRIDE;\n};\n\n}// namespace archive\n}// namespace boost\n\n#include <boost/archive/detail/abi_suffix.hpp> // pops abi_suffix.hpp pragmas\n\n#endif //BOOST_ARCHIVE_ARCHIVE_EXCEPTION_HPP\n"
  },
  {
    "path": "include/boost/archive/basic_archive.hpp",
    "content": "#ifndef BOOST_ARCHIVE_BASIC_ARCHIVE_HPP\n#define BOOST_ARCHIVE_BASIC_ARCHIVE_HPP\n\n// MS compatible compilers support #pragma once\n#if defined(_MSC_VER)\n# pragma once\n#endif\n\n/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// basic_archive.hpp:\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for updates, documentation, and revision history.\n#include <cstring> // count\n#include <boost/assert.hpp>\n#include <boost/config.hpp>\n#include <boost/integer_traits.hpp>\n#include <boost/noncopyable.hpp>\n#include <boost/serialization/library_version_type.hpp>\n\n#include <boost/archive/detail/auto_link_archive.hpp>\n#include <boost/archive/detail/abi_prefix.hpp> // must be the last header\n\nnamespace boost {\nnamespace archive {\n\n#if defined(_MSC_VER)\n#pragma warning( push )\n#pragma warning( disable : 4244 4267 )\n#endif\n\nBOOST_ARCHIVE_DECL boost::serialization::library_version_type\nBOOST_ARCHIVE_VERSION();\n\n// create alias in boost::archive for older user code.\ntypedef boost::serialization::library_version_type library_version_type;\n\nclass version_type {\nprivate:\n    typedef uint_least32_t base_type;\n    base_type t;\npublic:\n    // should be private - but MPI fails if it's not!!!\n    version_type(): t(0) {}\n    explicit version_type(const unsigned int & t_) : t(t_){\n        BOOST_ASSERT(t_ <= boost::integer_traits<base_type>::const_max);\n    }\n    version_type(const version_type & t_) :\n        t(t_.t)\n    {}\n    version_type & operator=(const version_type & rhs){\n        t = rhs.t;\n        return *this;\n    }\n    // used for text output\n    operator base_type () const {\n        return t;\n    }\n    // used for text input\n    operator base_type  & (){\n        return t;\n    }\n    bool operator==(const version_type & rhs) const {\n        return t == rhs.t;\n    }\n    bool operator<(const version_type & rhs) const {\n        return t < rhs.t;\n    }\n};\n\nclass class_id_type {\nprivate:\n    typedef int_least16_t base_type;\n    base_type t;\npublic:\n    // should be private - but then can't use BOOST_STRONG_TYPE below\n    class_id_type() : t(0) {}\n    explicit class_id_type(const int t_) : t(t_){\n        BOOST_ASSERT(t_ <= boost::integer_traits<base_type>::const_max);\n    }\n    explicit class_id_type(const std::size_t t_) : t(t_){\n //       BOOST_ASSERT(t_ <= boost::integer_traits<base_type>::const_max);\n    }\n    class_id_type(const class_id_type & t_) :\n        t(t_.t)\n    {}\n    class_id_type & operator=(const class_id_type & rhs){\n        t = rhs.t;\n        return *this;\n    }\n\n    // used for text output\n    operator base_type () const {\n        return t;\n    }\n    // used for text input\n    operator base_type &() {\n        return t;\n    }\n    bool operator==(const class_id_type & rhs) const {\n        return t == rhs.t;\n    }\n    bool operator<(const class_id_type & rhs) const {\n        return t < rhs.t;\n    }\n};\n\n#define BOOST_SERIALIZATION_NULL_POINTER_TAG boost::archive::class_id_type(-1)\n\nclass object_id_type {\nprivate:\n    typedef uint_least32_t base_type;\n    base_type t;\npublic:\n    object_id_type(): t(0) {}\n    // note: presumes that size_t >= unsigned int.\n    // use explicit cast to silence useless warning\n    explicit object_id_type(const std::size_t & t_) : t(static_cast<base_type>(t_)){\n        // make quadruple sure that we haven't lost any real integer\n        // precision\n        BOOST_ASSERT(t_ <= boost::integer_traits<base_type>::const_max);\n    }\n    object_id_type(const object_id_type & t_) :\n        t(t_.t)\n    {}\n    object_id_type & operator=(const object_id_type & rhs){\n        t = rhs.t;\n        return *this;\n    }\n    // used for text output\n    operator base_type () const {\n        return t;\n    }\n    // used for text input\n    operator base_type & () {\n        return t;\n    }\n    bool operator==(const object_id_type & rhs) const {\n        return t == rhs.t;\n    }\n    bool operator<(const object_id_type & rhs) const {\n        return t < rhs.t;\n    }\n};\n\n#if defined(_MSC_VER)\n#pragma warning( pop )\n#endif\n\nstruct tracking_type {\n    bool t;\n    explicit tracking_type(const bool t_ = false)\n        : t(t_)\n    {}\n    tracking_type(const tracking_type & t_)\n        : t(t_.t)\n    {}\n    operator bool () const {\n        return t;\n    }\n    operator bool & () {\n        return t;\n    }\n    tracking_type & operator=(const bool t_){\n        t = t_;\n        return *this;\n    }\n    bool operator==(const tracking_type & rhs) const {\n        return t == rhs.t;\n    }\n    bool operator==(const bool & rhs) const {\n        return t == rhs;\n    }\n    tracking_type & operator=(const tracking_type & rhs){\n        t = rhs.t;\n        return *this;\n    }\n};\n\nstruct class_name_type :\n    private boost::noncopyable\n{\n    char *t;\n    operator const char * & () const {\n        return const_cast<const char * &>(t);\n    }\n    operator char * () {\n        return t;\n    }\n    std::size_t size() const {\n        return std::strlen(t);\n    }\n    explicit class_name_type(const char *key_)\n    : t(const_cast<char *>(key_)){}\n    explicit class_name_type(char *key_)\n    : t(key_){}\n    class_name_type & operator=(const class_name_type & rhs){\n        t = rhs.t;\n        return *this;\n    }\n};\n\nenum archive_flags {\n    no_header = 1,  // suppress archive header info\n    no_codecvt = 2,  // suppress alteration of codecvt facet\n    no_xml_tag_checking = 4,   // suppress checking of xml tags\n    no_tracking = 8,           // suppress ALL tracking\n    flags_last = 8\n};\n\nBOOST_ARCHIVE_DECL const char *\nBOOST_ARCHIVE_SIGNATURE();\n\n/* NOTE : Warning  : Warning : Warning : Warning : Warning\n * If any of these are changed to different sized types,\n * binary_iarchive won't be able to read older archives\n * unless you rev the library version and include conditional\n * code based on the library version.  There is nothing\n * inherently wrong in doing this - but you have to be super\n * careful because it's easy to get wrong and start breaking\n * old archives !!!\n */\n\n#define BOOST_ARCHIVE_STRONG_TYPEDEF(T, D)         \\\n    class D : public T {                           \\\n    public:                                        \\\n        explicit D(const T tt) : T(tt){}           \\\n    };                                             \\\n/**/\n\nBOOST_ARCHIVE_STRONG_TYPEDEF(class_id_type, class_id_reference_type)\nBOOST_ARCHIVE_STRONG_TYPEDEF(class_id_type, class_id_optional_type)\nBOOST_ARCHIVE_STRONG_TYPEDEF(object_id_type, object_reference_type)\n\n}// namespace archive\n}// namespace boost\n\n#include <boost/archive/detail/abi_suffix.hpp> // pops abi_suffix.hpp pragmas\n\n#include <boost/serialization/level.hpp>\n\n// set implementation level to primitive for all types\n// used internally by the serialization library\n\nBOOST_CLASS_IMPLEMENTATION(boost::serialization::library_version_type, primitive_type)\nBOOST_CLASS_IMPLEMENTATION(boost::archive::version_type, primitive_type)\nBOOST_CLASS_IMPLEMENTATION(boost::archive::class_id_type, primitive_type)\nBOOST_CLASS_IMPLEMENTATION(boost::archive::class_id_reference_type, primitive_type)\nBOOST_CLASS_IMPLEMENTATION(boost::archive::class_id_optional_type, primitive_type)\nBOOST_CLASS_IMPLEMENTATION(boost::archive::class_name_type, primitive_type)\nBOOST_CLASS_IMPLEMENTATION(boost::archive::object_id_type, primitive_type)\nBOOST_CLASS_IMPLEMENTATION(boost::archive::object_reference_type, primitive_type)\nBOOST_CLASS_IMPLEMENTATION(boost::archive::tracking_type, primitive_type)\n\n#include <boost/serialization/is_bitwise_serializable.hpp>\n\n// set types used internally by the serialization library\n// to be bitwise serializable\n\nBOOST_IS_BITWISE_SERIALIZABLE(boost::serialization::library_version_type)\nBOOST_IS_BITWISE_SERIALIZABLE(boost::archive::version_type)\nBOOST_IS_BITWISE_SERIALIZABLE(boost::archive::class_id_type)\nBOOST_IS_BITWISE_SERIALIZABLE(boost::archive::class_id_reference_type)\nBOOST_IS_BITWISE_SERIALIZABLE(boost::archive::class_id_optional_type)\nBOOST_IS_BITWISE_SERIALIZABLE(boost::archive::class_name_type)\nBOOST_IS_BITWISE_SERIALIZABLE(boost::archive::object_id_type)\nBOOST_IS_BITWISE_SERIALIZABLE(boost::archive::object_reference_type)\nBOOST_IS_BITWISE_SERIALIZABLE(boost::archive::tracking_type)\n\n#endif //BOOST_ARCHIVE_BASIC_ARCHIVE_HPP\n"
  },
  {
    "path": "include/boost/archive/basic_binary_iarchive.hpp",
    "content": "#ifndef BOOST_ARCHIVE_BASIC_BINARY_IARCHIVE_HPP\n#define BOOST_ARCHIVE_BASIC_BINARY_IARCHIVE_HPP\n\n// MS compatible compilers support #pragma once\n#if defined(_MSC_VER)\n# pragma once\n#endif\n\n/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// basic_binary_iarchive.hpp\n//\n// archives stored as native binary - this should be the fastest way\n// to archive the state of a group of objects.  It makes no attempt to\n// convert to any canonical form.\n\n// IN GENERAL, ARCHIVES CREATED WITH THIS CLASS WILL NOT BE READABLE\n// ON PLATFORM APART FROM THE ONE THEY ARE CREATED ON\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for updates, documentation, and revision history.\n\n#include <boost/config.hpp>\n#include <boost/detail/workaround.hpp>\n\n#include <boost/archive/basic_archive.hpp>\n#include <boost/archive/detail/common_iarchive.hpp>\n#include <boost/serialization/collection_size_type.hpp>\n#include <boost/serialization/string.hpp>\n#include <boost/serialization/library_version_type.hpp>\n#include <boost/serialization/item_version_type.hpp>\n#include <boost/integer_traits.hpp>\n\n#ifdef BOOST_MSVC\n#  pragma warning(push)\n#  pragma warning(disable : 4511 4512)\n#endif\n\n#include <boost/archive/detail/abi_prefix.hpp> // must be the last header\n\nnamespace boost {\nnamespace archive {\n\nnamespace detail {\n    template<class Archive> class interface_iarchive;\n} // namespace detail\n\n/////////////////////////////////////////////////////////////////////////\n// class basic_binary_iarchive - read serialized objects from a input binary stream\ntemplate<class Archive>\nclass BOOST_SYMBOL_VISIBLE basic_binary_iarchive :\n    public detail::common_iarchive<Archive>\n{\n#ifdef BOOST_NO_MEMBER_TEMPLATE_FRIENDS\npublic:\n#else\nprotected:\n    #if BOOST_WORKAROUND(BOOST_MSVC, < 1500)\n        // for some inexplicable reason insertion of \"class\" generates compile erro\n        // on msvc 7.1\n        friend detail::interface_iarchive<Archive>;\n    #else\n        friend class detail::interface_iarchive<Archive>;\n    #endif\n#endif\n    // intermediate level to support override of operators\n    // fot templates in the absence of partial function\n    // template ordering. If we get here pass to base class\n    // note extra nonsense to sneak it pass the borland compilers\n    typedef detail::common_iarchive<Archive> detail_common_iarchive;\n    template<class T>\n    void load_override(T & t){\n      this->detail_common_iarchive::load_override(t);\n    }\n\n    // include these to trap a change in binary format which\n    // isn't specifically handled\n    // upto 32K classes\n    BOOST_STATIC_ASSERT(sizeof(class_id_type) == sizeof(int_least16_t));\n    BOOST_STATIC_ASSERT(sizeof(class_id_reference_type) == sizeof(int_least16_t));\n    // upto 2G objects\n    BOOST_STATIC_ASSERT(sizeof(object_id_type) == sizeof(uint_least32_t));\n    BOOST_STATIC_ASSERT(sizeof(object_reference_type) == sizeof(uint_least32_t));\n\n    // binary files don't include the optional information\n    void load_override(class_id_optional_type & /* t */){}\n\n    void load_override(tracking_type & t, int /*version*/){\n        boost::serialization::library_version_type lv = this->get_library_version();\n        if(boost::serialization::library_version_type(6) < lv){\n            int_least8_t x=0;\n            * this->This() >> x;\n            t = boost::archive::tracking_type(x);\n        }\n        else{\n            bool x=0;\n            * this->This() >> x;\n            t = boost::archive::tracking_type(x);\n        }\n    }\n    void load_override(class_id_type & t){\n        boost::serialization::library_version_type lv = this->get_library_version();\n        /*\n         * library versions:\n         *   boost 1.39 -> 5\n         *   boost 1.43 -> 7\n         *   boost 1.47 -> 9\n         *\n         *\n         * 1) in boost 1.43 and inferior, class_id_type is always a 16bit value, with no check on the library version\n         *   --> this means all archives with version v <= 7 are written with a 16bit class_id_type\n         * 2) in boost 1.44 this load_override has disappeared (and thus boost 1.44 is not backward compatible at all !!)\n         * 3) recent boosts reintroduced load_override with a test on the version :\n         *     - v > 7 : this->detail_common_iarchive::load_override(t, version)\n         *     - v > 6 : 16bit\n         *     - other : 32bit\n         *   --> which is obviously incorrect, see point 1\n         *\n         * the fix here decodes class_id_type on 16bit for all v <= 7, which seems to be the correct behaviour ...\n         */\n        if(boost::serialization::library_version_type (7) < lv){\n            this->detail_common_iarchive::load_override(t);\n        }\n        else{\n            int_least16_t x=0;\n            * this->This() >> x;\n            t = boost::archive::class_id_type(x);\n        }\n    }\n    void load_override(class_id_reference_type & t){\n        load_override(static_cast<class_id_type &>(t));\n    }\n\n    void load_override(version_type & t){\n        boost::serialization::library_version_type  lv = this->get_library_version();\n        if(boost::serialization::library_version_type(7) < lv){\n            this->detail_common_iarchive::load_override(t);\n        }\n        else\n        if(boost::serialization::library_version_type(6) < lv){\n            uint_least8_t x=0;\n            * this->This() >> x;\n            t = boost::archive::version_type(x);\n        }\n        else\n        if(boost::serialization::library_version_type(5) < lv){\n            uint_least16_t x=0;\n            * this->This() >> x;\n            t = boost::archive::version_type(x);\n        }\n        else\n        if(boost::serialization::library_version_type(2) < lv){\n            // upto 255 versions\n            unsigned char x=0;\n            * this->This() >> x;\n            t = version_type(x);\n        }\n        else{\n            unsigned int x=0;\n            * this->This() >> x;\n            t = boost::archive::version_type(x);\n        }\n    }\n\n    void load_override(boost::serialization::item_version_type & t){\n        boost::serialization::library_version_type lv = this->get_library_version();\n//        if(boost::serialization::library_version_type(7) < lvt){\n        if(boost::serialization::library_version_type(6) < lv){\n            this->detail_common_iarchive::load_override(t);\n        }\n        else\n        if(boost::serialization::library_version_type(6) < lv){\n            uint_least16_t x=0;\n            * this->This() >> x;\n            t = boost::serialization::item_version_type(x);\n        }\n        else{\n            unsigned int x=0;\n            * this->This() >> x;\n            t = boost::serialization::item_version_type(x);\n        }\n    }\n\n    void load_override(serialization::collection_size_type & t){\n        if(boost::serialization::library_version_type(5) < this->get_library_version()){\n            this->detail_common_iarchive::load_override(t);\n        }\n        else{\n            unsigned int x=0;\n            * this->This() >> x;\n            t = serialization::collection_size_type(x);\n        }\n    }\n\n    BOOST_ARCHIVE_OR_WARCHIVE_DECL void\n    load_override(class_name_type & t);\n    BOOST_ARCHIVE_OR_WARCHIVE_DECL void\n    init();\n\n    basic_binary_iarchive(unsigned int flags) :\n        detail::common_iarchive<Archive>(flags)\n    {}\n};\n\n} // namespace archive\n} // namespace boost\n\n#ifdef BOOST_MSVC\n#pragma warning(pop)\n#endif\n\n#include <boost/archive/detail/abi_suffix.hpp> // pops abi_suffix.hpp pragmas\n\n#endif // BOOST_ARCHIVE_BASIC_BINARY_IARCHIVE_HPP\n"
  },
  {
    "path": "include/boost/archive/basic_binary_iprimitive.hpp",
    "content": "#ifndef BOOST_ARCHIVE_BINARY_IPRIMITIVE_HPP\n#define BOOST_ARCHIVE_BINARY_IPRIMITIVE_HPP\n\n// MS compatible compilers support #pragma once\n#if defined(_MSC_VER)\n# pragma once\n#endif\n\n#if defined(_MSC_VER)\n#pragma warning( disable : 4800 )\n#endif\n\n/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// basic_binary_iprimitive.hpp\n//\n// archives stored as native binary - this should be the fastest way\n// to archive the state of a group of objects.  It makes no attempt to\n// convert to any canonical form.\n\n// IN GENERAL, ARCHIVES CREATED WITH THIS CLASS WILL NOT BE READABLE\n// ON PLATFORM APART FROM THE ONE THEY ARE CREATED ON\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for updates, documentation, and revision history.\n\n#include <iosfwd>\n#include <boost/assert.hpp>\n#include <locale>\n#include <cstring> // std::memcpy\n#include <cstddef> // std::size_t\n#include <streambuf> // basic_streambuf\n#include <string>\n\n#include <boost/config.hpp>\n#if defined(BOOST_NO_STDC_NAMESPACE)\nnamespace std{\n    using ::memcpy;\n    using ::size_t;\n} // namespace std\n#endif\n\n#include <boost/cstdint.hpp>\n#include <boost/serialization/throw_exception.hpp>\n#include <boost/integer.hpp>\n#include <boost/integer_traits.hpp>\n\n#include <boost/serialization/is_bitwise_serializable.hpp>\n#include <boost/serialization/array_wrapper.hpp>\n\n#include <boost/archive/basic_streambuf_locale_saver.hpp>\n#include <boost/archive/codecvt_null.hpp>\n#include <boost/archive/archive_exception.hpp>\n#include <boost/archive/detail/auto_link_archive.hpp>\n#include <boost/archive/detail/abi_prefix.hpp> // must be the last header\n\nnamespace boost {\nnamespace archive {\n\n/////////////////////////////////////////////////////////////////////////////\n// class binary_iarchive - read serialized objects from a input binary stream\ntemplate<class Archive, class Elem, class Tr>\nclass BOOST_SYMBOL_VISIBLE basic_binary_iprimitive {\n#ifndef BOOST_NO_MEMBER_TEMPLATE_FRIENDS\n    friend class load_access;\nprotected:\n#else\npublic:\n#endif\n    std::basic_streambuf<Elem, Tr> & m_sb;\n    // return a pointer to the most derived class\n    Archive * This(){\n        return static_cast<Archive *>(this);\n    }\n\n    #ifndef BOOST_NO_STD_LOCALE\n    // note order! - if you change this, libstd++ will fail!\n    // a) create new locale with new codecvt facet\n    // b) save current locale\n    // c) change locale to new one\n    // d) use stream buffer\n    // e) change locale back to original\n    // f) destroy new codecvt facet\n    boost::archive::codecvt_null<Elem> codecvt_null_facet;\n    basic_streambuf_locale_saver<Elem, Tr> locale_saver;\n    std::locale archive_locale;\n    #endif\n\n    // main template for serialization of primitive types\n    template<class T>\n    void load(T & t){\n        load_binary(& t, sizeof(T));\n    }\n\n    /////////////////////////////////////////////////////////\n    // fundamental types that need special treatment\n\n    // trap usage of invalid uninitialized boolean\n    void load(bool & t){\n        load_binary(& t, sizeof(t));\n        int i = t;\n        BOOST_ASSERT(0 == i || 1 == i);\n        (void)i; // warning suppression for release builds.\n    }\n    BOOST_ARCHIVE_OR_WARCHIVE_DECL void\n    load(std::string &s);\n    #ifndef BOOST_NO_STD_WSTRING\n    BOOST_ARCHIVE_OR_WARCHIVE_DECL void\n    load(std::wstring &ws);\n    #endif\n    BOOST_ARCHIVE_OR_WARCHIVE_DECL void\n    load(char * t);\n    BOOST_ARCHIVE_OR_WARCHIVE_DECL void\n    load(wchar_t * t);\n\n    BOOST_ARCHIVE_OR_WARCHIVE_DECL void\n    init();\n    BOOST_ARCHIVE_OR_WARCHIVE_DECL\n    basic_binary_iprimitive(\n        std::basic_streambuf<Elem, Tr> & sb,\n        bool no_codecvt\n    );\n    BOOST_ARCHIVE_OR_WARCHIVE_DECL\n    ~basic_binary_iprimitive();\npublic:\n    // we provide an optimized load for all fundamental types\n    // typedef serialization::is_bitwise_serializable<mpl::_1>\n    // use_array_optimization;\n    struct use_array_optimization {\n        template <class T>\n        #if defined(BOOST_NO_DEPENDENT_NESTED_DERIVATIONS)\n            struct apply {\n                typedef typename boost::serialization::is_bitwise_serializable< T >::type type;\n            };\n        #else\n            struct apply : public boost::serialization::is_bitwise_serializable< T > {};\n        #endif\n    };\n\n    // the optimized load_array dispatches to load_binary\n    template <class ValueType>\n    void load_array(serialization::array_wrapper<ValueType>& a, unsigned int)\n    {\n      load_binary(a.address(),a.count()*sizeof(ValueType));\n    }\n\n    void\n    load_binary(void *address, std::size_t count);\n};\n\ntemplate<class Archive, class Elem, class Tr>\ninline void\nbasic_binary_iprimitive<Archive, Elem, Tr>::load_binary(\n    void *address,\n    std::size_t count\n){\n    // note: an optimizer should eliminate the following for char files\n    BOOST_ASSERT(\n        static_cast<std::streamsize>(count / sizeof(Elem))\n        <= boost::integer_traits<std::streamsize>::const_max\n    );\n    std::streamsize s = static_cast<std::streamsize>(count / sizeof(Elem));\n    std::streamsize scount = m_sb.sgetn(\n        static_cast<Elem *>(address),\n        s\n    );\n    if(scount != s)\n        boost::serialization::throw_exception(\n            archive_exception(archive_exception::input_stream_error)\n        );\n    // note: an optimizer should eliminate the following for char files\n    BOOST_ASSERT(count % sizeof(Elem) <= boost::integer_traits<std::streamsize>::const_max);\n    s = static_cast<std::streamsize>(count % sizeof(Elem));\n    if(0 < s){\n//        if(is.fail())\n//            boost::serialization::throw_exception(\n//                archive_exception(archive_exception::stream_error)\n//        );\n        Elem t;\n        scount = m_sb.sgetn(& t, 1);\n        if(scount != 1)\n            boost::serialization::throw_exception(\n                archive_exception(archive_exception::input_stream_error)\n            );\n        std::memcpy(static_cast<char*>(address) + (count - s), &t, static_cast<std::size_t>(s));\n    }\n}\n\n} // namespace archive\n} // namespace boost\n\n#include <boost/archive/detail/abi_suffix.hpp> // pop pragmas\n\n#endif // BOOST_ARCHIVE_BINARY_IPRIMITIVE_HPP\n"
  },
  {
    "path": "include/boost/archive/basic_binary_oarchive.hpp",
    "content": "#ifndef BOOST_ARCHIVE_BASIC_BINARY_OARCHIVE_HPP\n#define BOOST_ARCHIVE_BASIC_BINARY_OARCHIVE_HPP\n\n// MS compatible compilers support #pragma once\n#if defined(_MSC_VER)\n# pragma once\n#endif\n\n/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// basic_binary_oarchive.hpp\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for updates, documentation, and revision history.\n\n// archives stored as native binary - this should be the fastest way\n// to archive the state of a group of objects.  It makes no attempt to\n// convert to any canonical form.\n\n// IN GENERAL, ARCHIVES CREATED WITH THIS CLASS WILL NOT BE READABLE\n// ON PLATFORM APART FROM THE ONE THEY ARE CREATE ON\n\n#include <boost/assert.hpp>\n#include <boost/config.hpp>\n#include <boost/detail/workaround.hpp>\n\n#include <boost/integer.hpp>\n#include <boost/integer_traits.hpp>\n\n#include <boost/archive/detail/common_oarchive.hpp>\n#include <boost/serialization/string.hpp>\n#include <boost/serialization/collection_size_type.hpp>\n#include <boost/serialization/item_version_type.hpp>\n\n#include <boost/archive/detail/abi_prefix.hpp> // must be the last header\n\n#ifdef BOOST_MSVC\n#  pragma warning(push)\n#  pragma warning(disable : 4511 4512)\n#endif\n\nnamespace boost {\nnamespace archive {\n\nnamespace detail {\n    template<class Archive> class interface_oarchive;\n} // namespace detail\n\n//////////////////////////////////////////////////////////////////////\n// class basic_binary_oarchive - write serialized objects to a binary output stream\n// note: this archive has no pretensions to portability.  Archive format\n// may vary across machine architectures and compilers.  About the only\n// guarantee is that an archive created with this code will be readable\n// by a program built with the same tools for the same machine.  This class\n// does have the virtue of building the smallest archive in the minimum amount\n// of time.  So under some circumstances it may be he right choice.\ntemplate<class Archive>\nclass BOOST_SYMBOL_VISIBLE basic_binary_oarchive :\n    public detail::common_oarchive<Archive>\n{\n#ifdef BOOST_NO_MEMBER_TEMPLATE_FRIENDS\npublic:\n#else\nprotected:\n    #if BOOST_WORKAROUND(BOOST_MSVC, < 1500)\n        // for some inexplicable reason insertion of \"class\" generates compile erro\n        // on msvc 7.1\n        friend detail::interface_oarchive<Archive>;\n    #else\n        friend class detail::interface_oarchive<Archive>;\n    #endif\n#endif\n    // any datatype not specified below will be handled by base class\n    typedef detail::common_oarchive<Archive> detail_common_oarchive;\n    template<class T>\n    void save_override(const T & t){\n      this->detail_common_oarchive::save_override(t);\n    }\n\n    // include these to trap a change in binary format which\n    // isn't specifically handled\n    BOOST_STATIC_ASSERT(sizeof(tracking_type) == sizeof(bool));\n    // upto 32K classes\n    BOOST_STATIC_ASSERT(sizeof(class_id_type) == sizeof(int_least16_t));\n    BOOST_STATIC_ASSERT(sizeof(class_id_reference_type) == sizeof(int_least16_t));\n    // upto 2G objects\n    BOOST_STATIC_ASSERT(sizeof(object_id_type) == sizeof(uint_least32_t));\n    BOOST_STATIC_ASSERT(sizeof(object_reference_type) == sizeof(uint_least32_t));\n\n    // binary files don't include the optional information\n    void save_override(const class_id_optional_type & /* t */){}\n\n    // enable this if we decide to support generation of previous versions\n    #if 0\n    void save_override(const boost::archive::version_type & t){\n        library_version_type lvt = this->get_library_version();\n        if(boost::serialization::library_version_type(7) < lvt){\n            this->detail_common_oarchive::save_override(t);\n        }\n        else\n        if(boost::serialization::library_version_type(6) < lvt){\n            const boost::uint_least16_t x = t;\n            * this->This() << x;\n        }\n        else{\n            const unsigned int x = t;\n            * this->This() << x;\n        }\n    }\n    void save_override(const boost::serialization::item_version_type & t){\n        library_version_type lvt = this->get_library_version();\n        if(boost::serialization::library_version_type(7) < lvt){\n            this->detail_common_oarchive::save_override(t);\n        }\n        else\n        if(boost::serialization::library_version_type(6) < lvt){\n            const boost::uint_least16_t x = t;\n            * this->This() << x;\n        }\n        else{\n            const unsigned int x = t;\n            * this->This() << x;\n        }\n    }\n\n    void save_override(class_id_type & t){\n        library_version_type lvt = this->get_library_version();\n        if(boost::serialization::library_version_type(7) < lvt){\n            this->detail_common_oarchive::save_override(t);\n        }\n        else\n        if(boost::serialization::library_version_type(6) < lvt){\n            const boost::int_least16_t x = t;\n            * this->This() << x;\n        }\n        else{\n            const int x = t;\n            * this->This() << x;\n        }\n    }\n    void save_override(class_id_reference_type & t){\n        save_override(static_cast<class_id_type &>(t));\n    }\n\n    #endif\n\n    // explicitly convert to char * to avoid compile ambiguities\n    void save_override(const class_name_type & t){\n        const std::string s(t);\n        * this->This() << s;\n    }\n\n    #if 0\n    void save_override(const serialization::collection_size_type & t){\n        if (get_library_version() < boost::serialization::library_version_type(6)){\n            unsigned int x=0;\n            * this->This() >> x;\n            t = serialization::collection_size_type(x);\n        }\n        else{\n            * this->This() >> t;\n        }\n    }\n    #endif\n    BOOST_ARCHIVE_OR_WARCHIVE_DECL void\n    init();\n\n    basic_binary_oarchive(unsigned int flags) :\n        detail::common_oarchive<Archive>(flags)\n    {}\n};\n\n} // namespace archive\n} // namespace boost\n\n#ifdef BOOST_MSVC\n#pragma warning(pop)\n#endif\n\n#include <boost/archive/detail/abi_suffix.hpp> // pops abi_suffix.hpp pragmas\n\n#endif // BOOST_ARCHIVE_BASIC_BINARY_OARCHIVE_HPP\n"
  },
  {
    "path": "include/boost/archive/basic_binary_oprimitive.hpp",
    "content": "#ifndef BOOST_ARCHIVE_BASIC_BINARY_OPRIMITIVE_HPP\n#define BOOST_ARCHIVE_BASIC_BINARY_OPRIMITIVE_HPP\n\n// MS compatible compilers support #pragma once\n#if defined(_MSC_VER)\n# pragma once\n#endif\n\n/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// basic_binary_oprimitive.hpp\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for updates, documentation, and revision history.\n\n// archives stored as native binary - this should be the fastest way\n// to archive the state of a group of objects.  It makes no attempt to\n// convert to any canonical form.\n\n// IN GENERAL, ARCHIVES CREATED WITH THIS CLASS WILL NOT BE READABLE\n// ON PLATFORM APART FROM THE ONE THEY ARE CREATE ON\n\n#include <iosfwd>\n#include <boost/assert.hpp>\n#include <locale>\n#include <streambuf> // basic_streambuf\n#include <string>\n#include <cstddef> // size_t\n\n#include <boost/config.hpp>\n#if defined(BOOST_NO_STDC_NAMESPACE)\nnamespace std{\n    using ::size_t;\n} // namespace std\n#endif\n\n#include <boost/cstdint.hpp>\n#include <boost/integer.hpp>\n#include <boost/integer_traits.hpp>\n#include <boost/scoped_ptr.hpp>\n#include <boost/serialization/throw_exception.hpp>\n\n#include <boost/serialization/is_bitwise_serializable.hpp>\n#include <boost/serialization/array_wrapper.hpp>\n\n#include <boost/archive/basic_streambuf_locale_saver.hpp>\n#include <boost/archive/codecvt_null.hpp>\n#include <boost/archive/archive_exception.hpp>\n#include <boost/archive/detail/auto_link_archive.hpp>\n#include <boost/archive/detail/abi_prefix.hpp> // must be the last header\n\nnamespace boost {\nnamespace archive {\n\n/////////////////////////////////////////////////////////////////////////\n// class basic_binary_oprimitive - binary output of primitives\n\ntemplate<class Archive, class Elem, class Tr>\nclass BOOST_SYMBOL_VISIBLE basic_binary_oprimitive {\n#ifndef BOOST_NO_MEMBER_TEMPLATE_FRIENDS\n    friend class save_access;\nprotected:\n#else\npublic:\n#endif\n    std::basic_streambuf<Elem, Tr> & m_sb;\n    // return a pointer to the most derived class\n    Archive * This(){\n        return static_cast<Archive *>(this);\n    }\n    #ifndef BOOST_NO_STD_LOCALE\n    // note order! - if you change this, libstd++ will fail!\n    // a) create new locale with new codecvt facet\n    // b) save current locale\n    // c) change locale to new one\n    // d) use stream buffer\n    // e) change locale back to original\n    // f) destroy new codecvt facet\n    boost::archive::codecvt_null<Elem> codecvt_null_facet;\n    basic_streambuf_locale_saver<Elem, Tr> locale_saver;\n    std::locale archive_locale;\n    #endif\n    // default saving of primitives.\n    template<class T>\n    void save(const T & t)\n    {\n        save_binary(& t, sizeof(T));\n    }\n\n    /////////////////////////////////////////////////////////\n    // fundamental types that need special treatment\n\n    // trap usage of invalid uninitialized boolean which would\n    // otherwise crash on load.\n    void save(const bool t){\n        BOOST_ASSERT(0 == static_cast<int>(t) || 1 == static_cast<int>(t));\n        save_binary(& t, sizeof(t));\n    }\n    BOOST_ARCHIVE_OR_WARCHIVE_DECL void\n    save(const std::string &s);\n    #ifndef BOOST_NO_STD_WSTRING\n    BOOST_ARCHIVE_OR_WARCHIVE_DECL void\n    save(const std::wstring &ws);\n    #endif\n    BOOST_ARCHIVE_OR_WARCHIVE_DECL void\n    save(const char * t);\n    BOOST_ARCHIVE_OR_WARCHIVE_DECL void\n    save(const wchar_t * t);\n\n    BOOST_ARCHIVE_OR_WARCHIVE_DECL void\n    init();\n\n    BOOST_ARCHIVE_OR_WARCHIVE_DECL\n    basic_binary_oprimitive(\n        std::basic_streambuf<Elem, Tr> & sb,\n        bool no_codecvt\n    );\n    BOOST_ARCHIVE_OR_WARCHIVE_DECL\n    ~basic_binary_oprimitive();\npublic:\n\n    // we provide an optimized save for all fundamental types\n    // typedef serialization::is_bitwise_serializable<mpl::_1>\n    // use_array_optimization;\n    // workaround without using mpl lambdas\n    struct use_array_optimization {\n        template <class T>\n        #if defined(BOOST_NO_DEPENDENT_NESTED_DERIVATIONS)\n            struct apply {\n                typedef typename boost::serialization::is_bitwise_serializable< T >::type type;\n            };\n        #else\n            struct apply : public boost::serialization::is_bitwise_serializable< T > {};\n        #endif\n    };\n\n    // the optimized save_array dispatches to save_binary\n    template <class ValueType>\n    void save_array(boost::serialization::array_wrapper<ValueType> const& a, unsigned int)\n    {\n      save_binary(a.address(),a.count()*sizeof(ValueType));\n    }\n\n    void save_binary(const void *address, std::size_t count);\n};\n\ntemplate<class Archive, class Elem, class Tr>\ninline void\nbasic_binary_oprimitive<Archive, Elem, Tr>::save_binary(\n    const void *address,\n    std::size_t count\n){\n    // BOOST_ASSERT(count <= std::size_t(boost::integer_traits<std::streamsize>::const_max));\n    // note: if the following assertions fail\n    // a likely cause is that the output stream is set to \"text\"\n    // mode where by cr characters receive special treatment.\n    // be sure that the output stream is opened with ios::binary\n    //if(os.fail())\n    //    boost::serialization::throw_exception(\n    //        archive_exception(archive_exception::output_stream_error)\n    //    );\n    // figure number of elements to output - round up\n    count = ( count + sizeof(Elem) - 1) / sizeof(Elem);\n    std::streamsize scount = m_sb.sputn(\n        static_cast<const Elem *>(address),\n        static_cast<std::streamsize>(count)\n    );\n    if(count != static_cast<std::size_t>(scount))\n        boost::serialization::throw_exception(\n            archive_exception(archive_exception::output_stream_error)\n        );\n    //os.write(\n    //    static_cast<const typename OStream::char_type *>(address),\n    //    count\n    //);\n    //BOOST_ASSERT(os.good());\n}\n\n} //namespace boost\n} //namespace archive\n\n#include <boost/archive/detail/abi_suffix.hpp> // pop pragmas\n\n#endif // BOOST_ARCHIVE_BASIC_BINARY_OPRIMITIVE_HPP\n"
  },
  {
    "path": "include/boost/archive/basic_streambuf_locale_saver.hpp",
    "content": "#ifndef BOOST_ARCHIVE_BASIC_STREAMBUF_LOCALE_SAVER_HPP\n#define BOOST_ARCHIVE_BASIC_STREAMBUF_LOCALE_SAVER_HPP\n\n// MS compatible compilers support #pragma once\n#if defined(_MSC_VER)\n# pragma once\n#endif\n\n/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// basic_streambuf_locale_saver.hpp\n\n// (C) Copyright 2005 Robert Ramey - http://www.rrsd.com\n\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for updates, documentation, and revision history.\n\n// note derived from boost/io/ios_state.hpp\n// Copyright 2002, 2005 Daryle Walker.  Use, modification, and distribution\n// are subject to the Boost Software License, Version 1.0.  (See accompanying\n// file LICENSE_1_0.txt or a copy at <http://www.boost.org/LICENSE_1_0.txt>.)\n\n//  See <http://www.boost.org/libs/io/> for the library's home page.\n\n#ifndef BOOST_NO_STD_LOCALE\n\n#include <locale>     // for std::locale\n#include <ios>\n#include <streambuf>  // for std::basic_streambuf\n\n#include <boost/config.hpp>\n#include <boost/noncopyable.hpp>\n\n#ifdef BOOST_MSVC\n#  pragma warning(push)\n#  pragma warning(disable : 4511 4512)\n#endif\n\nnamespace boost{\nnamespace archive{\n\ntemplate < typename Ch, class Tr >\nclass basic_streambuf_locale_saver :\n    private boost::noncopyable\n{\npublic:\n    explicit basic_streambuf_locale_saver(std::basic_streambuf<Ch, Tr> &s) :\n        m_streambuf(s),\n        m_locale(s.getloc())\n    {}\n    ~basic_streambuf_locale_saver(){\n        m_streambuf.pubsync();\n        m_streambuf.pubimbue(m_locale);\n    }\nprivate:\n    std::basic_streambuf<Ch, Tr> &       m_streambuf;\n    std::locale const  m_locale;\n};\n\ntemplate < typename Ch, class Tr >\nclass basic_istream_locale_saver :\n    private boost::noncopyable\n{\npublic:\n    explicit basic_istream_locale_saver(std::basic_istream<Ch, Tr> &s) :\n        m_istream(s),\n        m_locale(s.getloc())\n    {}\n    ~basic_istream_locale_saver(){\n        // libstdc++ crashes without this\n        m_istream.sync();\n        m_istream.imbue(m_locale);\n    }\nprivate:\n    std::basic_istream<Ch, Tr> & m_istream;\n    std::locale const  m_locale;\n};\n\ntemplate < typename Ch, class Tr >\nclass basic_ostream_locale_saver :\n    private boost::noncopyable\n{\npublic:\n    explicit basic_ostream_locale_saver(std::basic_ostream<Ch, Tr> &s) :\n        m_ostream(s),\n        m_locale(s.getloc())\n    {}\n    ~basic_ostream_locale_saver(){\n        m_ostream.flush();\n        m_ostream.imbue(m_locale);\n    }\nprivate:\n    std::basic_ostream<Ch, Tr> & m_ostream;\n    std::locale const  m_locale;\n};\n\n\n} // archive\n} // boost\n\n#ifdef BOOST_MSVC\n#pragma warning(pop)\n#endif\n\n#endif // BOOST_NO_STD_LOCALE\n#endif // BOOST_ARCHIVE_BASIC_STREAMBUF_LOCALE_SAVER_HPP\n"
  },
  {
    "path": "include/boost/archive/basic_text_iarchive.hpp",
    "content": "#ifndef BOOST_ARCHIVE_BASIC_TEXT_IARCHIVE_HPP\n#define BOOST_ARCHIVE_BASIC_TEXT_IARCHIVE_HPP\n\n// MS compatible compilers support #pragma once\n#if defined(_MSC_VER)\n# pragma once\n#endif\n\n/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// basic_text_iarchive.hpp\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for updates, documentation, and revision history.\n\n// archives stored as text - note these ar templated on the basic\n// stream templates to accommodate wide (and other?) kind of characters\n//\n// note the fact that on libraries without wide characters, ostream is\n// is not a specialization of basic_ostream which in fact is not defined\n// in such cases.   So we can't use basic_istream<IStream::char_type> but rather\n// use two template parameters\n\n#include <boost/config.hpp>\n#include <boost/detail/workaround.hpp>\n\n#include <boost/archive/detail/common_iarchive.hpp>\n\n#include <boost/archive/detail/abi_prefix.hpp> // must be the last header\n\n#ifdef BOOST_MSVC\n#  pragma warning(push)\n#  pragma warning(disable : 4511 4512)\n#endif\n\nnamespace boost {\nnamespace archive {\n\nnamespace detail {\n    template<class Archive> class interface_iarchive;\n} // namespace detail\n\n/////////////////////////////////////////////////////////////////////////\n// class basic_text_iarchive - read serialized objects from a input text stream\ntemplate<class Archive>\nclass BOOST_SYMBOL_VISIBLE basic_text_iarchive :\n    public detail::common_iarchive<Archive>\n{\n#ifdef BOOST_NO_MEMBER_TEMPLATE_FRIENDS\npublic:\n#else\nprotected:\n    #if BOOST_WORKAROUND(BOOST_MSVC, < 1500)\n        // for some inexplicable reason insertion of \"class\" generates compile error\n        // on msvc 7.1\n        friend detail::interface_iarchive<Archive>;\n    #else\n        friend class detail::interface_iarchive<Archive>;\n    #endif\n#endif\n    // intermediate level to support override of operators\n    // fot templates in the absence of partial function\n    // template ordering\n    typedef detail::common_iarchive<Archive> detail_common_iarchive;\n    template<class T>\n    void load_override(T & t){\n        this->detail_common_iarchive::load_override(t);\n    }\n    // text file don't include the optional information\n    void load_override(class_id_optional_type & /*t*/){}\n\n    BOOST_ARCHIVE_OR_WARCHIVE_DECL void\n    load_override(class_name_type & t);\n\n    BOOST_ARCHIVE_OR_WARCHIVE_DECL void\n    init();\n\n    basic_text_iarchive(unsigned int flags) :\n        detail::common_iarchive<Archive>(flags)\n    {}\n    ~basic_text_iarchive() BOOST_OVERRIDE {}\n};\n\n} // namespace archive\n} // namespace boost\n\n#ifdef BOOST_MSVC\n#pragma warning(pop)\n#endif\n\n#include <boost/archive/detail/abi_suffix.hpp> // pops abi_suffix.hpp pragmas\n\n#endif // BOOST_ARCHIVE_BASIC_TEXT_IARCHIVE_HPP\n"
  },
  {
    "path": "include/boost/archive/basic_text_iprimitive.hpp",
    "content": "#ifndef BOOST_ARCHIVE_BASIC_TEXT_IPRIMITIVE_HPP\n#define BOOST_ARCHIVE_BASIC_TEXT_IPRIMITIVE_HPP\n\n// MS compatible compilers support #pragma once\n#if defined(_MSC_VER)\n# pragma once\n#endif\n\n/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// basic_text_iprimitive.hpp\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for updates, documentation, and revision history.\n\n// archives stored as text - note these are templated on the basic\n// stream templates to accommodate wide (and other?) kind of characters\n//\n// Note the fact that on libraries without wide characters, ostream is\n// not a specialization of basic_ostream which in fact is not defined\n// in such cases.   So we can't use basic_ostream<IStream::char_type> but rather\n// use two template parameters\n\n#include <locale>\n#include <cstddef> // size_t\n\n#include <boost/config.hpp>\n#if defined(BOOST_NO_STDC_NAMESPACE)\nnamespace std{\n    using ::size_t;\n    #if ! defined(BOOST_DINKUMWARE_STDLIB) && ! defined(__SGI_STL_PORT)\n        using ::locale;\n    #endif\n} // namespace std\n#endif\n\n#include <boost/io/ios_state.hpp>\n#include <boost/static_assert.hpp>\n\n#include <boost/detail/workaround.hpp>\n#if BOOST_WORKAROUND(BOOST_DINKUMWARE_STDLIB, == 1)\n#include <boost/archive/dinkumware.hpp>\n#endif\n#include <boost/serialization/throw_exception.hpp>\n#include <boost/archive/codecvt_null.hpp>\n#include <boost/archive/archive_exception.hpp>\n#include <boost/archive/basic_streambuf_locale_saver.hpp>\n#include <boost/archive/detail/abi_prefix.hpp> // must be the last header\n\nnamespace boost {\nnamespace archive {\n\n/////////////////////////////////////////////////////////////////////////\n// class basic_text_iarchive - load serialized objects from a input text stream\n#if defined(_MSC_VER)\n#pragma warning( push )\n#pragma warning( disable : 4244 4267 )\n#endif\n\ntemplate<class IStream>\nclass BOOST_SYMBOL_VISIBLE basic_text_iprimitive {\nprotected:\n    IStream &is;\n    io::ios_flags_saver flags_saver;\n    io::ios_precision_saver precision_saver;\n\n    #ifndef BOOST_NO_STD_LOCALE\n    // note order! - if you change this, libstd++ will fail!\n    // a) create new locale with new codecvt facet\n    // b) save current locale\n    // c) change locale to new one\n    // d) use stream buffer\n    // e) change locale back to original\n    // f) destroy new codecvt facet\n    boost::archive::codecvt_null<typename IStream::char_type> codecvt_null_facet;\n    std::locale archive_locale;\n    basic_istream_locale_saver<\n        typename IStream::char_type,\n        typename IStream::traits_type\n    > locale_saver;\n    #endif\n\n    template<class T>\n    void load(T & t)\n    {\n        if(is >> t)\n            return;\n        boost::serialization::throw_exception(\n            archive_exception(archive_exception::input_stream_error)\n        );\n    }\n\n    void load(char & t)\n    {\n        short int i;\n        load(i);\n        t = i;\n    }\n    void load(signed char & t)\n    {\n        short int i;\n        load(i);\n        t = i;\n    }\n    void load(unsigned char & t)\n    {\n        unsigned short int i;\n        load(i);\n        t = i;\n    }\n\n    #ifndef BOOST_NO_INTRINSIC_WCHAR_T\n    void load(wchar_t & t)\n    {\n        BOOST_STATIC_ASSERT(sizeof(wchar_t) <= sizeof(int));\n        int i;\n        load(i);\n        t = i;\n    }\n    #endif\n    BOOST_ARCHIVE_OR_WARCHIVE_DECL\n    basic_text_iprimitive(IStream  &is, bool no_codecvt);\n    BOOST_ARCHIVE_OR_WARCHIVE_DECL\n    ~basic_text_iprimitive();\npublic:\n    BOOST_ARCHIVE_OR_WARCHIVE_DECL void\n    load_binary(void *address, std::size_t count);\n};\n\n#if defined(_MSC_VER)\n#pragma warning( pop )\n#endif\n\n} // namespace archive\n} // namespace boost\n\n#include <boost/archive/detail/abi_suffix.hpp> // pop pragmas\n\n#endif // BOOST_ARCHIVE_BASIC_TEXT_IPRIMITIVE_HPP\n"
  },
  {
    "path": "include/boost/archive/basic_text_oarchive.hpp",
    "content": "#ifndef BOOST_ARCHIVE_BASIC_TEXT_OARCHIVE_HPP\n#define BOOST_ARCHIVE_BASIC_TEXT_OARCHIVE_HPP\n\n// MS compatible compilers support #pragma once\n#if defined(_MSC_VER)\n# pragma once\n#endif\n\n/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// basic_text_oarchive.hpp\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for updates, documentation, and revision history.\n\n// archives stored as text - note these ar templated on the basic\n// stream templates to accommodate wide (and other?) kind of characters\n//\n// note the fact that on libraries without wide characters, ostream is\n// is not a specialization of basic_ostream which in fact is not defined\n// in such cases.   So we can't use basic_ostream<OStream::char_type> but rather\n// use two template parameters\n\n#include <boost/config.hpp>\n#include <boost/detail/workaround.hpp>\n#include <boost/archive/detail/common_oarchive.hpp>\n#include <boost/serialization/string.hpp>\n\n#include <boost/archive/detail/abi_prefix.hpp> // must be the last header\n\n#ifdef BOOST_MSVC\n#  pragma warning(push)\n#  pragma warning(disable : 4511 4512)\n#endif\n\nnamespace boost {\nnamespace archive {\n\nnamespace detail {\n    template<class Archive> class interface_oarchive;\n} // namespace detail\n\n/////////////////////////////////////////////////////////////////////////\n// class basic_text_oarchive\ntemplate<class Archive>\nclass BOOST_SYMBOL_VISIBLE basic_text_oarchive :\n    public detail::common_oarchive<Archive>\n{\n#ifdef BOOST_NO_MEMBER_TEMPLATE_FRIENDS\npublic:\n#else\nprotected:\n    #if BOOST_WORKAROUND(BOOST_MSVC, < 1500)\n        // for some inexplicable reason insertion of \"class\" generates compile erro\n        // on msvc 7.1\n        friend detail::interface_oarchive<Archive>;\n    #else\n        friend class detail::interface_oarchive<Archive>;\n    #endif\n#endif\n\n    enum {\n        none,\n        eol,\n        space\n    } delimiter;\n\n    BOOST_ARCHIVE_OR_WARCHIVE_DECL void\n    newtoken();\n\n    void newline(){\n        delimiter = eol;\n    }\n\n    // default processing - kick back to base class.  Note the\n    // extra stuff to get it passed borland compilers\n    typedef detail::common_oarchive<Archive> detail_common_oarchive;\n    template<class T>\n    void save_override(T & t){\n        this->detail_common_oarchive::save_override(t);\n    }\n\n    // start new objects on a new line\n    void save_override(const object_id_type & t){\n        this->This()->newline();\n        this->detail_common_oarchive::save_override(t);\n    }\n\n    // text file don't include the optional information\n    void save_override(const class_id_optional_type & /* t */){}\n\n    void save_override(const class_name_type & t){\n        const std::string s(t);\n        * this->This() << s;\n    }\n\n    BOOST_ARCHIVE_OR_WARCHIVE_DECL void\n    init();\n\n    basic_text_oarchive(unsigned int flags) :\n        detail::common_oarchive<Archive>(flags),\n        delimiter(none)\n    {}\n    ~basic_text_oarchive() BOOST_OVERRIDE {}\n};\n\n} // namespace archive\n} // namespace boost\n\n#ifdef BOOST_MSVC\n#pragma warning(pop)\n#endif\n\n#include <boost/archive/detail/abi_suffix.hpp> // pops abi_suffix.hpp pragmas\n\n#endif // BOOST_ARCHIVE_BASIC_TEXT_OARCHIVE_HPP\n"
  },
  {
    "path": "include/boost/archive/basic_text_oprimitive.hpp",
    "content": "#ifndef BOOST_ARCHIVE_BASIC_TEXT_OPRIMITIVE_HPP\n#define BOOST_ARCHIVE_BASIC_TEXT_OPRIMITIVE_HPP\n\n// MS compatible compilers support #pragma once\n#if defined(_MSC_VER)\n# pragma once\n#endif\n\n/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// basic_text_oprimitive.hpp\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for updates, documentation, and revision history.\n\n// archives stored as text - note these ar templated on the basic\n// stream templates to accommodate wide (and other?) kind of characters\n//\n// note the fact that on libraries without wide characters, ostream is\n// is not a specialization of basic_ostream which in fact is not defined\n// in such cases.   So we can't use basic_ostream<OStream::char_type> but rather\n// use two template parameters\n\n#include <iomanip>\n#include <locale>\n#include <cstddef> // size_t\n\n#include <boost/config.hpp>\n#include <boost/static_assert.hpp>\n#include <boost/io/ios_state.hpp>\n\n#include <boost/detail/workaround.hpp>\n#if BOOST_WORKAROUND(BOOST_DINKUMWARE_STDLIB, == 1)\n#include <boost/archive/dinkumware.hpp>\n#endif\n\n#if defined(BOOST_NO_STDC_NAMESPACE)\nnamespace std{\n    using ::size_t;\n    #if ! defined(BOOST_DINKUMWARE_STDLIB) && ! defined(__SGI_STL_PORT)\n        using ::locale;\n    #endif\n} // namespace std\n#endif\n\n#include <boost/type_traits/is_floating_point.hpp>\n#include <boost/mpl/bool.hpp>\n#include <boost/limits.hpp>\n#include <boost/integer.hpp>\n#include <boost/io/ios_state.hpp>\n#include <boost/serialization/throw_exception.hpp>\n#include <boost/archive/basic_streambuf_locale_saver.hpp>\n#include <boost/archive/codecvt_null.hpp>\n#include <boost/archive/archive_exception.hpp>\n#include <boost/archive/detail/abi_prefix.hpp> // must be the last header\n\nnamespace boost {\nnamespace archive {\n\n/////////////////////////////////////////////////////////////////////////\n// class basic_text_oprimitive - output of primitives to stream\ntemplate<class OStream>\nclass BOOST_SYMBOL_VISIBLE basic_text_oprimitive\n{\nprotected:\n    OStream &os;\n    io::ios_flags_saver flags_saver;\n    io::ios_precision_saver precision_saver;\n\n    #ifndef BOOST_NO_STD_LOCALE\n    // note order! - if you change this, libstd++ will fail!\n    // a) create new locale with new codecvt facet\n    // b) save current locale\n    // c) change locale to new one\n    // d) use stream buffer\n    // e) change locale back to original\n    // f) destroy new codecvt facet\n    boost::archive::codecvt_null<typename OStream::char_type> codecvt_null_facet;\n    std::locale archive_locale;\n    basic_ostream_locale_saver<\n        typename OStream::char_type,\n        typename OStream::traits_type\n    > locale_saver;\n    #endif\n\n    /////////////////////////////////////////////////////////\n    // fundamental types that need special treatment\n    void save(const bool t){\n        // trap usage of invalid uninitialized boolean which would\n        // otherwise crash on load.\n        BOOST_ASSERT(0 == static_cast<int>(t) || 1 == static_cast<int>(t));\n        if(os.fail())\n            boost::serialization::throw_exception(\n                archive_exception(archive_exception::output_stream_error)\n            );\n        os << t;\n    }\n    void save(const signed char t)\n    {\n        save(static_cast<short int>(t));\n    }\n    void save(const unsigned char t)\n    {\n        save(static_cast<short unsigned int>(t));\n    }\n    void save(const char t)\n    {\n        save(static_cast<short int>(t));\n    }\n    #ifndef BOOST_NO_INTRINSIC_WCHAR_T\n    void save(const wchar_t t)\n    {\n        BOOST_STATIC_ASSERT(sizeof(wchar_t) <= sizeof(int));\n        save(static_cast<int>(t));\n    }\n    #endif\n\n    /////////////////////////////////////////////////////////\n    // saving of any types not listed above\n\n    template<class T>\n    void save_impl(const T &t, boost::mpl::bool_<false> &){\n        if(os.fail())\n            boost::serialization::throw_exception(\n                archive_exception(archive_exception::output_stream_error)\n            );\n        os << t;\n    }\n\n    /////////////////////////////////////////////////////////\n    // floating point types need even more special treatment\n    // the following determines whether the type T is some sort\n    // of floating point type.  Note that we then assume that\n    // the stream << operator is defined on that type - if not\n    // we'll get a compile time error. This is meant to automatically\n    // support synthesized types which support floating point\n    // operations. Also it should handle compiler dependent types\n    // such long double.  Due to John Maddock.\n\n    template<class T>\n    struct is_float {\n        typedef typename mpl::bool_<\n            boost::is_floating_point<T>::value\n            || (std::numeric_limits<T>::is_specialized\n            && !std::numeric_limits<T>::is_integer\n            && !std::numeric_limits<T>::is_exact\n            && std::numeric_limits<T>::max_exponent)\n        >::type type;\n    };\n\n    template<class T>\n    void save_impl(const T &t, boost::mpl::bool_<true> &){\n        // must be a user mistake - can't serialize un-initialized data\n        if(os.fail()){\n            boost::serialization::throw_exception(\n                archive_exception(archive_exception::output_stream_error)\n            );\n        }\n        // The formulae for the number of decimal digits required is given in\n        // http://www2.open-std.org/JTC1/SC22/WG21/docs/papers/2005/n1822.pdf\n        // which is derived from Kahan's paper:\n        // www.eecs.berkeley.edu/~wkahan/ieee754status/ieee754.ps\n        // const unsigned int digits = (std::numeric_limits<T>::digits * 3010) / 10000;\n        // note: I've commented out the above because I didn't get good results.  e.g.\n        // in one case I got a difference of 19 units.\n        const unsigned int digits =\n        #ifndef BOOST_NO_CXX11_NUMERIC_LIMITS\n            std::numeric_limits<T>::max_digits10;\n        #else\n            std::numeric_limits<T>::digits10 + 2;\n        #endif\n        os << std::setprecision(digits) << std::scientific << t;\n    }\n\n    template<class T>\n    void save(const T & t){\n        typename is_float<T>::type tf;\n        save_impl(t, tf);\n    }\n\n    BOOST_ARCHIVE_OR_WARCHIVE_DECL\n    basic_text_oprimitive(OStream & os, bool no_codecvt);\n    BOOST_ARCHIVE_OR_WARCHIVE_DECL\n    ~basic_text_oprimitive();\npublic:\n    // unformatted append of one character\n    void put(typename OStream::char_type c){\n        if(os.fail())\n            boost::serialization::throw_exception(\n                archive_exception(archive_exception::output_stream_error)\n            );\n        os.put(c);\n    }\n    // unformatted append of null terminated string\n    void put(const char * s){\n        while('\\0' != *s)\n            os.put(*s++);\n    }\n    BOOST_ARCHIVE_OR_WARCHIVE_DECL void\n    save_binary(const void *address, std::size_t count);\n};\n\n} //namespace boost\n} //namespace archive\n\n#include <boost/archive/detail/abi_suffix.hpp> // pops abi_suffix.hpp pragmas\n\n#endif // BOOST_ARCHIVE_BASIC_TEXT_OPRIMITIVE_HPP\n"
  },
  {
    "path": "include/boost/archive/basic_xml_archive.hpp",
    "content": "#ifndef BOOST_ARCHIVE_BASIC_XML_TEXT_ARCHIVE_HPP\n#define BOOST_ARCHIVE_BASIC_XML_TEXT_ARCHIVE_HPP\n\n// MS compatible compilers support #pragma once\n#if defined(_MSC_VER)\n# pragma once\n#endif\n\n/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// basic_xml_archive.hpp:\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for updates, documentation, and revision history.\n\n#include <boost/archive/archive_exception.hpp>\n\n#include <boost/archive/detail/auto_link_archive.hpp>\n#include <boost/archive/detail/abi_prefix.hpp> // must be the last header\n\nnamespace boost {\nnamespace archive {\n\n// constant strings used in xml i/o\n\nextern\nBOOST_ARCHIVE_DECL const char *\nBOOST_ARCHIVE_XML_OBJECT_ID();\n\nextern\nBOOST_ARCHIVE_DECL const char *\nBOOST_ARCHIVE_XML_OBJECT_REFERENCE();\n\nextern\nBOOST_ARCHIVE_DECL const char *\nBOOST_ARCHIVE_XML_CLASS_ID();\n\nextern\nBOOST_ARCHIVE_DECL const char *\nBOOST_ARCHIVE_XML_CLASS_ID_REFERENCE();\n\nextern\nBOOST_ARCHIVE_DECL const char *\nBOOST_ARCHIVE_XML_CLASS_NAME();\n\nextern\nBOOST_ARCHIVE_DECL const char *\nBOOST_ARCHIVE_XML_TRACKING();\n\nextern\nBOOST_ARCHIVE_DECL const char *\nBOOST_ARCHIVE_XML_VERSION();\n\nextern\nBOOST_ARCHIVE_DECL const char *\nBOOST_ARCHIVE_XML_SIGNATURE();\n\n}// namespace archive\n}// namespace boost\n\n#include <boost/archive/detail/abi_suffix.hpp> // pops abi_suffix.hpp pragmas\n\n#endif // BOOST_ARCHIVE_BASIC_XML_TEXT_ARCHIVE_HPP\n\n"
  },
  {
    "path": "include/boost/archive/basic_xml_iarchive.hpp",
    "content": "#ifndef BOOST_ARCHIVE_BASIC_XML_IARCHIVE_HPP\n#define BOOST_ARCHIVE_BASIC_XML_IARCHIVE_HPP\n\n// MS compatible compilers support #pragma once\n#if defined(_MSC_VER)\n# pragma once\n#endif\n\n/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// basic_xml_iarchive.hpp\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for updates, documentation, and revision history.\n\n#include <boost/config.hpp>\n#include <boost/mpl/assert.hpp>\n\n#include <boost/archive/detail/common_iarchive.hpp>\n#include <boost/serialization/nvp.hpp>\n#include <boost/serialization/string.hpp>\n\n#include <boost/archive/detail/abi_prefix.hpp> // must be the last header\n\n#ifdef BOOST_MSVC\n#  pragma warning(push)\n#  pragma warning(disable : 4511 4512)\n#endif\n\nnamespace boost {\nnamespace archive {\n\nnamespace detail {\n    template<class Archive> class interface_iarchive;\n} // namespace detail\n\n/////////////////////////////////////////////////////////////////////////\n// class basic_xml_iarchive - read serialized objects from a input text stream\ntemplate<class Archive>\nclass BOOST_SYMBOL_VISIBLE basic_xml_iarchive :\n    public detail::common_iarchive<Archive>\n{\n    unsigned int depth;\n#ifdef BOOST_NO_MEMBER_TEMPLATE_FRIENDS\npublic:\n#else\nprotected:\n    friend class detail::interface_iarchive<Archive>;\n#endif\n    BOOST_ARCHIVE_OR_WARCHIVE_DECL void\n    load_start(const char *name);\n    BOOST_ARCHIVE_OR_WARCHIVE_DECL void\n    load_end(const char *name);\n\n    // Anything not an attribute and not a name-value pair is an\n    // should be trapped here.\n    template<class T>\n    void load_override(T & t)\n    {\n        // If your program fails to compile here, its most likely due to\n        // not specifying an nvp wrapper around the variable to\n        // be serialized.\n        BOOST_MPL_ASSERT((serialization::is_wrapper< T >));\n        this->detail_common_iarchive::load_override(t);\n    }\n\n    // Anything not an attribute - see below - should be a name value\n    // pair and be processed here\n    typedef detail::common_iarchive<Archive> detail_common_iarchive;\n    template<class T>\n    void load_override(\n        const boost::serialization::nvp< T > & t\n    ){\n        this->This()->load_start(t.name());\n        this->detail_common_iarchive::load_override(t.value());\n        this->This()->load_end(t.name());\n    }\n\n    // specific overrides for attributes - handle as\n    // primitives. These are not name-value pairs\n    // so they have to be intercepted here and passed on to load.\n    // although the class_id is included in the xml text file in order\n    // to make the file self describing, it isn't used when loading\n    // an xml archive.  So we can skip it here.  Note: we MUST override\n    // it otherwise it will be loaded as a normal primitive w/o tag and\n    // leaving the archive in an undetermined state\n    BOOST_ARCHIVE_OR_WARCHIVE_DECL void\n    load_override(class_id_type & t);\n    void load_override(class_id_optional_type & /* t */){}\n    BOOST_ARCHIVE_OR_WARCHIVE_DECL void\n    load_override(object_id_type & t);\n    BOOST_ARCHIVE_OR_WARCHIVE_DECL void\n    load_override(version_type & t);\n    BOOST_ARCHIVE_OR_WARCHIVE_DECL void\n    load_override(tracking_type & t);\n    // class_name_type can't be handled here as it depends upon the\n    // char type used by the stream.  So require the derived implementation\n    // handle this.\n    // void load_override(class_name_type & t);\n\n    BOOST_ARCHIVE_OR_WARCHIVE_DECL\n    basic_xml_iarchive(unsigned int flags);\n    BOOST_ARCHIVE_OR_WARCHIVE_DECL\n    ~basic_xml_iarchive() BOOST_OVERRIDE;\n};\n\n} // namespace archive\n} // namespace boost\n\n#ifdef BOOST_MSVC\n#pragma warning(pop)\n#endif\n\n#include <boost/archive/detail/abi_suffix.hpp> // pops abi_suffix.hpp pragmas\n\n#endif // BOOST_ARCHIVE_BASIC_XML_IARCHIVE_HPP\n"
  },
  {
    "path": "include/boost/archive/basic_xml_oarchive.hpp",
    "content": "#ifndef BOOST_ARCHIVE_BASIC_XML_OARCHIVE_HPP\n#define BOOST_ARCHIVE_BASIC_XML_OARCHIVE_HPP\n\n// MS compatible compilers support #pragma once\n#if defined(_MSC_VER)\n# pragma once\n#endif\n\n/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// basic_xml_oarchive.hpp\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for updates, documentation, and revision history.\n\n#include <boost/config.hpp>\n#include <boost/mpl/assert.hpp>\n\n#include <boost/archive/detail/common_oarchive.hpp>\n#include <boost/serialization/nvp.hpp>\n#include <boost/serialization/string.hpp>\n\n#include <boost/archive/detail/abi_prefix.hpp> // must be the last header\n\n#ifdef BOOST_MSVC\n#  pragma warning(push)\n#  pragma warning(disable : 4511 4512)\n#endif\n\nnamespace boost {\nnamespace archive {\n\nnamespace detail {\n    template<class Archive> class interface_oarchive;\n} // namespace detail\n\n//////////////////////////////////////////////////////////////////////\n// class basic_xml_oarchive - write serialized objects to a xml output stream\ntemplate<class Archive>\nclass BOOST_SYMBOL_VISIBLE basic_xml_oarchive :\n    public detail::common_oarchive<Archive>\n{\n    // special stuff for xml output\n    unsigned int depth;\n    bool pending_preamble;\n#ifdef BOOST_NO_MEMBER_TEMPLATE_FRIENDS\npublic:\n#else\nprotected:\n    friend class detail::interface_oarchive<Archive>;\n#endif\n    bool indent_next;\n    BOOST_ARCHIVE_OR_WARCHIVE_DECL void\n    indent();\n    BOOST_ARCHIVE_OR_WARCHIVE_DECL void\n    init();\n    BOOST_ARCHIVE_OR_WARCHIVE_DECL void\n    windup();\n    BOOST_ARCHIVE_OR_WARCHIVE_DECL void\n    write_attribute(\n        const char *attribute_name,\n        int t,\n        const char *conjunction = \"=\\\"\"\n    );\n    BOOST_ARCHIVE_OR_WARCHIVE_DECL void\n    write_attribute(\n        const char *attribute_name,\n        const char *key\n    );\n    // helpers used below\n    BOOST_ARCHIVE_OR_WARCHIVE_DECL void\n    save_start(const char *name);\n    BOOST_ARCHIVE_OR_WARCHIVE_DECL void\n    save_end(const char *name);\n    BOOST_ARCHIVE_OR_WARCHIVE_DECL void\n    end_preamble();\n\n    // Anything not an attribute and not a name-value pair is an\n    // error and should be trapped here.\n    template<class T>\n    void save_override(T & t)\n    {\n        // If your program fails to compile here, its most likely due to\n        // not specifying an nvp wrapper around the variable to\n        // be serialized.\n        BOOST_MPL_ASSERT((serialization::is_wrapper< T >));\n        this->detail_common_oarchive::save_override(t);\n    }\n\n    // special treatment for name-value pairs.\n    typedef detail::common_oarchive<Archive> detail_common_oarchive;\n    template<class T>\n    void save_override(\n        const ::boost::serialization::nvp< T > & t\n    ){\n        this->This()->save_start(t.name());\n        this->detail_common_oarchive::save_override(t.const_value());\n        this->This()->save_end(t.name());\n    }\n\n    // specific overrides for attributes - not name value pairs so we\n    // want to trap them before the above \"fall through\"\n    BOOST_ARCHIVE_OR_WARCHIVE_DECL void\n    save_override(const class_id_type & t);\n    BOOST_ARCHIVE_OR_WARCHIVE_DECL void\n    save_override(const class_id_optional_type & t);\n    BOOST_ARCHIVE_OR_WARCHIVE_DECL void\n    save_override(const class_id_reference_type & t);\n    BOOST_ARCHIVE_OR_WARCHIVE_DECL void\n    save_override(const object_id_type & t);\n    BOOST_ARCHIVE_OR_WARCHIVE_DECL void\n    save_override(const object_reference_type & t);\n    BOOST_ARCHIVE_OR_WARCHIVE_DECL void\n    save_override(const version_type & t);\n    BOOST_ARCHIVE_OR_WARCHIVE_DECL void\n    save_override(const class_name_type & t);\n    BOOST_ARCHIVE_OR_WARCHIVE_DECL void\n    save_override(const tracking_type & t);\n\n    BOOST_ARCHIVE_OR_WARCHIVE_DECL\n    basic_xml_oarchive(unsigned int flags);\n    BOOST_ARCHIVE_OR_WARCHIVE_DECL\n    ~basic_xml_oarchive() BOOST_OVERRIDE;\n};\n\n} // namespace archive\n} // namespace boost\n\n#ifdef BOOST_MSVC\n#pragma warning(pop)\n#endif\n\n#include <boost/archive/detail/abi_suffix.hpp> // pops abi_suffix.hpp pragmas\n\n#endif // BOOST_ARCHIVE_BASIC_XML_OARCHIVE_HPP\n"
  },
  {
    "path": "include/boost/archive/binary_iarchive.hpp",
    "content": "#ifndef BOOST_ARCHIVE_BINARY_IARCHIVE_HPP\n#define BOOST_ARCHIVE_BINARY_IARCHIVE_HPP\n\n// MS compatible compilers support #pragma once\n#if defined(_MSC_VER)\n# pragma once\n#endif\n\n/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// binary_iarchive.hpp\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for updates, documentation, and revision history.\n\n#include <istream>\n#include <boost/archive/binary_iarchive_impl.hpp>\n#include <boost/archive/detail/register_archive.hpp>\n\n#ifdef BOOST_MSVC\n#  pragma warning(push)\n#  pragma warning(disable : 4511 4512)\n#endif\n\nnamespace boost {\nnamespace archive {\n\n// do not derive from this class.  If you want to extend this functionality\n// via inheritance, derived from binary_iarchive_impl instead.  This will\n// preserve correct static polymorphism.\nclass BOOST_SYMBOL_VISIBLE binary_iarchive :\n    public binary_iarchive_impl<\n        boost::archive::binary_iarchive,\n        std::istream::char_type,\n        std::istream::traits_type\n    >{\npublic:\n    binary_iarchive(std::istream & is, unsigned int flags = 0) :\n        binary_iarchive_impl<\n            binary_iarchive, std::istream::char_type, std::istream::traits_type\n        >(is, flags)\n    {\n        init(flags);\n    }\n    binary_iarchive(std::streambuf & bsb, unsigned int flags = 0) :\n        binary_iarchive_impl<\n            binary_iarchive, std::istream::char_type, std::istream::traits_type\n        >(bsb, flags)\n    {\n        init(flags);\n    }\n};\n\n} // namespace archive\n} // namespace boost\n\n// required by export\nBOOST_SERIALIZATION_REGISTER_ARCHIVE(boost::archive::binary_iarchive)\nBOOST_SERIALIZATION_USE_ARRAY_OPTIMIZATION(boost::archive::binary_iarchive)\n\n#ifdef BOOST_MSVC\n#pragma warning(pop)\n#endif\n\n#endif // BOOST_ARCHIVE_BINARY_IARCHIVE_HPP\n"
  },
  {
    "path": "include/boost/archive/binary_iarchive_impl.hpp",
    "content": "#ifndef BOOST_ARCHIVE_BINARY_IARCHIVE_IMPL_HPP\n#define BOOST_ARCHIVE_BINARY_IARCHIVE_IMPL_HPP\n\n// MS compatible compilers support #pragma once\n#if defined(_MSC_VER)\n# pragma once\n#endif\n\n/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// binary_iarchive_impl.hpp\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for updates, documentation, and revision history.\n\n#include <istream>\n#include <boost/archive/basic_binary_iprimitive.hpp>\n#include <boost/archive/basic_binary_iarchive.hpp>\n\n#ifdef BOOST_MSVC\n#  pragma warning(push)\n#  pragma warning(disable : 4511 4512)\n#endif\n\nnamespace boost {\nnamespace archive {\n\nnamespace detail {\n    template<class Archive> class interface_iarchive;\n} // namespace detail\n\ntemplate<class Archive, class Elem, class Tr>\nclass BOOST_SYMBOL_VISIBLE binary_iarchive_impl :\n    public basic_binary_iprimitive<Archive, Elem, Tr>,\n    public basic_binary_iarchive<Archive>\n{\n#ifdef BOOST_NO_MEMBER_TEMPLATE_FRIENDS\npublic:\n#else\nprotected:\n    #if BOOST_WORKAROUND(BOOST_MSVC, < 1500)\n        // for some inexplicable reason insertion of \"class\" generates compile erro\n        // on msvc 7.1\n        friend detail::interface_iarchive<Archive>;\n        friend basic_binary_iarchive<Archive>;\n        friend load_access;\n    #else\n        friend class detail::interface_iarchive<Archive>;\n        friend class basic_binary_iarchive<Archive>;\n        friend class load_access;\n    #endif\n#endif\n    template<class T>\n    void load_override(T & t){\n        this->basic_binary_iarchive<Archive>::load_override(t);\n    }\n    void init(unsigned int flags){\n        if(0 != (flags & no_header)){\n            return;\n        }\n        #if ! defined(__MWERKS__)\n            this->basic_binary_iarchive<Archive>::init();\n            this->basic_binary_iprimitive<Archive, Elem, Tr>::init();\n        #else\n            basic_binary_iarchive<Archive>::init();\n            basic_binary_iprimitive<Archive, Elem, Tr>::init();\n        #endif\n    }\n    binary_iarchive_impl(\n        std::basic_streambuf<Elem, Tr> & bsb,\n        unsigned int flags\n    ) :\n        basic_binary_iprimitive<Archive, Elem, Tr>(\n            bsb,\n            0 != (flags & no_codecvt)\n        ),\n        basic_binary_iarchive<Archive>(flags)\n    {}\n    binary_iarchive_impl(\n        std::basic_istream<Elem, Tr> & is,\n        unsigned int flags\n    ) :\n        basic_binary_iprimitive<Archive, Elem, Tr>(\n            * is.rdbuf(),\n            0 != (flags & no_codecvt)\n        ),\n        basic_binary_iarchive<Archive>(flags)\n    {}\n};\n\n} // namespace archive\n} // namespace boost\n\n#ifdef BOOST_MSVC\n#pragma warning(pop)\n#endif\n\n#endif // BOOST_ARCHIVE_BINARY_IARCHIVE_IMPL_HPP\n"
  },
  {
    "path": "include/boost/archive/binary_oarchive.hpp",
    "content": "#ifndef BOOST_ARCHIVE_BINARY_OARCHIVE_HPP\n#define BOOST_ARCHIVE_BINARY_OARCHIVE_HPP\n\n// MS compatible compilers support #pragma once\n#if defined(_MSC_VER)\n# pragma once\n#endif\n\n/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// binary_oarchive.hpp\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for updates, documentation, and revision history.\n\n#include <ostream>\n#include <boost/config.hpp>\n#include <boost/archive/binary_oarchive_impl.hpp>\n#include <boost/archive/detail/register_archive.hpp>\n\n#ifdef BOOST_MSVC\n#  pragma warning(push)\n#  pragma warning(disable : 4511 4512)\n#endif\n\nnamespace boost {\nnamespace archive {\n\n// do not derive from this class.  If you want to extend this functionality\n// via inheritance, derived from binary_oarchive_impl instead.  This will\n// preserve correct static polymorphism.\nclass BOOST_SYMBOL_VISIBLE binary_oarchive :\n    public binary_oarchive_impl<\n        binary_oarchive, std::ostream::char_type, std::ostream::traits_type\n    >\n{\npublic:\n    binary_oarchive(std::ostream & os, unsigned int flags = 0) :\n        binary_oarchive_impl<\n            binary_oarchive, std::ostream::char_type, std::ostream::traits_type\n        >(os, flags)\n    {\n        init(flags);\n    }\n    binary_oarchive(std::streambuf & bsb, unsigned int flags = 0) :\n        binary_oarchive_impl<\n            binary_oarchive, std::ostream::char_type, std::ostream::traits_type\n        >(bsb, flags)\n    {\n        init(flags);\n    }\n};\n\n} // namespace archive\n} // namespace boost\n\n// required by export\nBOOST_SERIALIZATION_REGISTER_ARCHIVE(boost::archive::binary_oarchive)\nBOOST_SERIALIZATION_USE_ARRAY_OPTIMIZATION(boost::archive::binary_oarchive)\n\n#ifdef BOOST_MSVC\n#pragma warning(pop)\n#endif\n\n#endif // BOOST_ARCHIVE_BINARY_OARCHIVE_HPP\n"
  },
  {
    "path": "include/boost/archive/binary_oarchive_impl.hpp",
    "content": "#ifndef BOOST_ARCHIVE_BINARY_OARCHIVE_IMPL_HPP\n#define BOOST_ARCHIVE_BINARY_OARCHIVE_IMPL_HPP\n\n// MS compatible compilers support #pragma once\n#if defined(_MSC_VER)\n# pragma once\n#endif\n\n/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// binary_oarchive_impl.hpp\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for updates, documentation, and revision history.\n\n#include <ostream>\n#include <boost/config.hpp>\n#include <boost/archive/basic_binary_oprimitive.hpp>\n#include <boost/archive/basic_binary_oarchive.hpp>\n\n#ifdef BOOST_MSVC\n#  pragma warning(push)\n#  pragma warning(disable : 4511 4512)\n#endif\n\nnamespace boost {\nnamespace archive {\n\nnamespace detail {\n    template<class Archive> class interface_oarchive;\n} // namespace detail\n\ntemplate<class Archive, class Elem, class Tr>\nclass BOOST_SYMBOL_VISIBLE binary_oarchive_impl :\n    public basic_binary_oprimitive<Archive, Elem, Tr>,\n    public basic_binary_oarchive<Archive>\n{\n#ifdef BOOST_NO_MEMBER_TEMPLATE_FRIENDS\npublic:\n#else\nprotected:\n    #if BOOST_WORKAROUND(BOOST_MSVC, < 1500)\n        // for some inexplicable reason insertion of \"class\" generates compile erro\n        // on msvc 7.1\n        friend detail::interface_oarchive<Archive>;\n        friend basic_binary_oarchive<Archive>;\n        friend save_access;\n    #else\n        friend class detail::interface_oarchive<Archive>;\n        friend class basic_binary_oarchive<Archive>;\n        friend class save_access;\n    #endif\n#endif\n    template<class T>\n    void save_override(T & t){\n        this->basic_binary_oarchive<Archive>::save_override(t);\n    }\n    void init(unsigned int flags) {\n        if(0 != (flags & no_header)){\n            return;\n        }\n        #if ! defined(__MWERKS__)\n            this->basic_binary_oarchive<Archive>::init();\n            this->basic_binary_oprimitive<Archive, Elem, Tr>::init();\n        #else\n            basic_binary_oarchive<Archive>::init();\n            basic_binary_oprimitive<Archive, Elem, Tr>::init();\n        #endif\n    }\n    binary_oarchive_impl(\n        std::basic_streambuf<Elem, Tr> & bsb,\n        unsigned int flags\n    ) :\n        basic_binary_oprimitive<Archive, Elem, Tr>(\n            bsb,\n            0 != (flags & no_codecvt)\n        ),\n        basic_binary_oarchive<Archive>(flags)\n    {}\n    binary_oarchive_impl(\n        std::basic_ostream<Elem, Tr> & os,\n        unsigned int flags\n    ) :\n        basic_binary_oprimitive<Archive, Elem, Tr>(\n            * os.rdbuf(),\n            0 != (flags & no_codecvt)\n        ),\n        basic_binary_oarchive<Archive>(flags)\n    {}\n};\n\n} // namespace archive\n} // namespace boost\n\n#ifdef BOOST_MSVC\n#pragma warning(pop)\n#endif\n\n#endif // BOOST_ARCHIVE_BINARY_OARCHIVE_IMPL_HPP\n"
  },
  {
    "path": "include/boost/archive/binary_wiarchive.hpp",
    "content": "#ifndef BOOST_ARCHIVE_BINARY_WIARCHIVE_HPP\n#define BOOST_ARCHIVE_BINARY_WIARCHIVE_HPP\n\n// MS compatible compilers support #pragma once\n#if defined(_MSC_VER)\n# pragma once\n#endif\n\n/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// binary_wiarchive.hpp\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for updates, documentation, and revision history.\n\n#include <boost/config.hpp>\n#ifdef BOOST_NO_STD_WSTREAMBUF\n#error \"wide char i/o not supported on this platform\"\n#else\n\n#include <istream> // wistream\n#include <boost/archive/binary_iarchive_impl.hpp>\n#include <boost/archive/detail/register_archive.hpp>\n\nnamespace boost {\nnamespace archive {\n\nclass binary_wiarchive :\n    public binary_iarchive_impl<\n        binary_wiarchive, std::wistream::char_type, std::wistream::traits_type\n    >\n{\npublic:\n    binary_wiarchive(std::wistream & is, unsigned int flags = 0) :\n        binary_iarchive_impl<\n            binary_wiarchive, std::wistream::char_type, std::wistream::traits_type\n        >(is, flags)\n    {}\n    binary_wiarchive(std::wstreambuf & bsb, unsigned int flags = 0) :\n        binary_iarchive_impl<\n            binary_wiarchive, std::wistream::char_type, std::wistream::traits_type\n        >(bsb, flags)\n    {}\n};\n\n} // namespace archive\n} // namespace boost\n\n// required by export\nBOOST_SERIALIZATION_REGISTER_ARCHIVE(boost::archive::binary_wiarchive)\n\n#endif // BOOST_NO_STD_WSTREAMBUF\n#endif // BOOST_ARCHIVE_BINARY_WIARCHIVE_HPP\n"
  },
  {
    "path": "include/boost/archive/binary_woarchive.hpp",
    "content": "#ifndef BOOST_ARCHIVE_BINARY_WOARCHIVE_HPP\n#define BOOST_ARCHIVE_BINARY_WOARCHIVE_HPP\n\n// MS compatible compilers support #pragma once\n#if defined(_MSC_VER)\n# pragma once\n#endif\n\n/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// binary_woarchive.hpp\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for updates, documentation, and revision history.\n\n#include <boost/config.hpp>\n#ifdef BOOST_NO_STD_WSTREAMBUF\n#error \"wide char i/o not supported on this platform\"\n#else\n\n#include <ostream>\n#include <boost/archive/binary_oarchive_impl.hpp>\n#include <boost/archive/detail/register_archive.hpp>\n\nnamespace boost {\nnamespace archive {\n\n// do not derive from this class.  If you want to extend this functionality\n// via inheritance, derived from binary_oarchive_impl instead.  This will\n// preserve correct static polymorphism.\nclass binary_woarchive :\n    public binary_oarchive_impl<\n            binary_woarchive, std::wostream::char_type, std::wostream::traits_type\n        >\n{\npublic:\n    binary_woarchive(std::wostream & os, unsigned int flags = 0) :\n        binary_oarchive_impl<\n            binary_woarchive, std::wostream::char_type, std::wostream::traits_type\n        >(os, flags)\n    {}\n    binary_woarchive(std::wstreambuf & bsb, unsigned int flags = 0) :\n        binary_oarchive_impl<\n            binary_woarchive, std::wostream::char_type, std::wostream::traits_type\n        >(bsb, flags)\n    {}\n};\n\n} // namespace archive\n} // namespace boost\n\n// required by export\nBOOST_SERIALIZATION_REGISTER_ARCHIVE(boost::archive::binary_woarchive)\n\n#endif // BOOST_NO_STD_WSTREAMBUF\n#endif // BOOST_ARCHIVE_BINARY_WOARCHIVE_HPP\n"
  },
  {
    "path": "include/boost/archive/codecvt_null.hpp",
    "content": "#ifndef BOOST_ARCHIVE_CODECVT_NULL_HPP\n#define BOOST_ARCHIVE_CODECVT_NULL_HPP\n\n// MS compatible compilers support #pragma once\n#if defined(_MSC_VER)\n# pragma once\n#endif\n\n/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// codecvt_null.hpp:\n\n// (C) Copyright 2004 Robert Ramey - http://www.rrsd.com .\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for updates, documentation, and revision history.\n\n#include <locale>\n#include <cstddef> // NULL, size_t\n#ifndef BOOST_NO_CWCHAR\n#include <cwchar>   // for mbstate_t\n#endif\n#include <boost/config.hpp>\n#include <boost/serialization/force_include.hpp>\n#include <boost/archive/detail/auto_link_archive.hpp>\n//#include <boost/archive/detail/abi_prefix.hpp> // must be the last header\n\n#if defined(BOOST_NO_STDC_NAMESPACE)\nnamespace std {\n// For STLport on WinCE, BOOST_NO_STDC_NAMESPACE can get defined if STLport is putting symbols in its own namespace.\n// In the case of codecvt, however, this does not mean that codecvt is in the global namespace (it will be in STLport's namespace)\n#  if !defined(__SGI_STL_PORT) && !defined(_STLPORT_VERSION)\n    using ::codecvt;\n#  endif\n    using ::mbstate_t;\n    using ::size_t;\n} // namespace\n#endif\n\n#ifdef BOOST_MSVC\n#  pragma warning(push)\n#  pragma warning(disable : 4511 4512)\n#endif\n\nnamespace boost {\nnamespace archive {\n\ntemplate<class Ch>\nclass codecvt_null;\n\ntemplate<>\nclass codecvt_null<char> : public std::codecvt<char, char, std::mbstate_t>\n{\n    bool do_always_noconv() const BOOST_NOEXCEPT_OR_NOTHROW BOOST_OVERRIDE {\n        return true;\n    }\npublic:\n    explicit codecvt_null(std::size_t no_locale_manage = 0) :\n        std::codecvt<char, char, std::mbstate_t>(no_locale_manage)\n    {}\n    ~codecvt_null() BOOST_OVERRIDE {}\n};\n\ntemplate<>\nclass BOOST_SYMBOL_VISIBLE codecvt_null<wchar_t> :\n    public std::codecvt<wchar_t, char, std::mbstate_t>\n{\n    BOOST_SYMBOL_EXPORT std::codecvt_base::result\n    do_out(\n        std::mbstate_t & state,\n        const wchar_t * first1,\n        const wchar_t * last1,\n        const wchar_t * & next1,\n        char * first2,\n        char * last2,\n        char * & next2\n    ) const BOOST_OVERRIDE;\n\n    BOOST_SYMBOL_EXPORT std::codecvt_base::result\n    do_in(\n        std::mbstate_t & state,\n        const char * first1,\n        const char * last1,\n        const char * & next1,\n        wchar_t * first2,\n        wchar_t * last2,\n        wchar_t * & next2\n    ) const BOOST_OVERRIDE;\n\n    BOOST_SYMBOL_EXPORT int do_encoding( ) const BOOST_NOEXCEPT_OR_NOTHROW BOOST_OVERRIDE {\n        return sizeof(wchar_t) / sizeof(char);\n    }\n\n    BOOST_SYMBOL_EXPORT bool do_always_noconv() const BOOST_NOEXCEPT_OR_NOTHROW BOOST_OVERRIDE {\n        return false;\n    }\n\n    BOOST_SYMBOL_EXPORT int do_max_length( ) const BOOST_NOEXCEPT_OR_NOTHROW BOOST_OVERRIDE {\n        return do_encoding();\n    }\npublic:\n    BOOST_SYMBOL_EXPORT explicit codecvt_null(std::size_t no_locale_manage = 0);\n\n    BOOST_SYMBOL_EXPORT ~codecvt_null() BOOST_OVERRIDE ;\n};\n\n} // namespace archive\n} // namespace boost\n\n#ifdef BOOST_MSVC\n#  pragma warning(pop)\n#endif\n//#include <boost/archive/detail/abi_suffix.hpp> // pop pragmas\n\n#endif //BOOST_ARCHIVE_CODECVT_NULL_HPP\n"
  },
  {
    "path": "include/boost/archive/detail/abi_prefix.hpp",
    "content": "/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// abi_prefix.hpp\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for updates, documentation, and revision history.\n\n#include <boost/config/abi_prefix.hpp> // must be the last header\n#ifdef BOOST_MSVC\n#  pragma warning(push)\n#  pragma warning(disable : 4251 4231 4660 4275)\n#endif\n\n"
  },
  {
    "path": "include/boost/archive/detail/abi_suffix.hpp",
    "content": "/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// abi_suffix.hpp\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for updates, documentation, and revision history.\n\n#ifdef BOOST_MSVC\n#pragma warning(pop)\n#endif\n#include <boost/config/abi_suffix.hpp> // pops abi_suffix.hpp pragmas\n\n"
  },
  {
    "path": "include/boost/archive/detail/archive_serializer_map.hpp",
    "content": "#ifndef BOOST_ARCHIVE_SERIALIZER_MAP_HPP\n#define BOOST_ARCHIVE_SERIALIZER_MAP_HPP\n\n// MS compatible compilers support #pragma once\n#if defined(_MSC_VER)\n# pragma once\n#endif\n\n/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// archive_serializer_map.hpp: extension of type_info required for\n// serialization.\n\n// (C) Copyright 2009 Robert Ramey - http://www.rrsd.com .\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for updates, documentation, and revision history.\n\n// note: this is nothing more than the thinnest of wrappers around\n// basic_serializer_map so we can have a one map / archive type.\n\n#include <boost/config.hpp>\n#include <boost/archive/detail/auto_link_archive.hpp>\n#include <boost/archive/detail/abi_prefix.hpp> // must be the last header\n\nnamespace boost {\n\nnamespace serialization {\n    class extended_type_info;\n} // namespace serialization\n\nnamespace archive {\nnamespace detail {\n\nclass basic_serializer;\n\ntemplate<class Archive>\nclass BOOST_SYMBOL_VISIBLE archive_serializer_map {\npublic:\n    static BOOST_ARCHIVE_OR_WARCHIVE_DECL bool insert(const basic_serializer * bs);\n    static BOOST_ARCHIVE_OR_WARCHIVE_DECL void erase(const basic_serializer * bs);\n    static BOOST_ARCHIVE_OR_WARCHIVE_DECL const basic_serializer * find(\n        const boost::serialization::extended_type_info & type_\n    );\n};\n\n} // namespace detail\n} // namespace archive\n} // namespace boost\n\n#include <boost/archive/detail/abi_suffix.hpp> // must be the last header\n\n#endif //BOOST_ARCHIVE_SERIALIZER_MAP_HPP\n"
  },
  {
    "path": "include/boost/archive/detail/auto_link_archive.hpp",
    "content": "#ifndef BOOST_ARCHIVE_DETAIL_AUTO_LINK_ARCHIVE_HPP\n#define BOOST_ARCHIVE_DETAIL_AUTO_LINK_ARCHIVE_HPP\n\n// MS compatible compilers support #pragma once\n#if defined(_MSC_VER)\n# pragma once\n#endif\n\n/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n//  auto_link_archive.hpp\n//\n//  (c) Copyright Robert Ramey 2004\n//  Use, modification, and distribution is subject to the Boost Software\n//  License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n//  http://www.boost.org/LICENSE_1_0.txt)\n\n//  See library home page at http://www.boost.org/libs/serialization\n\n//----------------------------------------------------------------------------//\n\n// This header implements separate compilation features as described in\n// http://www.boost.org/more/separate_compilation.html\n\n//  enable automatic library variant selection  ------------------------------//\n\n#include <boost/archive/detail/decl.hpp>\n\n#if !defined(BOOST_ALL_NO_LIB) && !defined(BOOST_SERIALIZATION_NO_LIB) \\\n&&  !defined(BOOST_ARCHIVE_SOURCE) && !defined(BOOST_WARCHIVE_SOURCE)  \\\n&&  !defined(BOOST_SERIALIZATION_SOURCE)\n\n    // Set the name of our library, this will get undef'ed by auto_link.hpp\n    // once it's done with it:\n    //\n    #define BOOST_LIB_NAME boost_serialization\n    //\n    // If we're importing code from a dll, then tell auto_link.hpp about it:\n    //\n    #if defined(BOOST_ALL_DYN_LINK) || defined(BOOST_SERIALIZATION_DYN_LINK)\n    #  define BOOST_DYN_LINK\n    #endif\n    //\n    // And include the header that does the work:\n    //\n    #include <boost/config/auto_link.hpp>\n#endif  // auto-linking disabled\n\n#endif // BOOST_ARCHIVE_DETAIL_AUTO_LINK_ARCHIVE_HPP\n"
  },
  {
    "path": "include/boost/archive/detail/auto_link_warchive.hpp",
    "content": "#ifndef BOOST_ARCHIVE_DETAIL_AUTO_LINK_WARCHIVE_HPP\n#define BOOST_ARCHIVE_DETAIL_AUTO_LINK_WARCHIVE_HPP\n\n// MS compatible compilers support #pragma once\n#if defined(_MSC_VER)\n# pragma once\n#endif\n\n/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n//  auto_link_warchive.hpp\n//\n//  (c) Copyright Robert Ramey 2004\n//  Use, modification, and distribution is subject to the Boost Software\n//  License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n//  http://www.boost.org/LICENSE_1_0.txt)\n\n//  See library home page at http://www.boost.org/libs/serialization\n\n//----------------------------------------------------------------------------//\n\n// This header implements separate compilation features as described in\n// http://www.boost.org/more/separate_compilation.html\n\n//  enable automatic library variant selection  ------------------------------//\n\n#include <boost/archive/detail/decl.hpp>\n\n#if !defined(BOOST_WARCHIVE_SOURCE) \\\n&& !defined(BOOST_ALL_NO_LIB) && !defined(BOOST_SERIALIZATION_NO_LIB)\n\n// Set the name of our library, this will get undef'ed by auto_link.hpp\n// once it's done with it:\n//\n#define BOOST_LIB_NAME boost_wserialization\n//\n// If we're importing code from a dll, then tell auto_link.hpp about it:\n//\n#if defined(BOOST_ALL_DYN_LINK) || defined(BOOST_SERIALIZATION_DYN_LINK)\n#  define BOOST_DYN_LINK\n#endif\n//\n// And include the header that does the work:\n//\n#include <boost/config/auto_link.hpp>\n#endif  // auto-linking disabled\n\n#endif // ARCHIVE_DETAIL_AUTO_LINK_ARCHIVE_HPP\n"
  },
  {
    "path": "include/boost/archive/detail/basic_iarchive.hpp",
    "content": "#ifndef BOOST_ARCHIVE_DETAIL_BASIC_IARCHIVE_HPP\n#define BOOST_ARCHIVE_DETAIL_BASIC_IARCHIVE_HPP\n\n// MS compatible compilers support #pragma once\n#if defined(_MSC_VER)\n# pragma once\n#endif\n\n/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// basic_iarchive.hpp:\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for updates, documentation, and revision history.\n\n// can't use this - much as I'd like to as borland doesn't support it\n\n#include <boost/config.hpp>\n#include <boost/noncopyable.hpp>\n#include <boost/scoped_ptr.hpp>\n\n#include <boost/serialization/tracking_enum.hpp>\n#include <boost/archive/basic_archive.hpp>\n#include <boost/archive/detail/decl.hpp>\n#include <boost/archive/detail/helper_collection.hpp>\n#include <boost/archive/detail/abi_prefix.hpp> // must be the last header\n\nnamespace boost {\nnamespace serialization {\n    class extended_type_info;\n} // namespace serialization\n\nnamespace archive {\nnamespace detail {\n\nclass basic_iarchive_impl;\nclass basic_iserializer;\nclass basic_pointer_iserializer;\n\n//////////////////////////////////////////////////////////////////////\n// class basic_iarchive - read serialized objects from a input stream\nclass BOOST_SYMBOL_VISIBLE basic_iarchive :\n    private boost::noncopyable,\n    public boost::archive::detail::helper_collection\n{\n    friend class basic_iarchive_impl;\n    // hide implementation of this class to minimize header conclusion\n    boost::scoped_ptr<basic_iarchive_impl> pimpl;\n\n    virtual void vload(version_type &t) =  0;\n    virtual void vload(object_id_type &t) =  0;\n    virtual void vload(class_id_type &t) =  0;\n    virtual void vload(class_id_optional_type &t) = 0;\n    virtual void vload(class_name_type &t) = 0;\n    virtual void vload(tracking_type &t) = 0;\nprotected:\n    BOOST_ARCHIVE_DECL basic_iarchive(unsigned int flags);\n    boost::archive::detail::helper_collection &\n    get_helper_collection(){\n        return *this;\n    }\npublic:\n    // some msvc versions require that the following function be public\n    // otherwise it should really protected.\n    virtual BOOST_ARCHIVE_DECL ~basic_iarchive();\n    // note: NOT part of the public API.\n    BOOST_ARCHIVE_DECL void next_object_pointer(void *t);\n    BOOST_ARCHIVE_DECL void register_basic_serializer(\n        const basic_iserializer & bis\n    );\n    BOOST_ARCHIVE_DECL void load_object(\n        void *t,\n        const basic_iserializer & bis\n    );\n    BOOST_ARCHIVE_DECL const basic_pointer_iserializer *\n    load_pointer(\n        void * & t,\n        const basic_pointer_iserializer * bpis_ptr,\n        const basic_pointer_iserializer * (*finder)(\n            const boost::serialization::extended_type_info & eti\n        )\n    );\n    // real public API starts here\n    BOOST_ARCHIVE_DECL void\n    set_library_version(boost::serialization::library_version_type archive_library_version);\n    BOOST_ARCHIVE_DECL boost::serialization::library_version_type\n    get_library_version() const;\n    BOOST_ARCHIVE_DECL unsigned int\n    get_flags() const;\n    BOOST_ARCHIVE_DECL void\n    reset_object_address(const void * new_address, const void * old_address);\n    BOOST_ARCHIVE_DECL void\n    delete_created_pointers();\n};\n\n} // namespace detail\n} // namespace archive\n} // namespace boost\n\n#include <boost/archive/detail/abi_suffix.hpp> // pops abi_suffix.hpp pragmas\n\n#endif //BOOST_ARCHIVE_DETAIL_BASIC_IARCHIVE_HPP\n"
  },
  {
    "path": "include/boost/archive/detail/basic_iserializer.hpp",
    "content": "#ifndef BOOST_ARCHIVE_DETAIL_BASIC_ISERIALIZER_HPP\n#define BOOST_ARCHIVE_DETAIL_BASIC_ISERIALIZER_HPP\n\n// MS compatible compilers support #pragma once\n#if defined(_MSC_VER)\n# pragma once\n#endif\n\n/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// basic_iserializer.hpp: extension of type_info required for serialization.\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for updates, documentation, and revision history.\n\n#include <cstdlib> // NULL\n#include <boost/config.hpp>\n\n#include <boost/archive/basic_archive.hpp>\n#include <boost/archive/detail/decl.hpp>\n#include <boost/archive/detail/basic_serializer.hpp>\n#include <boost/archive/detail/auto_link_archive.hpp>\n#include <boost/archive/detail/abi_prefix.hpp> // must be the last header\n\n#ifdef BOOST_MSVC\n#  pragma warning(push)\n#  pragma warning(disable : 4511 4512)\n#endif\n\nnamespace boost {\nnamespace serialization {\n    class extended_type_info;\n} // namespace serialization\n\n// forward declarations\nnamespace archive {\nnamespace detail {\n\nclass basic_iarchive;\nclass basic_pointer_iserializer;\n\nclass BOOST_SYMBOL_VISIBLE basic_iserializer :\n    public basic_serializer\n{\nprivate:\n    basic_pointer_iserializer *m_bpis;\nprotected:\n    explicit BOOST_ARCHIVE_DECL basic_iserializer(\n        const boost::serialization::extended_type_info & type\n    );\n    virtual BOOST_ARCHIVE_DECL ~basic_iserializer();\npublic:\n    bool serialized_as_pointer() const {\n        return m_bpis != NULL;\n    }\n    void set_bpis(basic_pointer_iserializer *bpis){\n        m_bpis = bpis;\n    }\n    const basic_pointer_iserializer * get_bpis_ptr() const {\n        return m_bpis;\n    }\n    virtual void load_object_data(\n        basic_iarchive & ar,\n        void *x,\n        const unsigned int file_version\n    ) const = 0;\n    // returns true if class_info should be saved\n    virtual bool class_info() const = 0 ;\n    // returns true if objects should be tracked\n    virtual bool tracking(const unsigned int) const = 0 ;\n    // returns class version\n    virtual version_type version() const = 0 ;\n    // returns true if this class is polymorphic\n    virtual bool is_polymorphic() const = 0;\n    virtual void destroy(/*const*/ void *address) const = 0 ;\n};\n\n} // namespace detail\n} // namespace archive\n} // namespace boost\n\n#ifdef BOOST_MSVC\n#pragma warning(pop)\n#endif\n\n#include <boost/archive/detail/abi_suffix.hpp> // pops abi_suffix.hpp pragmas\n\n#endif // BOOST_ARCHIVE_DETAIL_BASIC_ISERIALIZER_HPP\n"
  },
  {
    "path": "include/boost/archive/detail/basic_oarchive.hpp",
    "content": "#ifndef BOOST_ARCHIVE_BASIC_OARCHIVE_HPP\n#define BOOST_ARCHIVE_BASIC_OARCHIVE_HPP\n\n// MS compatible compilers support #pragma once\n#if defined(_MSC_VER)\n# pragma once\n#endif\n\n/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// basic_oarchive.hpp:\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for updates, documentation, and revision history.\n\n#include <cstddef> // NULL\n#include <boost/config.hpp>\n#include <boost/noncopyable.hpp>\n#include <boost/scoped_ptr.hpp>\n\n#include <boost/archive/basic_archive.hpp>\n#include <boost/serialization/tracking_enum.hpp>\n#include <boost/archive/detail/helper_collection.hpp>\n#include <boost/archive/detail/abi_prefix.hpp> // must be the last header\n\nnamespace boost {\nnamespace serialization {\n    class extended_type_info;\n} // namespace serialization\n\nnamespace archive {\nnamespace detail {\n\nclass basic_oarchive_impl;\nclass basic_oserializer;\nclass basic_pointer_oserializer;\n\n//////////////////////////////////////////////////////////////////////\n// class basic_oarchive - write serialized objects to an output stream\nclass BOOST_SYMBOL_VISIBLE basic_oarchive :\n    private boost::noncopyable,\n    public boost::archive::detail::helper_collection\n{\n    friend class basic_oarchive_impl;\n    // hide implementation of this class to minimize header conclusion\n    boost::scoped_ptr<basic_oarchive_impl> pimpl;\n\n    // overload these to bracket object attributes. Used to implement\n    // xml archives\n    virtual void vsave(const version_type t) =  0;\n    virtual void vsave(const object_id_type t) =  0;\n    virtual void vsave(const object_reference_type t) =  0;\n    virtual void vsave(const class_id_type t) =  0;\n    virtual void vsave(const class_id_optional_type t) = 0;\n    virtual void vsave(const class_id_reference_type t) =  0;\n    virtual void vsave(const class_name_type & t) = 0;\n    virtual void vsave(const tracking_type t) = 0;\nprotected:\n    BOOST_ARCHIVE_DECL basic_oarchive(unsigned int flags = 0);\n    BOOST_ARCHIVE_DECL boost::archive::detail::helper_collection &\n    get_helper_collection();\n    virtual BOOST_ARCHIVE_DECL ~basic_oarchive();\npublic:\n    // note: NOT part of the public interface\n    BOOST_ARCHIVE_DECL void register_basic_serializer(\n        const basic_oserializer & bos\n    );\n    BOOST_ARCHIVE_DECL void save_object(\n        const void *x,\n        const basic_oserializer & bos\n    );\n    BOOST_ARCHIVE_DECL void save_pointer(\n        const void * t,\n        const basic_pointer_oserializer * bpos_ptr\n    );\n    void save_null_pointer(){\n        vsave(BOOST_SERIALIZATION_NULL_POINTER_TAG);\n    }\n    // real public interface starts here\n    BOOST_ARCHIVE_DECL void end_preamble(); // default implementation does nothing\n    BOOST_ARCHIVE_DECL boost::serialization::library_version_type get_library_version() const;\n    BOOST_ARCHIVE_DECL unsigned int get_flags() const;\n};\n\n} // namespace detail\n} // namespace archive\n} // namespace boost\n\n#include <boost/archive/detail/abi_suffix.hpp> // pops abi_suffix.hpp pragmas\n\n#endif //BOOST_ARCHIVE_BASIC_OARCHIVE_HPP\n"
  },
  {
    "path": "include/boost/archive/detail/basic_oserializer.hpp",
    "content": "#ifndef BOOST_SERIALIZATION_BASIC_OSERIALIZER_HPP\n#define BOOST_SERIALIZATION_BASIC_OSERIALIZER_HPP\n\n// MS compatible compilers support #pragma once\n#if defined(_MSC_VER)\n# pragma once\n#endif\n\n/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// basic_oserializer.hpp: extension of type_info required for serialization.\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for updates, documentation, and revision history.\n\n#include <cstddef> // NULL\n#include <boost/config.hpp>\n#include <boost/noncopyable.hpp>\n\n#include <boost/archive/basic_archive.hpp>\n#include <boost/archive/detail/auto_link_archive.hpp>\n#include <boost/archive/detail/basic_serializer.hpp>\n\n#include <boost/archive/detail/abi_prefix.hpp> // must be the last header\n\n#ifdef BOOST_MSVC\n#  pragma warning(push)\n#  pragma warning(disable : 4511 4512)\n#endif\n\nnamespace boost {\nnamespace serialization {\n    class extended_type_info;\n} // namespace serialization\n\n// forward declarations\nnamespace archive {\nnamespace detail {\n\nclass basic_oarchive;\nclass basic_pointer_oserializer;\n\nclass BOOST_SYMBOL_VISIBLE basic_oserializer :\n    public basic_serializer\n{\nprivate:\n    basic_pointer_oserializer *m_bpos;\nprotected:\n    explicit BOOST_ARCHIVE_DECL basic_oserializer(\n        const boost::serialization::extended_type_info & type_\n    );\n    virtual BOOST_ARCHIVE_DECL ~basic_oserializer();\npublic:\n    bool serialized_as_pointer() const {\n        return m_bpos != NULL;\n    }\n    void set_bpos(basic_pointer_oserializer *bpos){\n        m_bpos = bpos;\n    }\n    const basic_pointer_oserializer * get_bpos() const {\n        return m_bpos;\n    }\n    virtual void save_object_data(\n        basic_oarchive & ar, const void * x\n    ) const = 0;\n    // returns true if class_info should be saved\n    virtual bool class_info() const = 0;\n    // returns true if objects should be tracked\n    virtual bool tracking(const unsigned int flags) const = 0;\n    // returns class version\n    virtual version_type version() const = 0;\n    // returns true if this class is polymorphic\n    virtual bool is_polymorphic() const = 0;\n};\n\n} // namespace detail\n} // namespace serialization\n} // namespace boost\n\n#ifdef BOOST_MSVC\n#pragma warning(pop)\n#endif\n\n#include <boost/archive/detail/abi_suffix.hpp> // pops abi_suffix.hpp pragmas\n\n#endif // BOOST_SERIALIZATION_BASIC_OSERIALIZER_HPP\n"
  },
  {
    "path": "include/boost/archive/detail/basic_pointer_iserializer.hpp",
    "content": "#ifndef BOOST_ARCHIVE_BASIC_POINTER_ISERIALIZER_HPP\n#define BOOST_ARCHIVE_BASIC_POINTER_ISERIALIZER_HPP\n\n// MS compatible compilers support #pragma once\n#if defined(_MSC_VER)\n# pragma once\n#endif\n\n/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// basic_pointer_oserializer.hpp: extension of type_info required for\n// serialization.\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for updates, documentation, and revision history.\n#include <boost/config.hpp>\n#include <boost/noncopyable.hpp>\n#include <boost/archive/detail/auto_link_archive.hpp>\n#include <boost/archive/detail/basic_serializer.hpp>\n\n#include <boost/archive/detail/abi_prefix.hpp> // must be the last header\n\n#ifdef BOOST_MSVC\n#  pragma warning(push)\n#  pragma warning(disable : 4511 4512)\n#endif\n\nnamespace boost {\nnamespace serialization {\n    class extended_type_info;\n} // namespace serialization\n\n// forward declarations\nnamespace archive {\nnamespace detail {\n\nclass basic_iarchive;\nclass basic_iserializer;\n\nclass BOOST_SYMBOL_VISIBLE basic_pointer_iserializer\n    : public basic_serializer {\nprotected:\n    explicit BOOST_ARCHIVE_DECL basic_pointer_iserializer(\n        const boost::serialization::extended_type_info & type_\n    );\n    virtual BOOST_ARCHIVE_DECL ~basic_pointer_iserializer();\npublic:\n    virtual void * heap_allocation() const = 0;\n    virtual const basic_iserializer & get_basic_serializer() const = 0;\n    virtual void load_object_ptr(\n        basic_iarchive & ar,\n        void * x,\n        const unsigned int file_version\n    ) const = 0;\n};\n\n} // namespace detail\n} // namespace archive\n} // namespace boost\n\n#ifdef BOOST_MSVC\n#pragma warning(pop)\n#endif\n\n#include <boost/archive/detail/abi_suffix.hpp> // pops abi_suffix.hpp pragmas\n\n#endif // BOOST_ARCHIVE_BASIC_POINTER_ISERIALIZER_HPP\n"
  },
  {
    "path": "include/boost/archive/detail/basic_pointer_oserializer.hpp",
    "content": "#ifndef BOOST_ARCHIVE_BASIC_POINTER_OSERIALIZER_HPP\n#define BOOST_ARCHIVE_BASIC_POINTER_OSERIALIZER_HPP\n\n// MS compatible compilers support #pragma once\n#if defined(_MSC_VER)\n# pragma once\n#endif\n\n/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// basic_pointer_oserializer.hpp: extension of type_info required for\n// serialization.\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for updates, documentation, and revision history.\n#include <boost/config.hpp>\n#include <boost/noncopyable.hpp>\n#include <boost/archive/detail/auto_link_archive.hpp>\n#include <boost/archive/detail/basic_serializer.hpp>\n\n#include <boost/archive/detail/abi_prefix.hpp> // must be the last header\n\n#ifdef BOOST_MSVC\n#  pragma warning(push)\n#  pragma warning(disable : 4511 4512)\n#endif\n\nnamespace boost {\nnamespace serialization {\n    class extended_type_info;\n} // namespace serialization\n\nnamespace archive {\nnamespace detail {\n\nclass basic_oarchive;\nclass basic_oserializer;\n\nclass BOOST_SYMBOL_VISIBLE basic_pointer_oserializer :\n    public basic_serializer\n{\nprotected:\n    explicit BOOST_ARCHIVE_DECL basic_pointer_oserializer(\n        const boost::serialization::extended_type_info & type_\n    );\npublic:\n    virtual BOOST_ARCHIVE_DECL ~basic_pointer_oserializer();\n    virtual const basic_oserializer & get_basic_serializer() const = 0;\n    virtual void save_object_ptr(\n        basic_oarchive & ar,\n        const void * x\n    ) const = 0;\n};\n\n} // namespace detail\n} // namespace archive\n} // namespace boost\n\n#ifdef BOOST_MSVC\n#pragma warning(pop)\n#endif\n\n#include <boost/archive/detail/abi_suffix.hpp> // pops abi_suffix.hpp pragmas\n\n#endif // BOOST_ARCHIVE_BASIC_POINTER_OSERIALIZER_HPP\n"
  },
  {
    "path": "include/boost/archive/detail/basic_serializer.hpp",
    "content": "#ifndef  BOOST_ARCHIVE_BASIC_SERIALIZER_HPP\n#define BOOST_ARCHIVE_BASIC_SERIALIZER_HPP\n\n// MS compatible compilers support #pragma once\n#if defined(_MSC_VER)\n# pragma once\n#endif\n\n/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// basic_serializer.hpp: extension of type_info required for serialization.\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for updates, documentation, and revision history.\n\n#include <boost/assert.hpp>\n#include <cstddef> // NULL\n\n#include <boost/noncopyable.hpp>\n#include <boost/config.hpp>\n#include <boost/serialization/extended_type_info.hpp>\n\n#ifdef BOOST_MSVC\n#  pragma warning(push)\n#  pragma warning(disable : 4511 4512)\n#endif\n\nnamespace boost {\nnamespace archive {\nnamespace detail {\n\nclass basic_serializer :\n    private boost::noncopyable\n{\n    const boost::serialization::extended_type_info * m_eti;\nprotected:\n    explicit basic_serializer(\n        const boost::serialization::extended_type_info & eti\n    ) :\n        m_eti(& eti)\n    {}\npublic:\n    inline bool\n    operator<(const basic_serializer & rhs) const {\n        // can't compare address since there can be multiple eti records\n        // for the same type in different execution modules (that is, DLLS)\n        // leave this here as a reminder not to do this!\n        // return & lhs.get_eti() < & rhs.get_eti();\n        return get_eti() < rhs.get_eti();\n    }\n    const char * get_debug_info() const {\n        return m_eti->get_debug_info();\n    }\n    const boost::serialization::extended_type_info & get_eti() const {\n        return * m_eti;\n    }\n};\n\nclass basic_serializer_arg : public basic_serializer {\npublic:\n    basic_serializer_arg(const serialization::extended_type_info & eti) :\n        basic_serializer(eti)\n    {}\n};\n\n} // namespace detail\n} // namespace archive\n} // namespace boost\n\n#ifdef BOOST_MSVC\n#pragma warning(pop)\n#endif\n\n#endif // BOOST_ARCHIVE_BASIC_SERIALIZER_HPP\n"
  },
  {
    "path": "include/boost/archive/detail/basic_serializer_map.hpp",
    "content": "#ifndef  BOOST_SERIALIZER_MAP_HPP\n#define BOOST_SERIALIZER_MAP_HPP\n\n// MS compatible compilers support #pragma once\n#if defined(_MSC_VER)\n# pragma once\n#endif\n\n/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// basic_serializer_map.hpp: extension of type_info required for serialization.\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for updates, documentation, and revision history.\n\n#include <set>\n\n#include <boost/config.hpp>\n#include <boost/noncopyable.hpp>\n#include <boost/archive/detail/auto_link_archive.hpp>\n\n#include <boost/archive/detail/abi_prefix.hpp> // must be the last header\n\nnamespace boost {\nnamespace serialization {\n    class extended_type_info;\n}\n\nnamespace archive {\nnamespace detail {\n\nclass basic_serializer;\n\nclass BOOST_SYMBOL_VISIBLE\nbasic_serializer_map : public\n    boost::noncopyable\n{\n    struct type_info_pointer_compare\n    {\n        bool operator()(\n            const basic_serializer * lhs, const basic_serializer * rhs\n        ) const ;\n    };\n    typedef std::set<\n        const basic_serializer *,\n        type_info_pointer_compare\n    > map_type;\n    map_type m_map;\npublic:\n    BOOST_ARCHIVE_DECL bool insert(const basic_serializer * bs);\n    BOOST_ARCHIVE_DECL void erase(const basic_serializer * bs);\n    BOOST_ARCHIVE_DECL const basic_serializer * find(\n        const boost::serialization::extended_type_info & type_\n    ) const;\nprivate:\n    // cw 8.3 requires this\n    basic_serializer_map& operator=(basic_serializer_map const&);\n};\n\n} // namespace detail\n} // namespace archive\n} // namespace boost\n\n#include <boost/archive/detail/abi_suffix.hpp> // must be the last header\n\n#endif // BOOST_SERIALIZER_MAP_HPP\n"
  },
  {
    "path": "include/boost/archive/detail/check.hpp",
    "content": "#ifndef BOOST_ARCHIVE_DETAIL_CHECK_HPP\n#define BOOST_ARCHIVE_DETAIL_CHECK_HPP\n\n// MS compatible compilers support #pragma once\n#if defined(_MSC_VER)\n# pragma once\n#if !defined(__clang__)\n#pragma inline_depth(255)\n#pragma inline_recursion(on)\n#endif\n#endif\n\n#if defined(__MWERKS__)\n#pragma inline_depth(255)\n#endif\n\n/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// check.hpp: interface for serialization system.\n\n// (C) Copyright 2009 Robert Ramey - http://www.rrsd.com .\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for updates, documentation, and revision history.\n\n#include <boost/config.hpp>\n\n#include <boost/static_assert.hpp>\n#include <boost/type_traits/is_const.hpp>\n\n#include <boost/mpl/eval_if.hpp>\n#include <boost/mpl/or.hpp>\n#include <boost/mpl/equal_to.hpp>\n#include <boost/mpl/int.hpp>\n#include <boost/mpl/not.hpp>\n#include <boost/mpl/greater.hpp>\n#include <boost/mpl/assert.hpp>\n\n#include <boost/serialization/static_warning.hpp>\n#include <boost/serialization/version.hpp>\n#include <boost/serialization/level.hpp>\n#include <boost/serialization/tracking.hpp>\n#include <boost/serialization/wrapper.hpp>\n\nnamespace boost {\nnamespace archive {\nnamespace detail {\n\n// checks for objects\n\ntemplate<class T>\ninline void check_object_level(){\n    typedef\n        typename mpl::greater_equal<\n            serialization::implementation_level< T >,\n            mpl::int_<serialization::primitive_type>\n        >::type typex;\n\n    // trap attempts to serialize objects marked\n    // not_serializable\n    BOOST_STATIC_ASSERT(typex::value);\n}\n\ntemplate<class T>\ninline void check_object_versioning(){\n    typedef\n        typename mpl::or_<\n            typename mpl::greater<\n                serialization::implementation_level< T >,\n                mpl::int_<serialization::object_serializable>\n            >,\n            typename mpl::equal_to<\n                serialization::version< T >,\n                mpl::int_<0>\n            >\n        > typex;\n    // trap attempts to serialize with objects that don't\n    // save class information in the archive with versioning.\n    BOOST_STATIC_ASSERT(typex::value);\n}\n\ntemplate<class T>\ninline void check_object_tracking(){\n    // presume it has already been determined that\n    // T is not a const\n    BOOST_STATIC_ASSERT(! boost::is_const< T >::value);\n    typedef typename mpl::equal_to<\n        serialization::tracking_level< T >,\n        mpl::int_<serialization::track_never>\n    >::type typex;\n    // saving an non-const object of a type not marked \"track_never)\n\n    // may be an indicator of an error usage of the\n    // serialization library and should be double checked.\n    // See documentation on object tracking.  Also, see the\n    // \"rationale\" section of the documentation\n    // for motivation for this checking.\n\n    BOOST_STATIC_WARNING(typex::value);\n}\n\n// checks for pointers\n\ntemplate<class T>\ninline void check_pointer_level(){\n    // we should only invoke this once we KNOW that T\n    // has been used as a pointer!!\n    typedef\n        typename mpl::or_<\n            typename mpl::greater<\n                serialization::implementation_level< T >,\n                mpl::int_<serialization::object_serializable>\n            >,\n            typename mpl::not_<\n                typename mpl::equal_to<\n                    serialization::tracking_level< T >,\n                    mpl::int_<serialization::track_selectively>\n                >\n            >\n        > typex;\n    // Address the following when serializing to a pointer:\n\n    // a) This type doesn't save class information in the\n    // archive. That is, the serialization trait implementation\n    // level <= object_serializable.\n    // b) Tracking for this type is set to \"track selectively\"\n\n    // in this case, indication that an object is tracked is\n    // not stored in the archive itself - see level == object_serializable\n    // but rather the existence of the operation ar >> T * is used to\n    // infer that an object of this type should be tracked.  So, if\n    // you save via a pointer but don't load via a pointer the operation\n    // will fail on load without given any valid reason for the failure.\n\n    // So if your program traps here, consider changing the\n    // tracking or implementation level traits - or not\n    // serializing via a pointer.\n    BOOST_STATIC_WARNING(typex::value);\n}\n\ntemplate<class T>\nvoid inline check_pointer_tracking(){\n    typedef typename mpl::greater<\n        serialization::tracking_level< T >,\n        mpl::int_<serialization::track_never>\n    >::type typex;\n    // serializing an object of a type marked \"track_never\" through a pointer\n    // could result in creating more objects than were saved!\n    BOOST_STATIC_WARNING(typex::value);\n}\n\ntemplate<class T>\ninline void check_const_loading(){\n    typedef\n        typename mpl::or_<\n            typename boost::serialization::is_wrapper< T >,\n            typename mpl::not_<\n                typename boost::is_const< T >\n            >\n        >::type typex;\n    // cannot load data into a \"const\" object unless it's a\n    // wrapper around some other non-const object.\n    BOOST_STATIC_ASSERT(typex::value);\n}\n\n} // detail\n} // archive\n} // boost\n\n#endif // BOOST_ARCHIVE_DETAIL_CHECK_HPP\n"
  },
  {
    "path": "include/boost/archive/detail/common_iarchive.hpp",
    "content": "#ifndef BOOST_ARCHIVE_DETAIL_COMMON_IARCHIVE_HPP\n#define BOOST_ARCHIVE_DETAIL_COMMON_IARCHIVE_HPP\n\n// MS compatible compilers support #pragma once\n#if defined(_MSC_VER)\n# pragma once\n#endif\n\n/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// common_iarchive.hpp\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for updates, documentation, and revision history.\n\n#include <boost/config.hpp>\n\n#include <boost/archive/detail/basic_iarchive.hpp>\n#include <boost/archive/detail/basic_pointer_iserializer.hpp>\n#include <boost/archive/detail/interface_iarchive.hpp>\n\n#ifdef BOOST_MSVC\n#  pragma warning(push)\n#  pragma warning(disable : 4511 4512)\n#endif\n\nnamespace boost {\nnamespace archive {\nnamespace detail {\n\nclass extended_type_info;\n\n// note: referred to as Curiously Recurring Template Patter (CRTP)\ntemplate<class Archive>\nclass BOOST_SYMBOL_VISIBLE common_iarchive :\n    public basic_iarchive,\n    public interface_iarchive<Archive>\n{\n    friend class interface_iarchive<Archive>;\n    friend class basic_iarchive;\nprivate:\n    void vload(version_type & t) BOOST_OVERRIDE {\n        * this->This() >> t;\n    }\n    void vload(object_id_type & t) BOOST_OVERRIDE {\n        * this->This() >> t;\n    }\n    void vload(class_id_type & t) BOOST_OVERRIDE {\n        * this->This() >> t;\n    }\n    void vload(class_id_optional_type & t) BOOST_OVERRIDE {\n        * this->This() >> t;\n    }\n    void vload(tracking_type & t) BOOST_OVERRIDE {\n        * this->This() >> t;\n    }\n    void vload(class_name_type &s) BOOST_OVERRIDE {\n        * this->This() >> s;\n    }\nprotected:\n    // default processing - invoke serialization library\n    template<class T>\n    void load_override(T & t){\n        archive::load(* this->This(), t);\n    }\n    // default implementations of functions which emit start/end tags for\n    // archive types that require them.\n    void load_start(const char * /*name*/){}\n    void load_end(const char * /*name*/){}\n    // default archive initialization\n    common_iarchive(unsigned int flags = 0) :\n        basic_iarchive(flags),\n        interface_iarchive<Archive>()\n    {}\n};\n\n} // namespace detail\n} // namespace archive\n} // namespace boost\n\n#ifdef BOOST_MSVC\n#pragma warning(pop)\n#endif\n\n#endif // BOOST_ARCHIVE_DETAIL_COMMON_IARCHIVE_HPP\n"
  },
  {
    "path": "include/boost/archive/detail/common_oarchive.hpp",
    "content": "#ifndef BOOST_ARCHIVE_DETAIL_COMMON_OARCHIVE_HPP\n#define BOOST_ARCHIVE_DETAIL_COMMON_OARCHIVE_HPP\n\n// MS compatible compilers support #pragma once\n#if defined(_MSC_VER)\n# pragma once\n#endif\n\n/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// common_oarchive.hpp\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for updates, documentation, and revision history.\n\n#include <boost/config.hpp>\n\n#include <boost/archive/detail/basic_oarchive.hpp>\n#include <boost/archive/detail/interface_oarchive.hpp>\n\n#ifdef BOOST_MSVC\n#  pragma warning(push)\n#  pragma warning(disable : 4511 4512)\n#endif\n\nnamespace boost {\nnamespace archive {\nnamespace detail {\n\n// note: referred to as Curiously Recurring Template Patter (CRTP)\ntemplate<class Archive>\n\nclass BOOST_SYMBOL_VISIBLE common_oarchive :\n    public basic_oarchive,\n    public interface_oarchive<Archive>\n{\n    friend class interface_oarchive<Archive>;\n    friend class basic_oarchive;\nprivate:\n    void vsave(const version_type t) BOOST_OVERRIDE {\n        * this->This() << t;\n    }\n    void vsave(const object_id_type t) BOOST_OVERRIDE {\n        * this->This() << t;\n    }\n    void vsave(const object_reference_type t) BOOST_OVERRIDE {\n        * this->This() << t;\n    }\n    void vsave(const class_id_type t) BOOST_OVERRIDE {\n        * this->This() << t;\n    }\n    void vsave(const class_id_reference_type t) BOOST_OVERRIDE {\n        * this->This() << t;\n    }\n    void vsave(const class_id_optional_type t) BOOST_OVERRIDE {\n        * this->This() << t;\n    }\n    void vsave(const class_name_type & t) BOOST_OVERRIDE {\n        * this->This() << t;\n    }\n    void vsave(const tracking_type t) BOOST_OVERRIDE {\n        * this->This() << t;\n    }\nprotected:\n    // default processing - invoke serialization library\n    template<class T>\n    void save_override(T & t){\n        archive::save(* this->This(), t);\n    }\n    void save_start(const char * /*name*/){}\n    void save_end(const char * /*name*/){}\n    common_oarchive(unsigned int flags = 0) :\n        basic_oarchive(flags),\n        interface_oarchive<Archive>()\n    {}\n};\n\n} // namespace detail\n} // namespace archive\n} // namespace boost\n\n#ifdef BOOST_MSVC\n#pragma warning(pop)\n#endif\n\n#endif // BOOST_ARCHIVE_DETAIL_COMMON_OARCHIVE_HPP\n"
  },
  {
    "path": "include/boost/archive/detail/decl.hpp",
    "content": "#ifndef BOOST_ARCHIVE_DETAIL_DECL_HPP\n#define BOOST_ARCHIVE_DETAIL_DECL_HPP\n\n// MS compatible compilers support #pragma once\n#if defined(_MSC_VER)\n# pragma once\n#endif\n\n/////////1/////////2///////// 3/////////4/////////5/////////6/////////7/////////8\n//  decl.hpp\n//\n//  (c) Copyright Robert Ramey 2004\n//  Use, modification, and distribution is subject to the Boost Software\n//  License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n//  http://www.boost.org/LICENSE_1_0.txt)\n\n//  See library home page at http://www.boost.org/libs/serialization\n\n//----------------------------------------------------------------------------//\n\n// This header implements separate compilation features as described in\n// http://www.boost.org/more/separate_compilation.html\n\n#include <boost/config.hpp>\n\n#if (defined(BOOST_ALL_DYN_LINK) || defined(BOOST_SERIALIZATION_DYN_LINK))\n    #if defined(BOOST_ARCHIVE_SOURCE)\n        #define BOOST_ARCHIVE_DECL BOOST_SYMBOL_EXPORT\n    #else\n        #define BOOST_ARCHIVE_DECL BOOST_SYMBOL_IMPORT\n    #endif\n\n    #if defined(BOOST_WARCHIVE_SOURCE)\n        #define BOOST_WARCHIVE_DECL BOOST_SYMBOL_EXPORT\n    #else\n        #define BOOST_WARCHIVE_DECL BOOST_SYMBOL_IMPORT\n    #endif\n\n    #if defined(BOOST_WARCHIVE_SOURCE) || defined(BOOST_ARCHIVE_SOURCE)\n        #define BOOST_ARCHIVE_OR_WARCHIVE_DECL BOOST_SYMBOL_EXPORT\n    #else\n        #define BOOST_ARCHIVE_OR_WARCHIVE_DECL BOOST_SYMBOL_IMPORT\n    #endif\n\n#endif\n\n#if ! defined(BOOST_ARCHIVE_DECL)\n    #define BOOST_ARCHIVE_DECL\n#endif\n#if ! defined(BOOST_WARCHIVE_DECL)\n    #define BOOST_WARCHIVE_DECL\n#endif\n#if ! defined(BOOST_ARCHIVE_OR_WARCHIVE_DECL)\n    #define BOOST_ARCHIVE_OR_WARCHIVE_DECL\n#endif\n\n#endif // BOOST_ARCHIVE_DETAIL_DECL_HPP\n"
  },
  {
    "path": "include/boost/archive/detail/helper_collection.hpp",
    "content": "#ifndef BOOST_ARCHIVE_DETAIL_HELPER_COLLECTION_HPP\n#define BOOST_ARCHIVE_DETAIL_HELPER_COLLECTION_HPP\n\n// MS compatible compilers support #pragma once\n#if defined(_MSC_VER) && (_MSC_VER >= 1020)\n# pragma once\n#endif\n\n/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// helper_collection.hpp: archive support for run-time helpers\n\n// (C) Copyright 2002-2008 Robert Ramey and Joaquin M Lopez Munoz\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for updates, documentation, and revision history.\n\n#include <cstddef> // NULL\n#include <vector>\n#include <utility>\n#include <memory>\n#include <algorithm>\n\n#include <boost/config.hpp>\n\n#include <boost/smart_ptr/shared_ptr.hpp>\n#include <boost/smart_ptr/make_shared.hpp>\n\nnamespace boost {\n\nnamespace archive {\nnamespace detail {\n\nclass helper_collection\n{\n    helper_collection(const helper_collection&);              // non-copyable\n    helper_collection& operator = (const helper_collection&); // non-copyable\n\n    // note: we dont' actually \"share\" the function object pointer\n    // we only use shared_ptr to make sure that it get's deleted\n\n    typedef std::pair<\n        const void *,\n        boost::shared_ptr<void>\n    > helper_value_type;\n    template<class T>\n    boost::shared_ptr<void> make_helper_ptr(){\n        // use boost::shared_ptr rather than std::shared_ptr to maintain\n        // c++03 compatibility\n        return boost::make_shared<T>();\n    }\n\n    typedef std::vector<helper_value_type> collection;\n    collection m_collection;\n\n    struct predicate {\n        BOOST_DEFAULTED_FUNCTION(predicate(const predicate& rhs), : m_ti(rhs.m_ti) {})\n        BOOST_DELETED_FUNCTION(predicate & operator=(const predicate & rhs))\n    public:\n        const void * const m_ti;\n        bool operator()(helper_value_type const &rhs){\n            return m_ti == rhs.first;\n        }\n        predicate(const void * ti) :\n            m_ti(ti)\n        {}\n    };\nprotected:\n    helper_collection(){}\n    ~helper_collection(){}\npublic:\n    template<typename Helper>\n    Helper& find_helper(void * const id = 0) {\n        collection::const_iterator it =\n            std::find_if(\n                m_collection.begin(),\n                m_collection.end(),\n                predicate(id)\n            );\n\n        void * rval = 0;\n        if(it == m_collection.end()){\n            m_collection.push_back(\n                std::make_pair(id, make_helper_ptr<Helper>())\n            );\n            rval = m_collection.back().second.get();\n        }\n        else{\n            rval = it->second.get();\n        }\n        return *static_cast<Helper *>(rval);\n    }\n};\n\n} // namespace detail\n} // namespace serialization\n} // namespace boost\n\n#endif // BOOST_ARCHIVE_DETAIL_HELPER_COLLECTION_HPP\n"
  },
  {
    "path": "include/boost/archive/detail/interface_iarchive.hpp",
    "content": "#ifndef BOOST_ARCHIVE_DETAIL_INTERFACE_IARCHIVE_HPP\n#define BOOST_ARCHIVE_DETAIL_INTERFACE_IARCHIVE_HPP\n\n// MS compatible compilers support #pragma once\n#if defined(_MSC_VER)\n# pragma once\n#endif\n\n/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// interface_iarchive.hpp\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for updates, documentation, and revision history.\n#include <cstddef> // NULL\n#include <boost/cstdint.hpp>\n#include <boost/mpl/bool.hpp>\n#include <boost/archive/detail/auto_link_archive.hpp>\n#include <boost/archive/detail/iserializer.hpp>\n#include <boost/archive/detail/helper_collection.hpp>\n#include <boost/serialization/singleton.hpp>\n#include <boost/archive/detail/abi_prefix.hpp> // must be the last header\n\nnamespace boost {\nnamespace archive {\nnamespace detail {\n\nclass basic_pointer_iserializer;\n\ntemplate<class Archive>\nclass interface_iarchive\n{\nprotected:\n    interface_iarchive() {}\npublic:\n    /////////////////////////////////////////////////////////\n    // archive public interface\n    typedef mpl::bool_<true> is_loading;\n    typedef mpl::bool_<false> is_saving;\n\n    // return a pointer to the most derived class\n    Archive * This(){\n        return static_cast<Archive *>(this);\n    }\n\n    template<class T>\n    const basic_pointer_iserializer *\n    register_type(T * = NULL){\n        const basic_pointer_iserializer & bpis =\n            boost::serialization::singleton<\n                pointer_iserializer<Archive, T>\n            >::get_const_instance();\n        this->This()->register_basic_serializer(bpis.get_basic_serializer());\n        return & bpis;\n    }\n    template<class Helper>\n    Helper &\n    get_helper(void * const id = 0){\n        helper_collection & hc = this->This()->get_helper_collection();\n        return hc.template find_helper<Helper>(id);\n    }\n\n    template<class T>\n    Archive & operator>>(T & t){\n        this->This()->load_override(t);\n        return * this->This();\n    }\n\n    // the & operator\n    template<class T>\n    Archive & operator&(T & t){\n        return *(this->This()) >> t;\n    }\n};\n\n} // namespace detail\n} // namespace archive\n} // namespace boost\n\n#include <boost/archive/detail/abi_suffix.hpp> // pops abi_suffix.hpp pragmas\n\n#endif // BOOST_ARCHIVE_DETAIL_INTERFACE_IARCHIVE_HPP\n"
  },
  {
    "path": "include/boost/archive/detail/interface_oarchive.hpp",
    "content": "#ifndef BOOST_ARCHIVE_DETAIL_INTERFACE_OARCHIVE_HPP\n#define BOOST_ARCHIVE_DETAIL_INTERFACE_OARCHIVE_HPP\n\n// MS compatible compilers support #pragma once\n#if defined(_MSC_VER)\n# pragma once\n#endif\n\n/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// interface_oarchive.hpp\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for updates, documentation, and revision history.\n#include <cstddef> // NULL\n#include <boost/cstdint.hpp>\n#include <boost/mpl/bool.hpp>\n#include <boost/detail/workaround.hpp>\n\n#include <boost/archive/detail/auto_link_archive.hpp>\n#include <boost/archive/detail/oserializer.hpp>\n#include <boost/archive/detail/abi_prefix.hpp> // must be the last header\n\n#include <boost/serialization/singleton.hpp>\n\nnamespace boost {\nnamespace archive {\nnamespace detail {\n\nclass basic_pointer_oserializer;\n\ntemplate<class Archive>\nclass interface_oarchive\n{\nprotected:\n    interface_oarchive() {}\npublic:\n    /////////////////////////////////////////////////////////\n    // archive public interface\n    typedef mpl::bool_<false> is_loading;\n    typedef mpl::bool_<true> is_saving;\n\n    // return a pointer to the most derived class\n    Archive * This(){\n        return static_cast<Archive*>(this);\n    }\n\n    template<class T>\n    const basic_pointer_oserializer *\n    register_type(const T * = NULL){\n        const basic_pointer_oserializer & bpos =\n            boost::serialization::singleton<\n                pointer_oserializer<Archive, T>\n            >::get_const_instance();\n        this->This()->register_basic_serializer(bpos.get_basic_serializer());\n        return & bpos;\n    }\n\n    template<class Helper>\n    Helper &\n    get_helper(void * const id = 0){\n        helper_collection & hc = this->This()->get_helper_collection();\n        return hc.template find_helper<Helper>(id);\n    }\n\n    template<class T>\n    Archive & operator<<(const T & t){\n        this->This()->save_override(t);\n        return * this->This();\n    }\n\n    // the & operator\n    template<class T>\n    Archive & operator&(const T & t){\n        return * this ->This() << t;\n    }\n};\n\n} // namespace detail\n} // namespace archive\n} // namespace boost\n\n#include <boost/archive/detail/abi_suffix.hpp> // pops abi_suffix.hpp pragmas\n\n#endif // BOOST_ARCHIVE_DETAIL_INTERFACE_IARCHIVE_HPP\n"
  },
  {
    "path": "include/boost/archive/detail/iserializer.hpp",
    "content": "#ifndef BOOST_ARCHIVE_DETAIL_ISERIALIZER_HPP\n#define BOOST_ARCHIVE_DETAIL_ISERIALIZER_HPP\n\n// MS compatible compilers support #pragma once\n#if defined(BOOST_MSVC)\n# pragma once\n#if !defined(__clang__)\n#pragma inline_depth(255)\n#pragma inline_recursion(on)\n#endif\n#endif\n\n#if defined(__MWERKS__)\n#pragma inline_depth(255)\n#endif\n\n/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// iserializer.hpp: interface for serialization system.\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for updates, documentation, and revision history.\n\n#include <new>     // for placement new\n#include <cstddef> // size_t, NULL\n\n#include <boost/config.hpp>\n#include <boost/detail/workaround.hpp>\n#if defined(BOOST_NO_STDC_NAMESPACE)\nnamespace std{\n    using ::size_t;\n} // namespace std\n#endif\n\n#include <boost/static_assert.hpp>\n\n#include <boost/mpl/eval_if.hpp>\n#include <boost/mpl/identity.hpp>\n#include <boost/mpl/greater_equal.hpp>\n#include <boost/mpl/equal_to.hpp>\n#include <boost/core/no_exceptions_support.hpp>\n\n#ifndef BOOST_SERIALIZATION_DEFAULT_TYPE_INFO\n    #include <boost/serialization/extended_type_info_typeid.hpp>\n#endif\n#include <boost/serialization/throw_exception.hpp>\n#include <boost/serialization/smart_cast.hpp>\n#include <boost/serialization/static_warning.hpp>\n\n#include <boost/type_traits/is_pointer.hpp>\n#include <boost/type_traits/is_enum.hpp>\n#include <boost/type_traits/is_const.hpp>\n#include <boost/type_traits/remove_const.hpp>\n#include <boost/type_traits/remove_extent.hpp>\n#include <boost/type_traits/is_polymorphic.hpp>\n\n#include <boost/serialization/assume_abstract.hpp>\n\n#if !defined(BOOST_MSVC) && \\\n    (BOOST_WORKAROUND(__IBMCPP__, < 1210) || \\\n    defined(__SUNPRO_CC) && (__SUNPRO_CC < 0x590))\n    #define BOOST_SERIALIZATION_DONT_USE_HAS_NEW_OPERATOR 1\n#else\n    #define BOOST_SERIALIZATION_DONT_USE_HAS_NEW_OPERATOR 0\n#endif\n\n#if ! BOOST_SERIALIZATION_DONT_USE_HAS_NEW_OPERATOR\n#include <boost/type_traits/has_new_operator.hpp>\n#endif\n\n#include <boost/serialization/serialization.hpp>\n#include <boost/serialization/version.hpp>\n#include <boost/serialization/level.hpp>\n#include <boost/serialization/tracking.hpp>\n#include <boost/serialization/type_info_implementation.hpp>\n#include <boost/serialization/nvp.hpp>\n#include <boost/serialization/void_cast.hpp>\n#include <boost/serialization/collection_size_type.hpp>\n#include <boost/serialization/singleton.hpp>\n#include <boost/serialization/wrapper.hpp>\n#include <boost/serialization/array_wrapper.hpp>\n\n// the following is need only for dynamic cast of polymorphic pointers\n#include <boost/archive/archive_exception.hpp>\n#include <boost/archive/detail/basic_iarchive.hpp>\n#include <boost/archive/detail/basic_iserializer.hpp>\n#include <boost/archive/detail/basic_pointer_iserializer.hpp>\n#include <boost/archive/detail/archive_serializer_map.hpp>\n#include <boost/archive/detail/check.hpp>\n\n#include <boost/core/addressof.hpp>\n\nnamespace boost {\n\nnamespace serialization {\n    class extended_type_info;\n} // namespace serialization\n\nnamespace archive {\n\n// an accessor to permit friend access to archives.  Needed because\n// some compilers don't handle friend templates completely\nclass load_access {\npublic:\n    template<class Archive, class T>\n    static void load_primitive(Archive &ar, T &t){\n        ar.load(t);\n    }\n};\n\nnamespace detail {\n\n#ifdef BOOST_MSVC\n#  pragma warning(push)\n#  pragma warning(disable : 4511 4512)\n#endif\n\ntemplate<class Archive, class T>\nclass iserializer : public basic_iserializer\n{\nprivate:\n    void destroy(/*const*/ void *address) const BOOST_OVERRIDE {\n        boost::serialization::access::destroy(static_cast<T *>(address));\n    }\npublic:\n    explicit iserializer() :\n        basic_iserializer(\n            boost::serialization::singleton<\n                typename\n                boost::serialization::type_info_implementation< T >::type\n            >::get_const_instance()\n        )\n    {}\n    BOOST_DLLEXPORT void load_object_data(\n        basic_iarchive & ar,\n        void *x,\n        const unsigned int file_version\n    ) const BOOST_OVERRIDE BOOST_USED;\n    bool class_info() const BOOST_OVERRIDE {\n        return boost::serialization::implementation_level< T >::value\n            >= boost::serialization::object_class_info;\n    }\n    bool tracking(const unsigned int /* flags */) const BOOST_OVERRIDE {\n        return boost::serialization::tracking_level< T >::value\n                == boost::serialization::track_always\n            || ( boost::serialization::tracking_level< T >::value\n                == boost::serialization::track_selectively\n                && serialized_as_pointer());\n    }\n    version_type version() const BOOST_OVERRIDE {\n        return version_type(::boost::serialization::version< T >::value);\n    }\n    bool is_polymorphic() const BOOST_OVERRIDE {\n        return boost::is_polymorphic< T >::value;\n    }\n    ~iserializer() BOOST_OVERRIDE {}\n};\n\n#ifdef BOOST_MSVC\n#  pragma warning(pop)\n#endif\n\ntemplate<class Archive, class T>\nBOOST_DLLEXPORT void iserializer<Archive, T>::load_object_data(\n    basic_iarchive & ar,\n    void *x,\n    const unsigned int file_version\n) const {\n    // note: we now comment this out. Before we permitted archive\n    // version # to be very large.  Now we don't.  To permit\n    // readers of these old archives, we have to suppress this\n    // code.  Perhaps in the future we might re-enable it but\n    // permit its suppression with a runtime switch.\n    #if 1\n    // trap case where the program cannot handle the current version\n    if(file_version > static_cast<const unsigned int>(version()))\n        boost::serialization::throw_exception(\n            archive::archive_exception(\n                boost::archive::archive_exception::unsupported_class_version,\n                get_debug_info()\n            )\n        );\n    #endif\n    // make sure call is routed through the highest interface that might\n    // be specialized by the user.\n    boost::serialization::serialize_adl(\n        boost::serialization::smart_cast_reference<Archive &>(ar),\n        * static_cast<T *>(x),\n        file_version\n    );\n}\n\n#ifdef BOOST_MSVC\n#  pragma warning(push)\n#  pragma warning(disable : 4511 4512)\n#endif\n\n// the purpose of this code is to allocate memory for an object\n// without requiring the constructor to be called.  Presumably\n// the allocated object will be subsequently initialized with\n// \"placement new\".\n// note: we have the boost type trait has_new_operator but we\n// have no corresponding has_delete_operator.  So we presume\n// that the former being true would imply that the a delete\n// operator is also defined for the class T.\n\ntemplate<class T>\nstruct heap_allocation {\n    // boost::has_new_operator< T > doesn't work on these compilers\n    #if BOOST_SERIALIZATION_DONT_USE_HAS_NEW_OPERATOR\n        // This doesn't handle operator new overload for class T\n        static T * invoke_new(){\n            return static_cast<T *>(operator new(sizeof(T)));\n        }\n        static void invoke_delete(T *t){\n            (operator delete(t));\n        }\n    #else\n        // note: we presume that a true value for has_new_operator\n        // implies the existence of a class specific delete operator as well\n        // as a class specific new operator.\n        struct has_new_operator {\n            static T * invoke_new() {\n                return static_cast<T *>((T::operator new)(sizeof(T)));\n            }\n            static void invoke_delete(T * t) {\n                // if compilation fails here, the likely cause that the class\n                // T has a class specific new operator but no class specific\n                // delete operator which matches the following signature.\n                // note that this solution addresses the issue that two\n                // possible signatures.  But it doesn't address the possibility\n                // that the class might have class specific new with NO\n                // class specific delete at all.  Patches (compatible with\n                // C++03) welcome!\n                (operator delete)(t);\n            }\n        };\n        struct doesnt_have_new_operator {\n            static T* invoke_new() {\n                return static_cast<T *>(operator new(sizeof(T)));\n            }\n            static void invoke_delete(T * t) {\n                // Note: I'm reliance upon automatic conversion from T * to void * here\n                (operator delete)(t);\n            }\n        };\n        static T * invoke_new() {\n            typedef typename\n                mpl::eval_if<\n                    boost::has_new_operator< T >,\n                    mpl::identity<has_new_operator >,\n                    mpl::identity<doesnt_have_new_operator >\n                >::type typex;\n            return typex::invoke_new();\n        }\n        static void invoke_delete(T *t) {\n            typedef typename\n                mpl::eval_if<\n                    boost::has_new_operator< T >,\n                    mpl::identity<has_new_operator >,\n                    mpl::identity<doesnt_have_new_operator >\n                >::type typex;\n            typex::invoke_delete(t);\n        }\n    #endif\n    explicit heap_allocation(){\n        m_p = invoke_new();\n    }\n    ~heap_allocation(){\n        if (0 != m_p)\n            invoke_delete(m_p);\n    }\n    T* get() const {\n        return m_p;\n    }\n\n    T* release() {\n        T* p = m_p;\n        m_p = 0;\n        return p;\n    }\nprivate:\n    T* m_p;\n};\n\ntemplate<class Archive, class T>\nclass pointer_iserializer :\n    public basic_pointer_iserializer\n{\nprivate:\n    void * heap_allocation() const BOOST_OVERRIDE {\n        detail::heap_allocation<T> h;\n        T * t = h.get();\n        h.release();\n        return t;\n    }\n    const basic_iserializer & get_basic_serializer() const BOOST_OVERRIDE {\n        return boost::serialization::singleton<\n            iserializer<Archive, T>\n        >::get_const_instance();\n    }\n    BOOST_DLLEXPORT void load_object_ptr(\n        basic_iarchive & ar,\n        void * x,\n        const unsigned int file_version\n    ) const BOOST_OVERRIDE BOOST_USED;\npublic:\n    // this should always be a singleton so make the constructor protected\n    pointer_iserializer();\n    ~pointer_iserializer() BOOST_OVERRIDE;\n};\n\n#ifdef BOOST_MSVC\n#  pragma warning(pop)\n#endif\n\n// note: BOOST_DLLEXPORT is so that code for polymorphic class\n// serialized only through base class won't get optimized out\ntemplate<class Archive, class T>\nBOOST_DLLEXPORT void pointer_iserializer<Archive, T>::load_object_ptr(\n    basic_iarchive & ar,\n    void * t,\n    const unsigned int file_version\n) const\n{\n    Archive & ar_impl =\n        boost::serialization::smart_cast_reference<Archive &>(ar);\n\n    // note that the above will throw std::bad_alloc if the allocation\n    // fails so we don't have to address this contingency here.\n\n    // catch exception during load_construct_data so that we don't\n    // automatically delete the t which is most likely not fully\n    // constructed\n    BOOST_TRY {\n        // this addresses an obscure situation that occurs when\n        // load_constructor de-serializes something through a pointer.\n        ar.next_object_pointer(t);\n        boost::serialization::load_construct_data_adl<Archive, T>(\n            ar_impl,\n            static_cast<T *>(t),\n            file_version\n        );\n    }\n    BOOST_CATCH(...){\n        // if we get here the load_construct failed.  The heap_allocation\n        // will be automatically deleted so we don't have to do anything\n        // special here.\n        BOOST_RETHROW;\n    }\n    BOOST_CATCH_END\n\n    ar_impl >> boost::serialization::make_nvp(NULL, * static_cast<T *>(t));\n}\n\ntemplate<class Archive, class T>\npointer_iserializer<Archive, T>::pointer_iserializer() :\n    basic_pointer_iserializer(\n        boost::serialization::singleton<\n            typename\n            boost::serialization::type_info_implementation< T >::type\n        >::get_const_instance()\n    )\n{\n    boost::serialization::singleton<\n        iserializer<Archive, T>\n    >::get_mutable_instance().set_bpis(this);\n    archive_serializer_map<Archive>::insert(this);\n}\n\ntemplate<class Archive, class T>\npointer_iserializer<Archive, T>::~pointer_iserializer(){\n    archive_serializer_map<Archive>::erase(this);\n}\n\ntemplate<class Archive>\nstruct load_non_pointer_type {\n    // note this bounces the call right back to the archive\n    // with no runtime overhead\n    struct load_primitive {\n        template<class T>\n        static void invoke(Archive & ar, T & t){\n            load_access::load_primitive(ar, t);\n        }\n    };\n    // note this bounces the call right back to the archive\n    // with no runtime overhead\n    struct load_only {\n        template<class T>\n        static void invoke(Archive & ar, const T & t){\n            // short cut to user's serializer\n            // make sure call is routed through the highest interface that might\n            // be specialized by the user.\n            boost::serialization::serialize_adl(\n                ar,\n                const_cast<T &>(t),\n                boost::serialization::version< T >::value\n            );\n        }\n    };\n\n    // note this save class information including version\n    // and serialization level to the archive\n    struct load_standard {\n        template<class T>\n        static void invoke(Archive &ar, const T & t){\n            void * x = boost::addressof(const_cast<T &>(t));\n            ar.load_object(\n                x,\n                boost::serialization::singleton<\n                    iserializer<Archive, T>\n                >::get_const_instance()\n            );\n        }\n    };\n\n    struct load_conditional {\n        template<class T>\n        static void invoke(Archive &ar, T &t){\n            //if(0 == (ar.get_flags() & no_tracking))\n                load_standard::invoke(ar, t);\n            //else\n            //    load_only::invoke(ar, t);\n        }\n    };\n\n    template<class T>\n    static void invoke(Archive & ar, T &t){\n        typedef typename mpl::eval_if<\n                // if its primitive\n                mpl::equal_to<\n                    boost::serialization::implementation_level< T >,\n                    mpl::int_<boost::serialization::primitive_type>\n                >,\n                mpl::identity<load_primitive>,\n            // else\n            typename mpl::eval_if<\n            // class info / version\n            mpl::greater_equal<\n                        boost::serialization::implementation_level< T >,\n                        mpl::int_<boost::serialization::object_class_info>\n                    >,\n            // do standard load\n            mpl::identity<load_standard>,\n        // else\n        typename mpl::eval_if<\n            // no tracking\n                    mpl::equal_to<\n                        boost::serialization::tracking_level< T >,\n                        mpl::int_<boost::serialization::track_never>\n                >,\n                // do a fast load\n                mpl::identity<load_only>,\n            // else\n            // do a fast load only tracking is turned off\n            mpl::identity<load_conditional>\n        > > >::type typex;\n        check_object_versioning< T >();\n        check_object_level< T >();\n        typex::invoke(ar, t);\n    }\n};\n\ntemplate<class Archive>\nstruct load_pointer_type {\n    struct abstract\n    {\n        template<class T>\n        static const basic_pointer_iserializer * register_type(Archive & /* ar */){\n            // it has? to be polymorphic\n            BOOST_STATIC_ASSERT(boost::is_polymorphic< T >::value);\n            return static_cast<basic_pointer_iserializer *>(NULL);\n         }\n    };\n\n    struct non_abstract\n    {\n        template<class T>\n        static const basic_pointer_iserializer * register_type(Archive & ar){\n            return ar.register_type(static_cast<T *>(NULL));\n        }\n    };\n\n    template<class T>\n    static const basic_pointer_iserializer * register_type(Archive &ar, const T* const /*t*/){\n        // there should never be any need to load an abstract polymorphic\n        // class pointer.  Inhibiting code generation for this\n        // permits abstract base classes to be used - note: exception\n        // virtual serialize functions used for plug-ins\n        typedef typename\n            mpl::eval_if<\n                boost::serialization::is_abstract<const T>,\n                boost::mpl::identity<abstract>,\n                boost::mpl::identity<non_abstract>\n            >::type typex;\n        return typex::template register_type< T >(ar);\n    }\n\n    template<class T>\n    static T * pointer_tweak(\n        const boost::serialization::extended_type_info & eti,\n        void const * const t,\n        const T &\n    ) {\n        // tweak the pointer back to the base class\n        void * upcast = const_cast<void *>(\n            boost::serialization::void_upcast(\n                eti,\n                boost::serialization::singleton<\n                    typename\n                    boost::serialization::type_info_implementation< T >::type\n                >::get_const_instance(),\n                t\n            )\n        );\n        if(NULL == upcast)\n            boost::serialization::throw_exception(\n                archive_exception(archive_exception::unregistered_class)\n            );\n        return static_cast<T *>(upcast);\n    }\n\n    template<class T>\n    static void check_load(T * const /* t */){\n        check_pointer_level< T >();\n        check_pointer_tracking< T >();\n    }\n\n    static const basic_pointer_iserializer *\n    find(const boost::serialization::extended_type_info & type){\n        return static_cast<const basic_pointer_iserializer *>(\n            archive_serializer_map<Archive>::find(type)\n        );\n    }\n\n    template<class Tptr>\n    static void invoke(Archive & ar, Tptr & t){\n        check_load(t);\n        const basic_pointer_iserializer * bpis_ptr = register_type(ar, t);\n        const basic_pointer_iserializer * newbpis_ptr = ar.load_pointer(\n            // note major hack here !!!\n            // I tried every way to convert Tptr &t (where Tptr might\n            // include const) to void * &.  This is the only way\n            // I could make it work. RR\n            (void * & )t,\n            bpis_ptr,\n            find\n        );\n        // if the pointer isn't that of the base class\n        if(newbpis_ptr != bpis_ptr){\n            t = pointer_tweak(newbpis_ptr->get_eti(), t, *t);\n        }\n    }\n};\n\ntemplate<class Archive>\nstruct load_enum_type {\n    template<class T>\n    static void invoke(Archive &ar, T &t){\n        // convert integers to correct enum to load\n        int i;\n        ar >> boost::serialization::make_nvp(NULL, i);\n        t = static_cast< T >(i);\n    }\n};\n\ntemplate<class Archive>\nstruct load_array_type {\n    template<class T>\n    static void invoke(Archive &ar, T &t){\n        typedef typename remove_extent< T >::type value_type;\n\n        // convert integers to correct enum to load\n        // determine number of elements in the array. Consider the\n        // fact that some machines will align elements on boundaries\n        // other than characters.\n        std::size_t current_count = sizeof(t) / (\n            static_cast<char *>(static_cast<void *>(&t[1]))\n            - static_cast<char *>(static_cast<void *>(&t[0]))\n        );\n        boost::serialization::collection_size_type count;\n        ar >> BOOST_SERIALIZATION_NVP(count);\n        if(static_cast<std::size_t>(count) > current_count)\n            boost::serialization::throw_exception(\n                archive::archive_exception(\n                    boost::archive::archive_exception::array_size_too_short\n                )\n            );\n        // explicit template arguments to pass intel C++ compiler\n        ar >> serialization::make_array<\n            value_type,\n            boost::serialization::collection_size_type\n        >(\n            static_cast<value_type *>(&t[0]),\n            count\n        );\n    }\n};\n\n} // detail\n\ntemplate<class Archive, class T>\ninline void load(Archive & ar, T &t){\n    // if this assertion trips. It means we're trying to load a\n    // const object with a compiler that doesn't have correct\n    // function template ordering.  On other compilers, this is\n    // handled below.\n    detail::check_const_loading< T >();\n    typedef\n        typename mpl::eval_if<is_pointer< T >,\n            mpl::identity<detail::load_pointer_type<Archive> >\n        ,//else\n        typename mpl::eval_if<is_array< T >,\n            mpl::identity<detail::load_array_type<Archive> >\n        ,//else\n        typename mpl::eval_if<is_enum< T >,\n            mpl::identity<detail::load_enum_type<Archive> >\n        ,//else\n            mpl::identity<detail::load_non_pointer_type<Archive> >\n        >\n        >\n        >::type typex;\n    typex::invoke(ar, t);\n}\n\n} // namespace archive\n} // namespace boost\n\n#endif // BOOST_ARCHIVE_DETAIL_ISERIALIZER_HPP\n"
  },
  {
    "path": "include/boost/archive/detail/oserializer.hpp",
    "content": "#ifndef BOOST_ARCHIVE_OSERIALIZER_HPP\n#define BOOST_ARCHIVE_OSERIALIZER_HPP\n\n// MS compatible compilers support #pragma once\n#if defined(_MSC_VER)\n# pragma once\n#if !defined(__clang__)\n#pragma inline_depth(255)\n#pragma inline_recursion(on)\n#endif\n#endif\n\n#if defined(__MWERKS__)\n#pragma inline_depth(255)\n#endif\n\n/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// oserializer.hpp: interface for serialization system.\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for updates, documentation, and revision history.\n\n#include <boost/assert.hpp>\n#include <cstddef> // NULL\n\n#include <boost/config.hpp>\n\n#include <boost/static_assert.hpp>\n#include <boost/detail/workaround.hpp>\n\n#include <boost/mpl/eval_if.hpp>\n#include <boost/mpl/equal_to.hpp>\n#include <boost/mpl/greater_equal.hpp>\n#include <boost/mpl/identity.hpp>\n#include <boost/mpl/bool_fwd.hpp>\n\n#ifndef BOOST_SERIALIZATION_DEFAULT_TYPE_INFO\n    #include <boost/serialization/extended_type_info_typeid.hpp>\n#endif\n#include <boost/serialization/throw_exception.hpp>\n#include <boost/serialization/smart_cast.hpp>\n#include <boost/serialization/assume_abstract.hpp>\n#include <boost/serialization/static_warning.hpp>\n\n#include <boost/type_traits/is_pointer.hpp>\n#include <boost/type_traits/is_enum.hpp>\n#include <boost/type_traits/is_const.hpp>\n#include <boost/type_traits/is_polymorphic.hpp>\n#include <boost/type_traits/remove_extent.hpp>\n\n#include <boost/serialization/serialization.hpp>\n#include <boost/serialization/version.hpp>\n#include <boost/serialization/level.hpp>\n#include <boost/serialization/tracking.hpp>\n#include <boost/serialization/type_info_implementation.hpp>\n#include <boost/serialization/nvp.hpp>\n#include <boost/serialization/void_cast.hpp>\n#include <boost/serialization/collection_size_type.hpp>\n#include <boost/serialization/array_wrapper.hpp>\n\n#include <boost/serialization/singleton.hpp>\n\n#include <boost/archive/archive_exception.hpp>\n#include <boost/archive/detail/basic_oarchive.hpp>\n#include <boost/archive/detail/basic_oserializer.hpp>\n#include <boost/archive/detail/basic_pointer_oserializer.hpp>\n#include <boost/archive/detail/archive_serializer_map.hpp>\n#include <boost/archive/detail/check.hpp>\n\n#include <boost/core/addressof.hpp>\n\nnamespace boost {\n\nnamespace serialization {\n    class extended_type_info;\n} // namespace serialization\n\nnamespace archive {\n\n// an accessor to permit friend access to archives.  Needed because\n// some compilers don't handle friend templates completely\nclass save_access {\npublic:\n    template<class Archive>\n    static void end_preamble(Archive & ar){\n        ar.end_preamble();\n    }\n    template<class Archive, class T>\n    static void save_primitive(Archive & ar, const  T & t){\n        ar.end_preamble();\n        ar.save(t);\n    }\n};\n\nnamespace detail {\n\n#ifdef BOOST_MSVC\n#  pragma warning(push)\n#  pragma warning(disable : 4511 4512)\n#endif\n\ntemplate<class Archive, class T>\nclass oserializer : public basic_oserializer\n{\nprivate:\n    // private constructor to inhibit any existence other than the\n    // static one\npublic:\n    explicit BOOST_DLLEXPORT oserializer() :\n        basic_oserializer(\n            boost::serialization::singleton<\n                typename\n                boost::serialization::type_info_implementation< T >::type\n            >::get_const_instance()\n        )\n    {}\n    BOOST_DLLEXPORT void save_object_data(\n        basic_oarchive & ar,\n        const void *x\n    ) const BOOST_OVERRIDE BOOST_USED;\n    bool class_info() const BOOST_OVERRIDE {\n        return boost::serialization::implementation_level< T >::value\n            >= boost::serialization::object_class_info;\n    }\n    bool tracking(const unsigned int /* flags */) const BOOST_OVERRIDE {\n        return boost::serialization::tracking_level< T >::value == boost::serialization::track_always\n            || (boost::serialization::tracking_level< T >::value == boost::serialization::track_selectively\n                && serialized_as_pointer());\n    }\n    version_type version() const BOOST_OVERRIDE {\n        return version_type(::boost::serialization::version< T >::value);\n    }\n    bool is_polymorphic() const BOOST_OVERRIDE {\n        return boost::is_polymorphic< T >::value;\n    }\n    ~oserializer() BOOST_OVERRIDE {}\n};\n\n#ifdef BOOST_MSVC\n#  pragma warning(pop)\n#endif\n\ntemplate<class Archive, class T>\nBOOST_DLLEXPORT void oserializer<Archive, T>::save_object_data(\n    basic_oarchive & ar,\n    const void *x\n) const {\n    // make sure call is routed through the highest interface that might\n    // be specialized by the user.\n    BOOST_STATIC_ASSERT(boost::is_const< T >::value == false);\n    boost::serialization::serialize_adl(\n        boost::serialization::smart_cast_reference<Archive &>(ar),\n        * static_cast<T *>(const_cast<void *>(x)),\n        version()\n    );\n}\n\n#ifdef BOOST_MSVC\n#  pragma warning(push)\n#  pragma warning(disable : 4511 4512)\n#endif\n\ntemplate<class Archive, class T>\nclass pointer_oserializer :\n    public basic_pointer_oserializer\n{\nprivate:\n    const basic_oserializer &\n    get_basic_serializer() const BOOST_OVERRIDE {\n        return boost::serialization::singleton<\n            oserializer<Archive, T>\n        >::get_const_instance();\n    }\n    BOOST_DLLEXPORT void save_object_ptr(\n        basic_oarchive & ar,\n        const void * x\n    ) const BOOST_OVERRIDE BOOST_USED;\npublic:\n    pointer_oserializer();\n    ~pointer_oserializer() BOOST_OVERRIDE;\n};\n\n#ifdef BOOST_MSVC\n#  pragma warning(pop)\n#endif\n\ntemplate<class Archive, class T>\nBOOST_DLLEXPORT void pointer_oserializer<Archive, T>::save_object_ptr(\n    basic_oarchive & ar,\n    const void * x\n) const {\n    BOOST_ASSERT(NULL != x);\n    // make sure call is routed through the highest interface that might\n    // be specialized by the user.\n    T * t = static_cast<T *>(const_cast<void *>(x));\n    const unsigned int file_version = boost::serialization::version< T >::value;\n    Archive & ar_impl\n        = boost::serialization::smart_cast_reference<Archive &>(ar);\n    boost::serialization::save_construct_data_adl<Archive, T>(\n        ar_impl,\n        t,\n        file_version\n    );\n    ar_impl << boost::serialization::make_nvp(NULL, * t);\n}\n\ntemplate<class Archive, class T>\npointer_oserializer<Archive, T>::pointer_oserializer() :\n    basic_pointer_oserializer(\n        boost::serialization::singleton<\n            typename\n            boost::serialization::type_info_implementation< T >::type\n        >::get_const_instance()\n    )\n{\n    // make sure appropriate member function is instantiated\n    boost::serialization::singleton<\n        oserializer<Archive, T>\n    >::get_mutable_instance().set_bpos(this);\n    archive_serializer_map<Archive>::insert(this);\n}\n\ntemplate<class Archive, class T>\npointer_oserializer<Archive, T>::~pointer_oserializer(){\n    archive_serializer_map<Archive>::erase(this);\n}\n\ntemplate<class Archive>\nstruct save_non_pointer_type {\n    // note this bounces the call right back to the archive\n    // with no runtime overhead\n    struct save_primitive {\n        template<class T>\n        static void invoke(Archive & ar, const T & t){\n            save_access::save_primitive(ar, t);\n        }\n    };\n    // same as above but passes through serialization\n    struct save_only {\n        template<class T>\n        static void invoke(Archive & ar, const T & t){\n            // make sure call is routed through the highest interface that might\n            // be specialized by the user.\n            boost::serialization::serialize_adl(\n                ar,\n                const_cast<T &>(t),\n                ::boost::serialization::version< T >::value\n            );\n        }\n    };\n    // adds class information to the archive. This includes\n    // serialization level and class version\n    struct save_standard {\n        template<class T>\n        static void invoke(Archive &ar, const T & t){\n            ar.save_object(\n                boost::addressof(t),\n                boost::serialization::singleton<\n                    oserializer<Archive, T>\n                >::get_const_instance()\n            );\n        }\n    };\n\n\n\n    // adds class information to the archive. This includes\n    // serialization level and class version\n    struct save_conditional {\n        template<class T>\n        static void invoke(Archive &ar, const T &t){\n            //if(0 == (ar.get_flags() & no_tracking))\n                save_standard::invoke(ar, t);\n            //else\n            //   save_only::invoke(ar, t);\n        }\n    };\n\n\n    template<class T>\n    static void invoke(Archive & ar, const T & t){\n        typedef\n            typename mpl::eval_if<\n            // if its primitive\n                mpl::equal_to<\n                    boost::serialization::implementation_level< T >,\n                    mpl::int_<boost::serialization::primitive_type>\n                >,\n                mpl::identity<save_primitive>,\n            // else\n            typename mpl::eval_if<\n                // class info / version\n                mpl::greater_equal<\n                    boost::serialization::implementation_level< T >,\n                    mpl::int_<boost::serialization::object_class_info>\n                >,\n                // do standard save\n                mpl::identity<save_standard>,\n            // else\n            typename mpl::eval_if<\n                    // no tracking\n                mpl::equal_to<\n                    boost::serialization::tracking_level< T >,\n                    mpl::int_<boost::serialization::track_never>\n                >,\n                // do a fast save\n                mpl::identity<save_only>,\n            // else\n                // do a fast save only tracking is turned off\n                mpl::identity<save_conditional>\n            > > >::type typex;\n        check_object_versioning< T >();\n        typex::invoke(ar, t);\n    }\n    template<class T>\n    static void invoke(Archive & ar, T & t){\n        check_object_level< T >();\n        check_object_tracking< T >();\n        invoke(ar, const_cast<const T &>(t));\n    }\n};\n\ntemplate<class Archive>\nstruct save_pointer_type {\n    struct abstract\n    {\n        template<class T>\n        static const basic_pointer_oserializer * register_type(Archive & /* ar */){\n            // it has? to be polymorphic\n            BOOST_STATIC_ASSERT(boost::is_polymorphic< T >::value);\n            return NULL;\n        }\n    };\n\n    struct non_abstract\n    {\n        template<class T>\n        static const basic_pointer_oserializer * register_type(Archive & ar){\n            return ar.register_type(static_cast<T *>(NULL));\n        }\n    };\n\n    template<class T>\n    static const basic_pointer_oserializer * register_type(Archive &ar, T* const /*t*/){\n        // there should never be any need to save an abstract polymorphic\n        // class pointer.  Inhibiting code generation for this\n        // permits abstract base classes to be used - note: exception\n        // virtual serialize functions used for plug-ins\n        typedef\n            typename mpl::eval_if<\n                boost::serialization::is_abstract< T >,\n                mpl::identity<abstract>,\n                mpl::identity<non_abstract>\n            >::type typex;\n        return typex::template register_type< T >(ar);\n    }\n\n    struct non_polymorphic\n    {\n        template<class T>\n        static void save(\n            Archive &ar,\n            T & t\n        ){\n            const basic_pointer_oserializer & bpos =\n                boost::serialization::singleton<\n                    pointer_oserializer<Archive, T>\n                >::get_const_instance();\n            // save the requested pointer type\n            ar.save_pointer(& t, & bpos);\n        }\n    };\n\n    struct polymorphic\n    {\n        template<class T>\n        static void save(\n            Archive &ar,\n            T & t\n        ){\n            typename\n            boost::serialization::type_info_implementation< T >::type const\n            & i = boost::serialization::singleton<\n                typename\n                boost::serialization::type_info_implementation< T >::type\n            >::get_const_instance();\n\n            boost::serialization::extended_type_info const * const this_type = & i;\n\n            // retrieve the true type of the object pointed to\n            // if this assertion fails its an error in this library\n            BOOST_ASSERT(NULL != this_type);\n\n            const boost::serialization::extended_type_info * true_type =\n                i.get_derived_extended_type_info(t);\n\n            // note:if this exception is thrown, be sure that derived pointer\n            // is either registered or exported.\n            if(NULL == true_type){\n                boost::serialization::throw_exception(\n                    archive_exception(\n                        archive_exception::unregistered_class,\n                        \"derived class not registered or exported\"\n                    )\n                );\n            }\n\n            // if its not a pointer to a more derived type\n            const void *vp = static_cast<const void *>(&t);\n            if(*this_type == *true_type){\n                const basic_pointer_oserializer * bpos = register_type(ar, &t);\n                ar.save_pointer(vp, bpos);\n                return;\n            }\n            // convert pointer to more derived type. if this is thrown\n            // it means that the base/derived relationship hasn't be registered\n            vp = serialization::void_downcast(\n                *true_type,\n                *this_type,\n                static_cast<const void *>(&t)\n            );\n            if(NULL == vp){\n                boost::serialization::throw_exception(\n                    archive_exception(\n                        archive_exception::unregistered_cast,\n                        true_type->get_debug_info(),\n                        this_type->get_debug_info()\n                    )\n                );\n            }\n\n            // since true_type is valid, and this only gets made if the\n            // pointer oserializer object has been created, this should never\n            // fail\n            const basic_pointer_oserializer * bpos\n                = static_cast<const basic_pointer_oserializer *>(\n                    boost::serialization::singleton<\n                        archive_serializer_map<Archive>\n                    >::get_const_instance().find(*true_type)\n                );\n            BOOST_ASSERT(NULL != bpos);\n            if(NULL == bpos)\n                boost::serialization::throw_exception(\n                    archive_exception(\n                        archive_exception::unregistered_class,\n                        \"derived class not registered or exported\"\n                    )\n                );\n            ar.save_pointer(vp, bpos);\n        }\n    };\n\n    template<class T>\n    static void save(\n        Archive & ar,\n        const T & t\n    ){\n        check_pointer_level< T >();\n        check_pointer_tracking< T >();\n        typedef typename mpl::eval_if<\n            is_polymorphic< T >,\n            mpl::identity<polymorphic>,\n            mpl::identity<non_polymorphic>\n        >::type type;\n        type::save(ar, const_cast<T &>(t));\n    }\n\n    template<class TPtr>\n    static void invoke(Archive &ar, const TPtr t){\n        register_type(ar, t);\n        if(NULL == t){\n            basic_oarchive & boa\n                = boost::serialization::smart_cast_reference<basic_oarchive &>(ar);\n            boa.save_null_pointer();\n            save_access::end_preamble(ar);\n            return;\n        }\n        save(ar, * t);\n    }\n};\n\ntemplate<class Archive>\nstruct save_enum_type\n{\n    template<class T>\n    static void invoke(Archive &ar, const T &t){\n        // convert enum to integers on save\n        const int i = static_cast<int>(t);\n        ar << boost::serialization::make_nvp(NULL, i);\n    }\n};\n\ntemplate<class Archive>\nstruct save_array_type\n{\n    template<class T>\n    static void invoke(Archive &ar, const T &t){\n        typedef typename boost::remove_extent< T >::type value_type;\n\n        save_access::end_preamble(ar);\n        // consider alignment\n        std::size_t c = sizeof(t) / (\n            static_cast<const char *>(static_cast<const void *>(&t[1]))\n            - static_cast<const char *>(static_cast<const void *>(&t[0]))\n        );\n        boost::serialization::collection_size_type count(c);\n        ar << BOOST_SERIALIZATION_NVP(count);\n        // explicit template arguments to pass intel C++ compiler\n        ar << serialization::make_array<\n            const value_type,\n            boost::serialization::collection_size_type\n        >(\n            static_cast<const value_type *>(&t[0]),\n            count\n        );\n    }\n};\n\n} // detail\n\ntemplate<class Archive, class T>\ninline void save(Archive & ar, /*const*/ T &t){\n    typedef\n        typename mpl::eval_if<is_pointer< T >,\n            mpl::identity<detail::save_pointer_type<Archive> >,\n        //else\n        typename mpl::eval_if<is_enum< T >,\n            mpl::identity<detail::save_enum_type<Archive> >,\n        //else\n        typename mpl::eval_if<is_array< T >,\n            mpl::identity<detail::save_array_type<Archive> >,\n        //else\n            mpl::identity<detail::save_non_pointer_type<Archive> >\n        >\n        >\n        >::type typex;\n    typex::invoke(ar, t);\n}\n\n} // namespace archive\n} // namespace boost\n\n#endif // BOOST_ARCHIVE_OSERIALIZER_HPP\n"
  },
  {
    "path": "include/boost/archive/detail/polymorphic_iarchive_route.hpp",
    "content": "#ifndef BOOST_ARCHIVE_DETAIL_POLYMORPHIC_IARCHIVE_ROUTE_HPP\n#define BOOST_ARCHIVE_DETAIL_POLYMORPHIC_IARCHIVE_ROUTE_HPP\n\n// MS compatible compilers support #pragma once\n#if defined(_MSC_VER)\n# pragma once\n#endif\n\n/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// polymorphic_iarchive_route.hpp\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for updates, documentation, and revision history.\n\n#include <string>\n#include <ostream>\n#include <cstddef>\n\n#include <boost/config.hpp>\n#if defined(BOOST_NO_STDC_NAMESPACE)\nnamespace std{\n    using ::size_t;\n} // namespace std\n#endif\n\n#include <boost/cstdint.hpp>\n#include <boost/integer_traits.hpp>\n#include <boost/archive/polymorphic_iarchive.hpp>\n#include <boost/archive/detail/abi_prefix.hpp> // must be the last header\n\nnamespace boost {\nnamespace serialization {\n    class extended_type_info;\n} // namespace serialization\nnamespace archive {\nnamespace detail{\n\nclass basic_iserializer;\nclass basic_pointer_iserializer;\n\n#ifdef BOOST_MSVC\n#  pragma warning(push)\n#  pragma warning(disable : 4511 4512)\n#endif\n\ntemplate<class ArchiveImplementation>\nclass polymorphic_iarchive_route :\n    public polymorphic_iarchive,\n    // note: gcc dynamic cross cast fails if the the derivation below is\n    // not public.  I think this is a mistake.\n    public /*protected*/ ArchiveImplementation\n{\nprivate:\n    // these are used by the serialization library.\n    void load_object(\n        void *t,\n        const basic_iserializer & bis\n    ) BOOST_OVERRIDE {\n        ArchiveImplementation::load_object(t, bis);\n    }\n    const basic_pointer_iserializer * load_pointer(\n        void * & t,\n        const basic_pointer_iserializer * bpis_ptr,\n        const basic_pointer_iserializer * (*finder)(\n            const boost::serialization::extended_type_info & type\n        )\n    ) BOOST_OVERRIDE {\n        return ArchiveImplementation::load_pointer(t, bpis_ptr, finder);\n    }\n    void set_library_version(boost::serialization::library_version_type archive_library_version) BOOST_OVERRIDE {\n        ArchiveImplementation::set_library_version(archive_library_version);\n    }\n    boost::serialization::library_version_type get_library_version() const BOOST_OVERRIDE {\n        return ArchiveImplementation::get_library_version();\n    }\n    unsigned int get_flags() const BOOST_OVERRIDE {\n        return ArchiveImplementation::get_flags();\n    }\n    void delete_created_pointers() BOOST_OVERRIDE {\n        ArchiveImplementation::delete_created_pointers();\n    }\n    void reset_object_address(\n        const void * new_address,\n        const void * old_address\n    ) BOOST_OVERRIDE {\n        ArchiveImplementation::reset_object_address(new_address, old_address);\n    }\n    void load_binary(void * t, std::size_t size) BOOST_OVERRIDE {\n        ArchiveImplementation::load_binary(t, size);\n    }\n    // primitive types the only ones permitted by polymorphic archives\n    void load(bool & t) BOOST_OVERRIDE {\n        ArchiveImplementation::load(t);\n    }\n    void load(char & t) BOOST_OVERRIDE {\n        ArchiveImplementation::load(t);\n    }\n    void load(signed char & t) BOOST_OVERRIDE {\n        ArchiveImplementation::load(t);\n    }\n    void load(unsigned char & t) BOOST_OVERRIDE {\n        ArchiveImplementation::load(t);\n    }\n    #ifndef BOOST_NO_CWCHAR\n    #ifndef BOOST_NO_INTRINSIC_WCHAR_T\n    void load(wchar_t & t) BOOST_OVERRIDE {\n        ArchiveImplementation::load(t);\n    }\n    #endif\n    #endif\n    void load(short & t) BOOST_OVERRIDE {\n        ArchiveImplementation::load(t);\n    }\n    void load(unsigned short & t) BOOST_OVERRIDE {\n        ArchiveImplementation::load(t);\n    }\n    void load(int & t) BOOST_OVERRIDE {\n        ArchiveImplementation::load(t);\n    }\n    void load(unsigned int & t) BOOST_OVERRIDE {\n        ArchiveImplementation::load(t);\n    }\n    void load(long & t) BOOST_OVERRIDE {\n        ArchiveImplementation::load(t);\n    }\n    void load(unsigned long & t) BOOST_OVERRIDE {\n        ArchiveImplementation::load(t);\n    }\n    #if defined(BOOST_HAS_LONG_LONG)\n    void load(boost::long_long_type & t) BOOST_OVERRIDE {\n        ArchiveImplementation::load(t);\n    }\n    void load(boost::ulong_long_type & t) BOOST_OVERRIDE {\n        ArchiveImplementation::load(t);\n    }\n    #elif defined(BOOST_HAS_MS_INT64)\n    void load(__int64 & t) BOOST_OVERRIDE {\n        ArchiveImplementation::load(t);\n    }\n    void load(unsigned __int64 & t) BOOST_OVERRIDE {\n        ArchiveImplementation::load(t);\n    }\n    #endif\n    void load(float & t) BOOST_OVERRIDE {\n        ArchiveImplementation::load(t);\n    }\n    void load(double & t) BOOST_OVERRIDE {\n        ArchiveImplementation::load(t);\n    }\n    void load(std::string & t) BOOST_OVERRIDE {\n        ArchiveImplementation::load(t);\n    }\n    #ifndef BOOST_NO_STD_WSTRING\n    void load(std::wstring & t) BOOST_OVERRIDE {\n        ArchiveImplementation::load(t);\n    }\n    #endif\n    // used for xml and other tagged formats default does nothing\n    void load_start(const char * name) BOOST_OVERRIDE {\n        ArchiveImplementation::load_start(name);\n    }\n    void load_end(const char * name) BOOST_OVERRIDE {\n        ArchiveImplementation::load_end(name);\n    }\n    void register_basic_serializer(const basic_iserializer & bis) BOOST_OVERRIDE {\n        ArchiveImplementation::register_basic_serializer(bis);\n    }\n    helper_collection &\n    get_helper_collection() BOOST_OVERRIDE {\n        return ArchiveImplementation::get_helper_collection();\n    }\npublic:\n    // this can't be inherited because they appear in multiple\n    // parents\n    typedef mpl::bool_<true> is_loading;\n    typedef mpl::bool_<false> is_saving;\n    // the >> operator\n    template<class T>\n    polymorphic_iarchive & operator>>(T & t){\n        return polymorphic_iarchive::operator>>(t);\n    }\n    // the & operator\n    template<class T>\n    polymorphic_iarchive & operator&(T & t){\n        return polymorphic_iarchive::operator&(t);\n    }\n    // register type function\n    template<class T>\n    const basic_pointer_iserializer *\n    register_type(T * t = NULL){\n        return ArchiveImplementation::register_type(t);\n    }\n    // all current archives take a stream as constructor argument\n    template <class _Elem, class _Tr>\n    polymorphic_iarchive_route(\n        std::basic_istream<_Elem, _Tr> & is,\n        unsigned int flags = 0\n    ) :\n        ArchiveImplementation(is, flags)\n    {}\n    ~polymorphic_iarchive_route() BOOST_OVERRIDE {}\n};\n\n} // namespace detail\n} // namespace archive\n} // namespace boost\n\n#ifdef BOOST_MSVC\n#pragma warning(pop)\n#endif\n\n#include <boost/archive/detail/abi_suffix.hpp> // pops abi_suffix.hpp pragmas\n\n#endif // BOOST_ARCHIVE_DETAIL_POLYMORPHIC_IARCHIVE_DISPATCH_HPP\n"
  },
  {
    "path": "include/boost/archive/detail/polymorphic_oarchive_route.hpp",
    "content": "#ifndef BOOST_ARCHIVE_DETAIL_POLYMORPHIC_OARCHIVE_ROUTE_HPP\n#define BOOST_ARCHIVE_DETAIL_POLYMORPHIC_OARCHIVE_ROUTE_HPP\n\n// MS compatible compilers support #pragma once\n#if defined(_MSC_VER)\n# pragma once\n#endif\n\n/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// polymorphic_oarchive_route.hpp\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for updates, documentation, and revision history.\n\n#include <string>\n#include <ostream>\n#include <cstddef> // size_t\n\n#include <boost/config.hpp>\n#if defined(BOOST_NO_STDC_NAMESPACE)\nnamespace std{\n    using ::size_t;\n} // namespace std\n#endif\n\n#include <boost/cstdint.hpp>\n#include <boost/integer_traits.hpp>\n#include <boost/archive/polymorphic_oarchive.hpp>\n#include <boost/archive/detail/abi_prefix.hpp> // must be the last header\n\nnamespace boost {\nnamespace serialization {\n    class extended_type_info;\n} // namespace serialization\nnamespace archive {\nnamespace detail{\n\nclass basic_oserializer;\nclass basic_pointer_oserializer;\n\n#ifdef BOOST_MSVC\n#  pragma warning(push)\n#  pragma warning(disable : 4511 4512)\n#endif\n\ntemplate<class ArchiveImplementation>\nclass polymorphic_oarchive_route :\n    public polymorphic_oarchive,\n    // note: gcc dynamic cross cast fails if the the derivation below is\n    // not public.  I think this is a mistake.\n    public /*protected*/ ArchiveImplementation\n{\nprivate:\n    // these are used by the serialization library.\n    void save_object(\n        const void *x,\n        const detail::basic_oserializer & bos\n    ) BOOST_OVERRIDE {\n        ArchiveImplementation::save_object(x, bos);\n    }\n    void save_pointer(\n        const void * t,\n        const detail::basic_pointer_oserializer * bpos_ptr\n    ) BOOST_OVERRIDE {\n        ArchiveImplementation::save_pointer(t, bpos_ptr);\n    }\n    void save_null_pointer() BOOST_OVERRIDE {\n        ArchiveImplementation::save_null_pointer();\n    }\n    // primitive types the only ones permitted by polymorphic archives\n    void save(const bool t) BOOST_OVERRIDE {\n        ArchiveImplementation::save(t);\n    }\n    void save(const char t) BOOST_OVERRIDE {\n        ArchiveImplementation::save(t);\n    }\n    void save(const signed char t) BOOST_OVERRIDE {\n        ArchiveImplementation::save(t);\n    }\n    void save(const unsigned char t) BOOST_OVERRIDE {\n        ArchiveImplementation::save(t);\n    }\n    #ifndef BOOST_NO_CWCHAR\n    #ifndef BOOST_NO_INTRINSIC_WCHAR_T\n    void save(const wchar_t t) BOOST_OVERRIDE {\n        ArchiveImplementation::save(t);\n    }\n    #endif\n    #endif\n    void save(const short t) BOOST_OVERRIDE {\n        ArchiveImplementation::save(t);\n    }\n    void save(const unsigned short t) BOOST_OVERRIDE {\n        ArchiveImplementation::save(t);\n    }\n    void save(const int t) BOOST_OVERRIDE {\n        ArchiveImplementation::save(t);\n    }\n    void save(const unsigned int t) BOOST_OVERRIDE {\n        ArchiveImplementation::save(t);\n    }\n    void save(const long t) BOOST_OVERRIDE {\n        ArchiveImplementation::save(t);\n    }\n    void save(const unsigned long t) BOOST_OVERRIDE {\n        ArchiveImplementation::save(t);\n    }\n    #if defined(BOOST_HAS_LONG_LONG)\n    void save(const boost::long_long_type t) BOOST_OVERRIDE {\n        ArchiveImplementation::save(t);\n    }\n    void save(const boost::ulong_long_type t) BOOST_OVERRIDE {\n        ArchiveImplementation::save(t);\n    }\n    #elif defined(BOOST_HAS_MS_INT64)\n    void save(const boost::int64_t t) BOOST_OVERRIDE {\n        ArchiveImplementation::save(t);\n    }\n    void save(const boost::uint64_t t) BOOST_OVERRIDE {\n        ArchiveImplementation::save(t);\n    }\n    #endif\n    void save(const float t) BOOST_OVERRIDE {\n        ArchiveImplementation::save(t);\n    }\n    void save(const double t) BOOST_OVERRIDE {\n        ArchiveImplementation::save(t);\n    }\n    void save(const std::string & t) BOOST_OVERRIDE {\n        ArchiveImplementation::save(t);\n    }\n    #ifndef BOOST_NO_STD_WSTRING\n    void save(const std::wstring & t) BOOST_OVERRIDE {\n        ArchiveImplementation::save(t);\n    }\n    #endif\n    boost::serialization::library_version_type get_library_version() const BOOST_OVERRIDE {\n        return ArchiveImplementation::get_library_version();\n    }\n    unsigned int get_flags() const BOOST_OVERRIDE {\n        return ArchiveImplementation::get_flags();\n    }\n    void save_binary(const void * t, std::size_t size) BOOST_OVERRIDE {\n        ArchiveImplementation::save_binary(t, size);\n    }\n    // used for xml and other tagged formats default does nothing\n    void save_start(const char * name) BOOST_OVERRIDE {\n        ArchiveImplementation::save_start(name);\n    }\n    void save_end(const char * name) BOOST_OVERRIDE {\n        ArchiveImplementation::save_end(name);\n    }\n    void end_preamble() BOOST_OVERRIDE {\n        ArchiveImplementation::end_preamble();\n    }\n    void register_basic_serializer(const detail::basic_oserializer & bos) BOOST_OVERRIDE {\n        ArchiveImplementation::register_basic_serializer(bos);\n    }\n    helper_collection &\n    get_helper_collection() BOOST_OVERRIDE {\n        return ArchiveImplementation::get_helper_collection();\n    }\npublic:\n    // this can't be inherited because they appear in multiple\n    // parents\n    typedef mpl::bool_<false> is_loading;\n    typedef mpl::bool_<true> is_saving;\n    // the << operator\n    template<class T>\n    polymorphic_oarchive & operator<<(T & t){\n        return polymorphic_oarchive::operator<<(t);\n    }\n    // the & operator\n    template<class T>\n    polymorphic_oarchive & operator&(T & t){\n        return polymorphic_oarchive::operator&(t);\n    }\n    // register type function\n    template<class T>\n    const basic_pointer_oserializer *\n    register_type(T * t = NULL){\n        return ArchiveImplementation::register_type(t);\n    }\n    // all current archives take a stream as constructor argument\n    template <class _Elem, class _Tr>\n    polymorphic_oarchive_route(\n        std::basic_ostream<_Elem, _Tr> & os,\n        unsigned int flags = 0\n    ) :\n        ArchiveImplementation(os, flags)\n    {}\n    ~polymorphic_oarchive_route() BOOST_OVERRIDE {}\n};\n\n} // namespace detail\n} // namespace archive\n} // namespace boost\n\n#ifdef BOOST_MSVC\n#pragma warning(pop)\n#endif\n\n#include <boost/archive/detail/abi_suffix.hpp> // pops abi_suffix.hpp pragmas\n\n#endif // BOOST_ARCHIVE_DETAIL_POLYMORPHIC_OARCHIVE_DISPATCH_HPP\n"
  },
  {
    "path": "include/boost/archive/detail/register_archive.hpp",
    "content": "// Copyright David Abrahams 2006. Distributed under the Boost\n// Software License, Version 1.0. (See accompanying\n// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n#ifndef BOOST_ARCHIVE_DETAIL_REGISTER_ARCHIVE_DWA2006521_HPP\n# define BOOST_ARCHIVE_DETAIL_REGISTER_ARCHIVE_DWA2006521_HPP\n\nnamespace boost { namespace archive { namespace detail {\n\n// No instantiate_ptr_serialization overloads generated by\n// BOOST_SERIALIZATION_REGISTER_ARCHIVE that lexically follow the call\n// will be seen *unless* they are in an associated namespace of one of\n// the arguments, so we pass one of these along to make sure this\n// namespace is considered.  See temp.dep.candidate (14.6.4.2) in the\n// standard.\nstruct adl_tag {};\n\ntemplate <class Archive, class Serializable>\nstruct ptr_serialization_support;\n\n// We could've just used ptr_serialization_support, above, but using\n// it with only a forward declaration causes vc6/7 to complain about a\n// missing instantiate member, even if it has one.  This is just a\n// friendly layer of indirection.\ntemplate <class Archive, class Serializable>\nstruct _ptr_serialization_support\n  : ptr_serialization_support<Archive,Serializable>\n{\n    typedef int type;\n};\n\n#if defined(__SUNPRO_CC) && (__SUNPRO_CC < 0x5130)\n\ntemplate<int N>\nstruct counter : counter<N-1> {};\ntemplate<>\nstruct counter<0> {};\n\ntemplate<class Serializable>\nvoid instantiate_ptr_serialization(Serializable* s, int, adl_tag) {\n    instantiate_ptr_serialization(s, counter<20>());\n}\n\ntemplate<class Archive>\nstruct get_counter {\n    static const int value = sizeof(adjust_counter(counter<20>()));\n    typedef counter<value> type;\n    typedef counter<value - 1> prior;\n    typedef char (&next)[value+1];\n};\n\nchar adjust_counter(counter<0>);\ntemplate<class Serializable>\nvoid instantiate_ptr_serialization(Serializable*, counter<0>) {}\n\n#define BOOST_SERIALIZATION_REGISTER_ARCHIVE(Archive)                     \\\nnamespace boost { namespace archive { namespace detail {                  \\\n    get_counter<Archive >::next adjust_counter(get_counter<Archive >::type);\\\n    template<class Serializable>                                          \\\n    void instantiate_ptr_serialization(Serializable* s,                   \\\n        get_counter<Archive >::type) {                                    \\\n        ptr_serialization_support<Archive, Serializable> x;               \\\n        instantiate_ptr_serialization(s, get_counter<Archive >::prior()); \\\n    }\\\n}}}\n\n\n#else\n\n// This function gets called, but its only purpose is to participate\n// in overload resolution with the functions declared by\n// BOOST_SERIALIZATION_REGISTER_ARCHIVE, below.\ntemplate <class Serializable>\nvoid instantiate_ptr_serialization(Serializable*, int, adl_tag ) {}\n\n// The function declaration generated by this macro never actually\n// gets called, but its return type gets instantiated, and that's\n// enough to cause registration of serialization functions between\n// Archive and any exported Serializable type.  See also:\n// boost/serialization/export.hpp\n# define BOOST_SERIALIZATION_REGISTER_ARCHIVE(Archive)                  \\\nnamespace boost { namespace archive { namespace detail {                \\\n                                                                        \\\ntemplate <class Serializable>                                           \\\ntypename _ptr_serialization_support<Archive, Serializable>::type  \\\ninstantiate_ptr_serialization( Serializable*, Archive*, adl_tag );              \\\n                                                                        \\\n}}}\n#endif\n}}} // namespace boost::archive::detail\n\n#endif // BOOST_ARCHIVE_DETAIL_INSTANTIATE_SERIALIZE_DWA2006521_HPP\n"
  },
  {
    "path": "include/boost/archive/detail/utf8_codecvt_facet.hpp",
    "content": "// Copyright (c) 2001 Ronald Garcia, Indiana University (garcia@osl.iu.edu)\n// Andrew Lumsdaine, Indiana University (lums@osl.iu.edu).\n// Distributed under the Boost Software License, Version 1.0. (See\n// accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n#ifndef BOOST_ARCHIVE_DETAIL_UTF8_CODECVT_FACET_HPP\n#define BOOST_ARCHIVE_DETAIL_UTF8_CODECVT_FACET_HPP\n\n#include <boost/config.hpp>\n\n#ifdef BOOST_NO_STD_WSTREAMBUF\n#error \"wide char i/o not supported on this platform\"\n#endif\n\n// use boost's utf8 codecvt facet\n#include <boost/archive/detail/decl.hpp>\n#define BOOST_UTF8_BEGIN_NAMESPACE \\\n     namespace boost { namespace archive { namespace detail {\n#define BOOST_UTF8_END_NAMESPACE }}}\n\n#include <boost/detail/utf8_codecvt_facet.hpp>\n\n#undef BOOST_UTF8_END_NAMESPACE\n#undef BOOST_UTF8_DECL\n#undef BOOST_UTF8_BEGIN_NAMESPACE\n\n#endif // BOOST_ARCHIVE_DETAIL_UTF8_CODECVT_FACET_HPP\n"
  },
  {
    "path": "include/boost/archive/dinkumware.hpp",
    "content": "#ifndef BOOST_ARCHIVE_DINKUMWARE_HPP\n#define BOOST_ARCHIVE_DINKUMWARE_HPP\n\n// MS compatible compilers support #pragma once\n#if defined(_MSC_VER)\n# pragma once\n#endif\n\n/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// dinkumware.hpp:\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for updates, documentation, and revision history.\n\n// this file adds a couple of things that are missing from the dinkumware\n// implementation of the standard library.\n\n#include <iterator>\n#include <string>\n\n#include <boost/config.hpp>\n#include <boost/cstdint.hpp>\n\nnamespace std {\n\n// define i/o operators for 64 bit integers\ntemplate<class CharType>\nbasic_ostream<CharType> &\noperator<<(basic_ostream<CharType> & os, boost::uint64_t t){\n    // octal rendering of 64 bit number would be 22 octets + eos\n    CharType d[23];\n    unsigned int radix;\n\n    if(os.flags() & (int)std::ios_base::hex)\n        radix = 16;\n    else\n    if(os.flags() & (int)std::ios_base::oct)\n        radix = 8;\n    else\n    //if(s.flags() & (int)std::ios_base::dec)\n        radix =  10;\n    unsigned int i = 0;\n    do{\n        unsigned int j = t % radix;\n        d[i++] = j + ((j < 10) ? '0' : ('a' - 10));\n        t /= radix;\n    }\n    while(t > 0);\n    d[i--] = '\\0';\n\n    // reverse digits\n    unsigned int j = 0;\n    while(j < i){\n        CharType k = d[i];\n        d[i] = d[j];\n        d[j] = k;\n        --i;++j;\n    }\n    os << d;\n    return os;\n\n}\n\ntemplate<class CharType>\nbasic_ostream<CharType> &\noperator<<(basic_ostream<CharType> &os, boost::int64_t t){\n    if(0 <= t){\n        os << static_cast<boost::uint64_t>(t);\n    }\n    else{\n        os.put('-');\n        os << -t;\n    }\n    return os;\n}\n\ntemplate<class CharType>\nbasic_istream<CharType> &\noperator>>(basic_istream<CharType> &is, boost::int64_t & t){\n    CharType d;\n    do{\n        d = is.get();\n    }\n    while(::isspace(d));\n    bool negative = (d == '-');\n    if(negative)\n        d = is.get();\n    unsigned int radix;\n    if(is.flags() & (int)std::ios_base::hex)\n        radix = 16;\n    else\n    if(is.flags() & (int)std::ios_base::oct)\n        radix = 8;\n    else\n    //if(s.flags() & (int)std::ios_base::dec)\n        radix =  10;\n    t = 0;\n    do{\n        if('0' <= d && d <= '9')\n            t = t * radix + (d - '0');\n        else\n        if('a' <= d && d <= 'f')\n            t = t * radix + (d - 'a' + 10);\n        else\n            break;\n        d = is.get();\n    }\n    while(!is.fail());\n    // restore the delimiter\n    is.putback(d);\n    is.clear();\n    if(negative)\n        t = -t;\n    return is;\n}\n\ntemplate<class CharType>\nbasic_istream<CharType> &\noperator>>(basic_istream<CharType> &is, boost::uint64_t & t){\n    boost::int64_t it;\n    is >> it;\n    t = it;\n    return is;\n}\n\ntemplate<>\nclass back_insert_iterator<basic_string<char> > : public\n    iterator<output_iterator_tag, char>\n{\npublic:\n    typedef basic_string<char> container_type;\n    typedef container_type::reference reference;\n\n    explicit back_insert_iterator(container_type & s)\n        : container(& s)\n    {}    // construct with container\n\n    back_insert_iterator<container_type> & operator=(\n        container_type::const_reference Val_\n    ){    // push value into container\n        //container->push_back(Val_);\n        *container += Val_;\n        return (*this);\n    }\n\n    back_insert_iterator<container_type> & operator*(){\n        return (*this);\n    }\n\n    back_insert_iterator<container_type> & operator++(){\n        // pretend to preincrement\n        return (*this);\n    }\n\n    back_insert_iterator<container_type> operator++(int){\n        // pretend to postincrement\n        return (*this);\n    }\n\nprotected:\n    container_type *container;    // pointer to container\n};\n\ntemplate<char>\ninline back_insert_iterator<basic_string<char> > back_inserter(\n    basic_string<char> & s\n){\n    return (std::back_insert_iterator<basic_string<char> >(s));\n}\n\ntemplate<>\nclass back_insert_iterator<basic_string<wchar_t> > : public\n    iterator<output_iterator_tag, wchar_t>\n{\npublic:\n    typedef basic_string<wchar_t> container_type;\n    typedef container_type::reference reference;\n\n    explicit back_insert_iterator(container_type & s)\n        : container(& s)\n    {}    // construct with container\n\n    back_insert_iterator<container_type> & operator=(\n        container_type::const_reference Val_\n    ){    // push value into container\n        //container->push_back(Val_);\n        *container += Val_;\n        return (*this);\n    }\n\n    back_insert_iterator<container_type> & operator*(){\n        return (*this);\n    }\n\n    back_insert_iterator<container_type> & operator++(){\n        // pretend to preincrement\n        return (*this);\n    }\n\n    back_insert_iterator<container_type> operator++(int){\n        // pretend to postincrement\n        return (*this);\n    }\n\nprotected:\n    container_type *container;    // pointer to container\n};\n\ntemplate<wchar_t>\ninline back_insert_iterator<basic_string<wchar_t> > back_inserter(\n    basic_string<wchar_t> & s\n){\n    return (std::back_insert_iterator<basic_string<wchar_t> >(s));\n}\n\n} // namespace std\n\n#endif //BOOST_ARCHIVE_DINKUMWARE_HPP\n"
  },
  {
    "path": "include/boost/archive/impl/archive_serializer_map.ipp",
    "content": "/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// archive_serializer_map.ipp:\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .\n// Distributed under the Boost Software License, Version 1.0. (See\n// accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for updates, documentation, and revision history.\n\n//////////////////////////////////////////////////////////////////////\n// implementation of basic_text_iprimitive overrides for the combination\n// of template parameters used to implement a text_iprimitive\n\n#include <boost/config.hpp>\n#include <boost/archive/detail/archive_serializer_map.hpp>\n#include <boost/archive/detail/basic_serializer_map.hpp>\n#include <boost/serialization/singleton.hpp>\n\nnamespace boost {\nnamespace archive {\nnamespace detail {\n\n#ifdef BOOST_MSVC\n#  pragma warning(push)\n#  pragma warning(disable : 4511 4512)\n#endif\n\nnamespace extra_detail { // anon\n    template<class Archive>\n    class map : public basic_serializer_map \n    {};\n}\n\n#ifdef BOOST_MSVC\n#  pragma warning(pop)\n#endif\n\ntemplate<class Archive>\nBOOST_ARCHIVE_OR_WARCHIVE_DECL bool\narchive_serializer_map<Archive>::insert(const basic_serializer * bs){\n    return boost::serialization::singleton<\n        extra_detail::map<Archive>\n    >::get_mutable_instance().insert(bs);\n}\n\ntemplate<class Archive>\nBOOST_ARCHIVE_OR_WARCHIVE_DECL void\narchive_serializer_map<Archive>::erase(const basic_serializer * bs){\n    // note: previously this conditional was a runtime assertion with\n    // BOOST_ASSERT.  We've changed it because we've discovered that at\n    // least one platform is not guaranteed to destroy singletons in\n    // reverse order of distruction.\n    if(boost::serialization::singleton<\n        extra_detail::map<Archive>\n    >::is_destroyed())\n        return;\n    boost::serialization::singleton<\n        extra_detail::map<Archive>\n    >::get_mutable_instance().erase(bs);\n}\n\ntemplate<class Archive>\nBOOST_ARCHIVE_OR_WARCHIVE_DECL const basic_serializer *\narchive_serializer_map<Archive>::find(\n    const boost::serialization::extended_type_info & eti\n) {\n    return boost::serialization::singleton<\n        extra_detail::map<Archive>\n    >::get_const_instance().find(eti);\n}\n\n} // namespace detail\n} // namespace archive\n} // namespace boost\n"
  },
  {
    "path": "include/boost/archive/impl/basic_binary_iarchive.ipp",
    "content": "/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// basic_binary_iarchive.ipp:\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com . \n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for updates, documentation, and revision history.\n#include <string>\n#include <boost/assert.hpp>\n#include <algorithm>\n#include <cstring>\n\n#include <boost/config.hpp>\n#if defined(BOOST_NO_STDC_NAMESPACE)\nnamespace std{ \n    using ::memcpy; \n    using ::strlen;\n    using ::size_t;\n}\n#endif\n\n#include <boost/detail/workaround.hpp>\n#include <boost/predef/other/endian.h>\n\n#include <boost/archive/basic_binary_iarchive.hpp>\n\nnamespace boost {\nnamespace archive {\n\n/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// implementation of binary_binary_archive\ntemplate<class Archive>\nBOOST_ARCHIVE_OR_WARCHIVE_DECL void\nbasic_binary_iarchive<Archive>::load_override(class_name_type & t){\n    std::string cn;\n    cn.reserve(BOOST_SERIALIZATION_MAX_KEY_SIZE);\n    load_override(cn);\n    if(cn.size() > (BOOST_SERIALIZATION_MAX_KEY_SIZE - 1))\n        boost::serialization::throw_exception(\n            archive_exception(archive_exception::invalid_class_name)\n        );\n    std::memcpy(t, cn.data(), cn.size());\n    // borland tweak\n    t.t[cn.size()] = '\\0';\n}\n\ntemplate<class Archive>\nBOOST_ARCHIVE_OR_WARCHIVE_DECL void\nbasic_binary_iarchive<Archive>::init() {\n    // read signature in an archive version independent manner\n    std::string file_signature;\n    \n    #if 0 // commented out since it interfers with derivation\n    BOOST_TRY {\n        std::size_t l;\n        this->This()->load(l);\n        if(l == std::strlen(BOOST_ARCHIVE_SIGNATURE())) {\n            // borland de-allocator fixup\n            #if BOOST_WORKAROUND(_RWSTD_VER, BOOST_TESTED_AT(20101))\n            if(NULL != file_signature.data())\n            #endif\n                file_signature.resize(l);\n            // note breaking a rule here - could be a problem on some platform\n            if(0 < l)\n                this->This()->load_binary(&(*file_signature.begin()), l);\n        }\n    }\n    BOOST_CATCH(archive_exception const &) {  // catch stream_error archive exceptions\n        // will cause invalid_signature archive exception to be thrown below\n        file_signature = \"\";   \n    }\n    BOOST_CATCH_END\n    #else\n    // https://svn.boost.org/trac/boost/ticket/7301\n    * this->This() >> file_signature;\n    #endif\n\n    if(file_signature != BOOST_ARCHIVE_SIGNATURE())\n        boost::serialization::throw_exception(\n            archive_exception(archive_exception::invalid_signature)\n        );\n\n    // make sure the version of the reading archive library can\n    // support the format of the archive being read\n    boost::serialization::library_version_type input_library_version;\n    //* this->This() >> input_library_version;\n    {\n        int v = 0;\n        v = this->This()->m_sb.sbumpc();\n        #if BOOST_ENDIAN_LITTLE_BYTE\n        if(v < 6){\n            ;\n        }\n        else\n        if(v < 7){\n            // version 6 - next byte should be zero\n            this->This()->m_sb.sbumpc();\n        }\n        else\n        if(v < 8){\n            int x1;\n            // version 7 = might be followed by zero or some other byte\n            x1 = this->This()->m_sb.sgetc();\n            // it's =a zero, push it back\n            if(0 == x1)\n                this->This()->m_sb.sbumpc();\n        }\n        else{\n            // version 8+ followed by a zero\n            this->This()->m_sb.sbumpc();\n        }\n        #elif BOOST_ENDIAN_BIG_BYTE\n        if(v == 0)\n            v = this->This()->m_sb.sbumpc();\n        #endif\n        input_library_version = static_cast<boost::serialization::library_version_type>(v);\n    }\n    \n    #if BOOST_WORKAROUND(__MWERKS__, BOOST_TESTED_AT(0x3205))\n    this->set_library_version(input_library_version);\n    #else\n    detail::basic_iarchive::set_library_version(input_library_version);\n    #endif\n    \n    if(BOOST_ARCHIVE_VERSION() < input_library_version)\n        boost::serialization::throw_exception(\n            archive_exception(archive_exception::unsupported_version)\n        );\n}\n\n} // namespace archive\n} // namespace boost\n"
  },
  {
    "path": "include/boost/archive/impl/basic_binary_iprimitive.ipp",
    "content": "/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// basic_binary_iprimitive.ipp:\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com . \n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for updates, documentation, and revision history.\n\n#include <boost/assert.hpp>\n#include <cstddef> // size_t, NULL\n#include <cstring> // memcpy\n\n#include <boost/config.hpp>\n#if defined(BOOST_NO_STDC_NAMESPACE)\nnamespace std{ \n    using ::size_t;\n    using ::memcpy;\n} // namespace std\n#endif\n\n#include <boost/serialization/throw_exception.hpp>\n#include <boost/core/no_exceptions_support.hpp>\n#include <boost/archive/archive_exception.hpp>\n#include <boost/archive/basic_binary_iprimitive.hpp> \n\nnamespace boost {\nnamespace archive {\n\n//////////////////////////////////////////////////////////////////////\n// implementation of basic_binary_iprimitive\n\ntemplate<class Archive, class Elem, class Tr>\nBOOST_ARCHIVE_OR_WARCHIVE_DECL void\nbasic_binary_iprimitive<Archive, Elem, Tr>::init()\n{\n    // Detect  attempts to pass native binary archives across\n    // incompatible platforms. This is not fool proof but its\n    // better than nothing.\n    unsigned char size;\n    this->This()->load(size);\n    if(sizeof(int) != size)\n        boost::serialization::throw_exception(\n            archive_exception(\n                archive_exception::incompatible_native_format,\n                \"size of int\"\n            )\n        );\n    this->This()->load(size);\n    if(sizeof(long) != size)\n        boost::serialization::throw_exception(\n            archive_exception(\n                archive_exception::incompatible_native_format,\n                \"size of long\"\n            )\n        );\n    this->This()->load(size);\n    if(sizeof(float) != size)\n        boost::serialization::throw_exception(\n            archive_exception(\n                archive_exception::incompatible_native_format,\n                \"size of float\"\n            )\n        );\n    this->This()->load(size);\n    if(sizeof(double) != size)\n        boost::serialization::throw_exception(\n            archive_exception(\n                archive_exception::incompatible_native_format,\n                \"size of double\"\n            )\n        );\n\n    // for checking endian\n    int i;\n    this->This()->load(i);\n    if(1 != i)\n        boost::serialization::throw_exception(\n            archive_exception(\n                archive_exception::incompatible_native_format,\n                \"endian setting\"\n            )\n        );\n}\n\n#ifndef BOOST_NO_CWCHAR\n#ifndef BOOST_NO_INTRINSIC_WCHAR_T\ntemplate<class Archive, class Elem, class Tr>\nBOOST_ARCHIVE_OR_WARCHIVE_DECL void\nbasic_binary_iprimitive<Archive, Elem, Tr>::load(wchar_t * ws)\n{\n    std::size_t l; // number of wchar_t !!!\n    this->This()->load(l);\n    load_binary(ws, l * sizeof(wchar_t) / sizeof(char));\n    ws[l] = L'\\0';\n}\n#endif\n#endif\n\ntemplate<class Archive, class Elem, class Tr>\nBOOST_ARCHIVE_OR_WARCHIVE_DECL void\nbasic_binary_iprimitive<Archive, Elem, Tr>::load(std::string & s)\n{\n    std::size_t l;\n    this->This()->load(l);\n    // borland de-allocator fixup\n    #if BOOST_WORKAROUND(_RWSTD_VER, BOOST_TESTED_AT(20101))\n    if(NULL != s.data())\n    #endif\n        s.resize(l);\n    // note breaking a rule here - could be a problem on some platform\n    if(0 < l)\n        load_binary(&(*s.begin()), l);\n}\n\ntemplate<class Archive, class Elem, class Tr>\nBOOST_ARCHIVE_OR_WARCHIVE_DECL void\nbasic_binary_iprimitive<Archive, Elem, Tr>::load(char * s)\n{\n    std::size_t l;\n    this->This()->load(l);\n    load_binary(s, l);\n    s[l] = '\\0';\n}\n\n#ifndef BOOST_NO_STD_WSTRING\ntemplate<class Archive, class Elem, class Tr>\nBOOST_ARCHIVE_OR_WARCHIVE_DECL void\nbasic_binary_iprimitive<Archive, Elem, Tr>::load(std::wstring & ws)\n{\n    std::size_t l;\n    this->This()->load(l);\n    // borland de-allocator fixup\n    #if BOOST_WORKAROUND(_RWSTD_VER, BOOST_TESTED_AT(20101))\n    if(NULL != ws.data())\n    #endif\n        ws.resize(l);\n    // note breaking a rule here - is could be a problem on some platform\n    load_binary(const_cast<wchar_t *>(ws.data()), l * sizeof(wchar_t) / sizeof(char));\n}\n#endif\n\ntemplate<class Archive, class Elem, class Tr>\nBOOST_ARCHIVE_OR_WARCHIVE_DECL\nbasic_binary_iprimitive<Archive, Elem, Tr>::basic_binary_iprimitive(\n    std::basic_streambuf<Elem, Tr> & sb, \n    bool no_codecvt\n) :\n#ifndef BOOST_NO_STD_LOCALE\n    m_sb(sb),\n    codecvt_null_facet(1),\n    locale_saver(m_sb),\n    archive_locale(sb.getloc(), & codecvt_null_facet)\n{\n    if(! no_codecvt){\n        m_sb.pubsync();\n        m_sb.pubimbue(archive_locale);\n    }\n}\n#else\n    m_sb(sb)\n{}\n#endif\n\n// scoped_ptr requires that g be a complete type at time of\n// destruction so define destructor here rather than in the header\ntemplate<class Archive, class Elem, class Tr>\nBOOST_ARCHIVE_OR_WARCHIVE_DECL\nbasic_binary_iprimitive<Archive, Elem, Tr>::~basic_binary_iprimitive(){}\n\n} // namespace archive\n} // namespace boost\n"
  },
  {
    "path": "include/boost/archive/impl/basic_binary_oarchive.ipp",
    "content": "/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// basic_binary_oarchive.ipp:\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com . \n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for updates, documentation, and revision history.\n#include <string>\n#include <boost/assert.hpp>\n#include <algorithm>\n#include <cstring>\n\n#include <boost/config.hpp>\n#if defined(BOOST_NO_STDC_NAMESPACE)\nnamespace std{ \n    using ::memcpy; \n}\n#endif\n\n#include <boost/archive/basic_binary_oarchive.hpp>\n\nnamespace boost {\nnamespace archive {\n\n/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// implementation of binary_binary_oarchive\n\ntemplate<class Archive>\nBOOST_ARCHIVE_OR_WARCHIVE_DECL void\nbasic_binary_oarchive<Archive>::init(){\n    // write signature in an archive version independent manner\n    const std::string file_signature(BOOST_ARCHIVE_SIGNATURE());\n    * this->This() << file_signature;\n    // write library version\n    const boost::serialization::library_version_type v(BOOST_ARCHIVE_VERSION());\n    * this->This() << v;\n}\n\n} // namespace archive\n} // namespace boost\n"
  },
  {
    "path": "include/boost/archive/impl/basic_binary_oprimitive.ipp",
    "content": "/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// basic_binary_oprimitive.ipp:\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com . \n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for updates, documentation, and revision history.\n\n#include <ostream>\n#include <cstddef> // NULL\n#include <cstring>\n\n#include <boost/config.hpp>\n\n#if defined(BOOST_NO_STDC_NAMESPACE) && ! defined(__LIBCOMO__)\nnamespace std{ \n    using ::strlen; \n} // namespace std\n#endif\n\n#ifndef BOOST_NO_CWCHAR\n#include <cwchar>\n#ifdef BOOST_NO_STDC_NAMESPACE\nnamespace std{ using ::wcslen; }\n#endif\n#endif\n\n#include <boost/archive/basic_binary_oprimitive.hpp>\n#include <boost/core/no_exceptions_support.hpp>\n\nnamespace boost {\nnamespace archive {\n\n//////////////////////////////////////////////////////////////////////\n// implementation of basic_binary_oprimitive\n\ntemplate<class Archive, class Elem, class Tr>\nBOOST_ARCHIVE_OR_WARCHIVE_DECL void\nbasic_binary_oprimitive<Archive, Elem, Tr>::init()\n{\n    // record native sizes of fundamental types\n    // this is to permit detection of attempts to pass\n    // native binary archives accross incompatible machines.\n    // This is not foolproof but its better than nothing.\n    this->This()->save(static_cast<unsigned char>(sizeof(int)));\n    this->This()->save(static_cast<unsigned char>(sizeof(long)));\n    this->This()->save(static_cast<unsigned char>(sizeof(float)));\n    this->This()->save(static_cast<unsigned char>(sizeof(double)));\n    // for checking endianness\n    this->This()->save(int(1));\n}\n\ntemplate<class Archive, class Elem, class Tr>\nBOOST_ARCHIVE_OR_WARCHIVE_DECL void\nbasic_binary_oprimitive<Archive, Elem, Tr>::save(const char * s)\n{\n    std::size_t l = std::strlen(s);\n    this->This()->save(l);\n    save_binary(s, l);\n}\n\ntemplate<class Archive, class Elem, class Tr>\nBOOST_ARCHIVE_OR_WARCHIVE_DECL void\nbasic_binary_oprimitive<Archive, Elem, Tr>::save(const std::string &s)\n{\n    std::size_t l = static_cast<std::size_t>(s.size());\n    this->This()->save(l);\n    save_binary(s.data(), l);\n}\n\n#ifndef BOOST_NO_CWCHAR\n#ifndef BOOST_NO_INTRINSIC_WCHAR_T\ntemplate<class Archive, class Elem, class Tr>\nBOOST_ARCHIVE_OR_WARCHIVE_DECL void\nbasic_binary_oprimitive<Archive, Elem, Tr>::save(const wchar_t * ws)\n{\n    std::size_t l = std::wcslen(ws);\n    this->This()->save(l);\n    save_binary(ws, l * sizeof(wchar_t) / sizeof(char));\n}\n#endif\n\n#ifndef BOOST_NO_STD_WSTRING\ntemplate<class Archive, class Elem, class Tr>\nBOOST_ARCHIVE_OR_WARCHIVE_DECL void\nbasic_binary_oprimitive<Archive, Elem, Tr>::save(const std::wstring &ws)\n{\n    std::size_t l = ws.size();\n    this->This()->save(l);\n    save_binary(ws.data(), l * sizeof(wchar_t) / sizeof(char));\n}\n#endif\n#endif // BOOST_NO_CWCHAR\n\ntemplate<class Archive, class Elem, class Tr>\nBOOST_ARCHIVE_OR_WARCHIVE_DECL\nbasic_binary_oprimitive<Archive, Elem, Tr>::basic_binary_oprimitive(\n    std::basic_streambuf<Elem, Tr> & sb, \n    bool no_codecvt\n) : \n#ifndef BOOST_NO_STD_LOCALE\n    m_sb(sb),\n    codecvt_null_facet(1),\n    locale_saver(m_sb),\n    archive_locale(sb.getloc(), & codecvt_null_facet)\n{\n    if(! no_codecvt){\n        m_sb.pubsync();\n        m_sb.pubimbue(archive_locale);\n    }\n}\n#else\n    m_sb(sb)\n{}\n#endif\n\n// scoped_ptr requires that g be a complete type at time of\n// destruction so define destructor here rather than in the header\ntemplate<class Archive, class Elem, class Tr>\nBOOST_ARCHIVE_OR_WARCHIVE_DECL\nbasic_binary_oprimitive<Archive, Elem, Tr>::~basic_binary_oprimitive(){}\n\n} // namespace archive\n} // namespace boost\n"
  },
  {
    "path": "include/boost/archive/impl/basic_text_iarchive.ipp",
    "content": "/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// basic_text_iarchive.ipp:\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com . \n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for updates, documentation, and revision history.\n#include <string>\n#include <algorithm>\n#include <cstring>\n\n#include <boost/config.hpp>\n#if defined(BOOST_NO_STDC_NAMESPACE)\nnamespace std{ \n    using ::memcpy; \n}\n#endif\n\n#include <boost/detail/workaround.hpp>\n#include <boost/serialization/string.hpp>\n#include <boost/archive/basic_text_iarchive.hpp>\n\nnamespace boost {\nnamespace archive {\n\n/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// implementation of text_text_archive\n\ntemplate<class Archive>\nBOOST_ARCHIVE_OR_WARCHIVE_DECL void\nbasic_text_iarchive<Archive>::load_override(class_name_type & t){\n    std::string cn;\n    cn.reserve(BOOST_SERIALIZATION_MAX_KEY_SIZE);\n    load_override(cn);\n    if(cn.size() > (BOOST_SERIALIZATION_MAX_KEY_SIZE - 1))\n        boost::serialization::throw_exception(\n            archive_exception(archive_exception::invalid_class_name)\n        );\n    std::memcpy(t, cn.data(), cn.size());\n    // borland tweak\n    t.t[cn.size()] = '\\0';\n}\n\ntemplate<class Archive>\nBOOST_ARCHIVE_OR_WARCHIVE_DECL void\nbasic_text_iarchive<Archive>::init() {\n    // read signature in an archive version independent manner\n    std::string file_signature;\n    * this->This() >> file_signature;\n    if(file_signature != BOOST_ARCHIVE_SIGNATURE())\n        boost::serialization::throw_exception(\n            archive_exception(archive_exception::invalid_signature)\n        );\n\n    // make sure the version of the reading archive library can\n    // support the format of the archive being read\n    boost::serialization::library_version_type input_library_version;\n    * this->This() >> input_library_version;\n\n    #if BOOST_WORKAROUND(__MWERKS__, BOOST_TESTED_AT(0x3205))\n    this->set_library_version(input_library_version);\n    #else\n    detail::basic_iarchive::set_library_version(input_library_version);\n    #endif\n\n    // extra little .t is to get around borland quirk\n    if(BOOST_ARCHIVE_VERSION() < input_library_version)\n        boost::serialization::throw_exception(\n            archive_exception(archive_exception::unsupported_version)\n        );\n}\n\n} // namespace archive\n} // namespace boost\n"
  },
  {
    "path": "include/boost/archive/impl/basic_text_iprimitive.ipp",
    "content": "/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// basic_text_iprimitive.ipp:\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .\n// Distributed under the Boost Software License, Version 1.0. (See\n// accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for updates, documentation, and revision history.\n\n#include <cstddef> // size_t, NULL\n#include <limits> // NULL\n\n#include <boost/config.hpp>\n#if defined(BOOST_NO_STDC_NAMESPACE)\nnamespace std{ \n    using ::size_t; \n} // namespace std\n#endif\n\n#include <boost/serialization/throw_exception.hpp>\n\n#include <boost/archive/basic_text_iprimitive.hpp>\n\n#include <boost/archive/iterators/remove_whitespace.hpp>\n#include <boost/archive/iterators/istream_iterator.hpp>\n#include <boost/archive/iterators/binary_from_base64.hpp>\n#include <boost/archive/iterators/transform_width.hpp>\n\nnamespace boost {\nnamespace archive {\n\nnamespace detail {\n    template<class CharType>\n    static inline bool is_whitespace(CharType c);\n\n    template<>\n    inline bool is_whitespace(char t){\n        return 0 != std::isspace(t);\n    }\n\n    #ifndef BOOST_NO_CWCHAR\n    template<>\n    inline bool is_whitespace(wchar_t t){\n        return 0 != std::iswspace(t);\n    }\n    #endif\n} // detail\n\n// translate base64 text into binary and copy into buffer\n// until buffer is full.\ntemplate<class IStream>\nBOOST_ARCHIVE_OR_WARCHIVE_DECL void\nbasic_text_iprimitive<IStream>::load_binary(\n    void *address, \n    std::size_t count\n){\n    typedef typename IStream::char_type CharType;\n    \n    if(0 == count)\n        return;\n        \n    BOOST_ASSERT(\n        static_cast<std::size_t>((std::numeric_limits<std::streamsize>::max)())\n        > (count + sizeof(CharType) - 1)/sizeof(CharType)\n    );\n        \n    if(is.fail())\n        boost::serialization::throw_exception(\n            archive_exception(archive_exception::input_stream_error)\n        );\n    // convert from base64 to binary\n    typedef typename\n        iterators::transform_width<\n            iterators::binary_from_base64<\n                iterators::remove_whitespace<\n                    iterators::istream_iterator<CharType>\n                >\n                ,typename IStream::int_type\n            >\n            ,8\n            ,6\n            ,CharType\n        > \n        binary;\n        \n    binary i = binary(iterators::istream_iterator<CharType>(is));\n\n    char * caddr = static_cast<char *>(address);\n    \n    // take care that we don't increment anymore than necessary\n    while(count-- > 0){\n        *caddr++ = static_cast<char>(*i++);\n    }\n\n    // skip over any excess input\n    for(;;){\n        typename IStream::int_type r;\n        r = is.get();\n        if(is.eof())\n            break;\n        if(detail::is_whitespace(static_cast<CharType>(r)))\n            break;\n    }\n}\n    \ntemplate<class IStream>\nBOOST_ARCHIVE_OR_WARCHIVE_DECL\nbasic_text_iprimitive<IStream>::basic_text_iprimitive(\n    IStream  &is_,\n    bool no_codecvt\n) :\n    is(is_),\n    flags_saver(is_),\n#ifndef BOOST_NO_STD_LOCALE\n    precision_saver(is_),\n    codecvt_null_facet(1),\n    archive_locale(is.getloc(), & codecvt_null_facet),\n    locale_saver(is)\n{\n    if(! no_codecvt){\n        is_.sync();\n        is_.imbue(archive_locale);\n    }\n    is_ >> std::noboolalpha;\n}\n#else\n    precision_saver(is_)\n{}\n#endif\n\ntemplate<class IStream>\nBOOST_ARCHIVE_OR_WARCHIVE_DECL\nbasic_text_iprimitive<IStream>::~basic_text_iprimitive(){\n}\n\n} // namespace archive\n} // namespace boost\n"
  },
  {
    "path": "include/boost/archive/impl/basic_text_oarchive.ipp",
    "content": "/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// basic_text_oarchive.ipp:\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com . \n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for updates, documentation, and revision history.\n#include <string>\n#include <boost/assert.hpp>\n#include <cstring>\n\n#include <boost/config.hpp>\n#if defined(BOOST_NO_STDC_NAMESPACE)\nnamespace std{ \n    using ::memcpy; \n}\n#endif\n\n#include <boost/archive/basic_text_oarchive.hpp>\n\nnamespace boost {\nnamespace archive {\n\n/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// implementation of basic_text_oarchive\n\ntemplate<class Archive>\nBOOST_ARCHIVE_OR_WARCHIVE_DECL void\nbasic_text_oarchive<Archive>::newtoken()\n{\n    switch(delimiter){\n    default:\n        BOOST_ASSERT(false);\n        break;\n    case eol:\n        this->This()->put('\\n');\n        delimiter = space;\n        break;\n    case space:\n        this->This()->put(' ');\n        break;\n    case none:\n        delimiter = space;\n        break;\n    }\n}\n\ntemplate<class Archive>\nBOOST_ARCHIVE_OR_WARCHIVE_DECL void\nbasic_text_oarchive<Archive>::init(){\n    // write signature in an archive version independent manner\n    const std::string file_signature(BOOST_ARCHIVE_SIGNATURE());\n    * this->This() << file_signature;\n    // write library version\n    const boost::serialization::library_version_type v(BOOST_ARCHIVE_VERSION());\n    * this->This() << v;\n}\n\n} // namespace archive\n} // namespace boost\n"
  },
  {
    "path": "include/boost/archive/impl/basic_text_oprimitive.ipp",
    "content": "/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// basic_text_oprimitive.ipp:\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com . \n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for updates, documentation, and revision history.\n\n#include <cstddef> // NULL\n#include <algorithm> // std::copy\n#include <boost/config.hpp>\n#if defined(BOOST_NO_STDC_NAMESPACE)\nnamespace std{ \n    using ::size_t; \n} // namespace std\n#endif\n\n#include <boost/core/uncaught_exceptions.hpp>\n\n#include <boost/archive/basic_text_oprimitive.hpp>\n\n#include <boost/archive/iterators/base64_from_binary.hpp>\n#include <boost/archive/iterators/insert_linebreaks.hpp>\n#include <boost/archive/iterators/transform_width.hpp>\n#include <boost/archive/iterators/ostream_iterator.hpp>\n\nnamespace boost {\nnamespace archive {\n\n// translate to base64 and copy in to buffer.\ntemplate<class OStream>\nBOOST_ARCHIVE_OR_WARCHIVE_DECL void\nbasic_text_oprimitive<OStream>::save_binary(\n    const void *address, \n    std::size_t count\n){\n    typedef typename OStream::char_type CharType;\n    \n    if(0 == count)\n        return;\n    \n    if(os.fail())\n        boost::serialization::throw_exception(\n            archive_exception(archive_exception::output_stream_error)\n        );\n        \n    os.put('\\n');\n    \n    typedef \n        boost::archive::iterators::insert_linebreaks<\n            boost::archive::iterators::base64_from_binary<\n                boost::archive::iterators::transform_width<\n                    const char *,\n                    6,\n                    8\n                >\n            > \n            ,76\n            ,const char // cwpro8 needs this\n        > \n        base64_text;\n\n    boost::archive::iterators::ostream_iterator<CharType> oi(os);\n    std::copy(\n        base64_text(static_cast<const char *>(address)),\n        base64_text(\n            static_cast<const char *>(address) + count\n        ),\n        oi\n    );\n    \n    std::size_t tail = count % 3;\n    if(tail > 0){\n        *oi++ = '=';\n        if(tail < 2)\n            *oi = '=';\n    }\n}\n\ntemplate<class OStream>\nBOOST_ARCHIVE_OR_WARCHIVE_DECL\nbasic_text_oprimitive<OStream>::basic_text_oprimitive(\n    OStream & os_,\n    bool no_codecvt\n) : \n    os(os_),\n    flags_saver(os_),\n#ifndef BOOST_NO_STD_LOCALE\n    precision_saver(os_),\n    codecvt_null_facet(1),\n    archive_locale(os.getloc(), & codecvt_null_facet),\n    locale_saver(os)\n{\n    if(! no_codecvt){\n        os_.flush();\n        os_.imbue(archive_locale);\n    }\n    os_ << std::noboolalpha;\n}\n#else\n    precision_saver(os_)\n{}\n#endif\n\n\ntemplate<class OStream>\nBOOST_ARCHIVE_OR_WARCHIVE_DECL\nbasic_text_oprimitive<OStream>::~basic_text_oprimitive(){\n    if(boost::core::uncaught_exceptions() > 0)\n        return;\n    os << std::endl;\n}\n\n} //namespace boost \n} //namespace archive \n"
  },
  {
    "path": "include/boost/archive/impl/basic_xml_grammar.hpp",
    "content": "#ifndef BOOST_ARCHIVE_BASIC_XML_GRAMMAR_HPP\n#define BOOST_ARCHIVE_BASIC_XML_GRAMMAR_HPP\n\n// MS compatible compilers support #pragma once\n#if defined(_MSC_VER)\n# pragma once\n#endif\n\n/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// basic_xml_grammar.hpp\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for updates, documentation, and revision history.\n\n// this module is derived from simplexml.cpp - an example shipped as part of\n// the spirit parser.  This example contains the following notice:\n/*=============================================================================\n    simplexml.cpp\n\n    Spirit V1.3\n    URL: http://spirit.sourceforge.net/\n\n    Copyright (c) 2001, Daniel C. Nuffer\n\n    This software is provided 'as-is', without any express or implied\n    warranty. In no event will the copyright holder be held liable for\n    any damages arising from the use of this software.\n\n    Permission is granted to anyone to use this software for any purpose,\n    including commercial applications, and to alter it and redistribute\n    it freely, subject to the following restrictions:\n\n    1.  The origin of this software must not be misrepresented; you must\n        not claim that you wrote the original software. If you use this\n        software in a product, an acknowledgment in the product documentation\n        would be appreciated but is not required.\n\n    2.  Altered source versions must be plainly marked as such, and must\n        not be misrepresented as being the original software.\n\n    3.  This notice may not be removed or altered from any source\n        distribution.\n=============================================================================*/\n#include <string>\n\n#include <boost/config.hpp>\n#include <boost/detail/workaround.hpp>\n\n#include <boost/spirit/include/classic_rule.hpp>\n#include <boost/spirit/include/classic_chset.hpp>\n\n#include <boost/archive/basic_archive.hpp>\n#include <boost/serialization/tracking.hpp>\n#include <boost/serialization/version.hpp>\n\nnamespace boost {\nnamespace archive {\n\n/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// XML grammar parsing\n\ntemplate<class CharType>\nclass BOOST_SYMBOL_VISIBLE basic_xml_grammar {\npublic:\n    // The following is not necessary according to DR45, but at least\n    // one compiler (Compaq C++ 6.5 in strict_ansi mode) chokes otherwise.\n    struct return_values;\n    friend struct return_values;\n\nprivate:\n    typedef typename std::basic_istream<CharType> IStream;\n    typedef typename std::basic_string<CharType> StringType;\n    typedef typename boost::spirit::classic::chset<CharType> chset_t;\n    typedef typename boost::spirit::classic::chlit<CharType> chlit_t;\n    typedef typename boost::spirit::classic::scanner<\n        typename  std::basic_string<CharType>::iterator\n    > scanner_t;\n    typedef typename boost::spirit::classic::rule<scanner_t> rule_t;\n    // Start grammar definition\n    rule_t\n        Reference,\n        Eq,\n        STag,\n        ETag,\n        LetterOrUnderscoreOrColon,\n        AttValue,\n        CharRef1,\n        CharRef2,\n        CharRef,\n        AmpRef,\n        LTRef,\n        GTRef,\n        AposRef,\n        QuoteRef,\n        CharData,\n        CharDataChars,\n        content,\n        AmpName,\n        LTName,\n        GTName,\n        ClassNameChar,\n        ClassName,\n        Name,\n        XMLDecl,\n        XMLDeclChars,\n        DocTypeDecl,\n        DocTypeDeclChars,\n        ClassIDAttribute,\n        ObjectIDAttribute,\n        ClassNameAttribute,\n        TrackingAttribute,\n        VersionAttribute,\n        UnusedAttribute,\n        Attribute,\n        SignatureAttribute,\n        SerializationWrapper,\n        NameHead,\n        NameTail,\n        AttributeList,\n        S;\n\n    // XML Character classes\n    chset_t\n        BaseChar,\n        Ideographic,\n        Char,\n        Letter,\n        Digit,\n        CombiningChar,\n        Extender,\n        Sch,\n        NameChar;\n\n    void init_chset();\n\n    bool my_parse(\n        IStream & is,\n        const rule_t &rule_,\n        const CharType delimiter = L'>'\n    ) const ;\npublic:\n    struct return_values {\n        StringType object_name;\n        StringType contents;\n        //class_id_type class_id;\n        int_least16_t class_id;\n        //object_id_type object_id;\n        uint_least32_t object_id;\n        //version_type version;\n        unsigned int version;\n        tracking_type tracking_level;\n        StringType class_name;\n        return_values() :\n            version(0),\n            tracking_level(false)\n        {}\n    } rv;\n    bool parse_start_tag(IStream & is) /*const*/;\n    bool parse_end_tag(IStream & is) const;\n    bool parse_string(IStream & is, StringType & s) /*const*/;\n    void init(IStream & is);\n    bool windup(IStream & is);\n    basic_xml_grammar();\n};\n\n} // namespace archive\n} // namespace boost\n\n#endif // BOOST_ARCHIVE_BASIC_XML_GRAMMAR_HPP\n"
  },
  {
    "path": "include/boost/archive/impl/basic_xml_iarchive.ipp",
    "content": "/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// basic_xml_iarchive.ipp:\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com . \n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for updates, documentation, and revision history.\n\n#include <boost/assert.hpp>\n#include <cstddef> // NULL\n#include <cstring> // strlen\n#include <algorithm>\n\n#include <boost/serialization/throw_exception.hpp>\n#include <boost/archive/xml_archive_exception.hpp>\n#include <boost/archive/basic_xml_iarchive.hpp>\n#include <boost/serialization/tracking.hpp>\n\nnamespace boost {\nnamespace archive {\n\n/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// implementation of xml_text_archive\n\ntemplate<class Archive>\nBOOST_ARCHIVE_OR_WARCHIVE_DECL void\nbasic_xml_iarchive<Archive>::load_start(const char *name){\n    // if there's no name\n    if(NULL == name)\n        return;\n    bool result = this->This()->gimpl->parse_start_tag(this->This()->get_is());\n    if(true != result){\n        boost::serialization::throw_exception(\n            archive_exception(archive_exception::input_stream_error)\n        );\n    }\n    // don't check start tag at highest level\n    ++depth;\n}\n\ntemplate<class Archive>\nBOOST_ARCHIVE_OR_WARCHIVE_DECL void\nbasic_xml_iarchive<Archive>::load_end(const char *name){\n    // if there's no name\n    if(NULL == name)\n        return;\n    bool result = this->This()->gimpl->parse_end_tag(this->This()->get_is());\n    if(true != result){\n        boost::serialization::throw_exception(\n            archive_exception(archive_exception::input_stream_error)\n        );\n    }\n    \n    // don't check start tag at highest level\n    if(0 == --depth)\n        return;\n        \n    if(0 == (this->get_flags() & no_xml_tag_checking)){\n        // double check that the tag matches what is expected - useful for debug\n        std::size_t parameter_name_length = std::strlen(name);\n        std::size_t object_name_length = this->This()->gimpl->rv.object_name.size();\n\n        if(parameter_name_length != object_name_length\n        || ! std::equal(\n                this->This()->gimpl->rv.object_name.begin(),\n                this->This()->gimpl->rv.object_name.end(),\n                name\n            )\n        ){\n            boost::serialization::throw_exception(\n                xml_archive_exception(\n                    xml_archive_exception::xml_archive_tag_mismatch,\n                    name\n                )\n            );\n        }\n    }\n}\n\ntemplate<class Archive>\nBOOST_ARCHIVE_OR_WARCHIVE_DECL void\nbasic_xml_iarchive<Archive>::load_override(object_id_type & t){\n    t = object_id_type(this->This()->gimpl->rv.object_id);\n}\n\ntemplate<class Archive>\nBOOST_ARCHIVE_OR_WARCHIVE_DECL void\nbasic_xml_iarchive<Archive>::load_override(version_type & t){\n    t = version_type(this->This()->gimpl->rv.version);\n}\n\ntemplate<class Archive>\nBOOST_ARCHIVE_OR_WARCHIVE_DECL void\nbasic_xml_iarchive<Archive>::load_override(class_id_type & t){\n    t = class_id_type(this->This()->gimpl->rv.class_id);\n}\n\ntemplate<class Archive>\nBOOST_ARCHIVE_OR_WARCHIVE_DECL void\nbasic_xml_iarchive<Archive>::load_override(tracking_type & t){\n    t = this->This()->gimpl->rv.tracking_level;\n}\n\ntemplate<class Archive>\nBOOST_ARCHIVE_OR_WARCHIVE_DECL\nbasic_xml_iarchive<Archive>::basic_xml_iarchive(unsigned int flags) :\n    detail::common_iarchive<Archive>(flags),\n    depth(0)\n{}\ntemplate<class Archive>\nBOOST_ARCHIVE_OR_WARCHIVE_DECL\nbasic_xml_iarchive<Archive>::~basic_xml_iarchive(){\n}\n\n} // namespace archive\n} // namespace boost\n"
  },
  {
    "path": "include/boost/archive/impl/basic_xml_oarchive.ipp",
    "content": "/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// basic_xml_oarchive.ipp:\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .\n// Distributed under the Boost Software License, Version 1.0. (See\n// accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for updates, documentation, and revision history.\n\n#include <algorithm>\n#include <cstddef> // NULL\n#include <cstring>\n#if defined(BOOST_NO_STDC_NAMESPACE) && ! defined(__LIBCOMO__)\nnamespace std{\n    using ::strlen;\n} // namespace std\n#endif\n\n#include <boost/archive/basic_xml_archive.hpp>\n#include <boost/archive/basic_xml_oarchive.hpp>\n#include <boost/archive/xml_archive_exception.hpp>\n#include <boost/core/no_exceptions_support.hpp>\n\nnamespace boost {\nnamespace archive {\n\nnamespace detail {\ntemplate<class CharType>\nstruct XML_name {\n    void operator()(CharType t) const{\n        const unsigned char lookup_table[] = {\n            0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n            0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n            0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0, // -.\n            1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0, // 0-9\n            0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, // A-\n            1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,1, // -Z _\n            0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, // a-\n            1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0, // -z\n            0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n            0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0\n        };\n        if((unsigned)t > 127)\n            return;\n        if(0 == lookup_table[(unsigned)t])\n            boost::serialization::throw_exception(\n                xml_archive_exception(\n                    xml_archive_exception::xml_archive_tag_name_error\n                )\n            );\n    }\n};\n\n} // namespace detail\n\n/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// implemenations of functions common to both types of xml output\n\ntemplate<class Archive>\nBOOST_ARCHIVE_OR_WARCHIVE_DECL void\nbasic_xml_oarchive<Archive>::write_attribute(\n    const char *attribute_name,\n    int t,\n    const char *conjunction\n){\n    this->This()->put(' ');\n    this->This()->put(attribute_name);\n    this->This()->put(conjunction);\n    this->This()->save(t);\n    this->This()->put('\"');\n}\n\ntemplate<class Archive>\nBOOST_ARCHIVE_OR_WARCHIVE_DECL void\nbasic_xml_oarchive<Archive>::write_attribute(\n    const char *attribute_name,\n    const char *key\n){\n    this->This()->put(' ');\n    this->This()->put(attribute_name);\n    this->This()->put(\"=\\\"\");\n    this->This()->save(key);\n    this->This()->put('\"');\n}\n\ntemplate<class Archive>\nBOOST_ARCHIVE_OR_WARCHIVE_DECL void\nbasic_xml_oarchive<Archive>::indent(){\n    int i;\n    for(i = depth; i-- > 0;)\n        this->This()->put('\\t');\n}\n\ntemplate<class Archive>\nBOOST_ARCHIVE_OR_WARCHIVE_DECL void\nbasic_xml_oarchive<Archive>::save_start(const char *name)\n{\n    if(NULL == name)\n        return;\n\n    // be sure name has no invalid characters\n    std::for_each(name, name + std::strlen(name), detail::XML_name<const char>());\n\n    end_preamble();\n    if(depth > 0){\n        this->This()->put('\\n');\n        indent();\n    }\n    ++depth;\n    this->This()->put('<');\n    this->This()->save(name);\n    pending_preamble = true;\n    indent_next = false;\n}\n\ntemplate<class Archive>\nBOOST_ARCHIVE_OR_WARCHIVE_DECL void\nbasic_xml_oarchive<Archive>::save_end(const char *name)\n{\n    if(NULL == name)\n        return;\n\n    // be sure name has no invalid characters\n    std::for_each(name, name + std::strlen(name), detail::XML_name<const char>());\n\n    end_preamble();\n    --depth;\n    if(indent_next){\n        this->This()->put('\\n');\n        indent();\n    }\n    indent_next = true;\n    this->This()->put(\"</\");\n    this->This()->save(name);\n    this->This()->put('>');\n    if(0 == depth)\n        this->This()->put('\\n');\n}\n\ntemplate<class Archive>\nBOOST_ARCHIVE_OR_WARCHIVE_DECL void\nbasic_xml_oarchive<Archive>::end_preamble(){\n    if(pending_preamble){\n        this->This()->put('>');\n        pending_preamble = false;\n    }\n}\n#if 0\ntemplate<class Archive>\nBOOST_ARCHIVE_OR_WARCHIVE_DECL void\nbasic_xml_oarchive<Archive>::save_override(const object_id_type & t)\n{\n    int i = t.t; // extra .t is for borland\n    write_attribute(BOOST_ARCHIVE_XML_OBJECT_ID(), i, \"=\\\"_\");\n}\ntemplate<class Archive>\nBOOST_ARCHIVE_OR_WARCHIVE_DECL void\nbasic_xml_oarchive<Archive>::save_override(\n    const object_reference_type & t,\n    int\n){\n    int i = t.t; // extra .t is for borland\n    write_attribute(BOOST_ARCHIVE_XML_OBJECT_REFERENCE(), i, \"=\\\"_\");\n}\ntemplate<class Archive>\nBOOST_ARCHIVE_OR_WARCHIVE_DECL void\nbasic_xml_oarchive<Archive>::save_override(const version_type & t)\n{\n    int i = t.t; // extra .t is for borland\n    write_attribute(BOOST_ARCHIVE_XML_VERSION(), i);\n}\n#endif\n\ntemplate<class Archive>\nBOOST_ARCHIVE_OR_WARCHIVE_DECL void\nbasic_xml_oarchive<Archive>::save_override(const object_id_type & t)\n{\n    // borland doesn't do conversion of STRONG_TYPEDEFs very well\n    const unsigned int i = t;\n    write_attribute(BOOST_ARCHIVE_XML_OBJECT_ID(), i, \"=\\\"_\");\n}\ntemplate<class Archive>\nBOOST_ARCHIVE_OR_WARCHIVE_DECL void\nbasic_xml_oarchive<Archive>::save_override(\n    const object_reference_type & t\n){\n    const unsigned int i = t;\n    write_attribute(BOOST_ARCHIVE_XML_OBJECT_REFERENCE(), i, \"=\\\"_\");\n}\ntemplate<class Archive>\nBOOST_ARCHIVE_OR_WARCHIVE_DECL void\nbasic_xml_oarchive<Archive>::save_override(const version_type & t)\n{\n    const unsigned int i = t;\n    write_attribute(BOOST_ARCHIVE_XML_VERSION(), i);\n}\n\ntemplate<class Archive>\nBOOST_ARCHIVE_OR_WARCHIVE_DECL void\nbasic_xml_oarchive<Archive>::save_override(const class_id_type & t)\n{\n    write_attribute(BOOST_ARCHIVE_XML_CLASS_ID(), t);\n}\ntemplate<class Archive>\nBOOST_ARCHIVE_OR_WARCHIVE_DECL void\nbasic_xml_oarchive<Archive>::save_override(\n    const class_id_reference_type & t\n){\n    write_attribute(BOOST_ARCHIVE_XML_CLASS_ID_REFERENCE(), t);\n}\ntemplate<class Archive>\nBOOST_ARCHIVE_OR_WARCHIVE_DECL void\nbasic_xml_oarchive<Archive>::save_override(\n    const class_id_optional_type & t\n){\n    write_attribute(BOOST_ARCHIVE_XML_CLASS_ID(), t);\n}\ntemplate<class Archive>\nBOOST_ARCHIVE_OR_WARCHIVE_DECL void\nbasic_xml_oarchive<Archive>::save_override(const class_name_type & t)\n{\n    const char * key = t;\n    if(NULL == key)\n        return;\n    write_attribute(BOOST_ARCHIVE_XML_CLASS_NAME(), key);\n}\n\ntemplate<class Archive>\nBOOST_ARCHIVE_OR_WARCHIVE_DECL void\nbasic_xml_oarchive<Archive>::save_override(const tracking_type & t)\n{\n    write_attribute(BOOST_ARCHIVE_XML_TRACKING(), t.t);\n}\n\ntemplate<class Archive>\nBOOST_ARCHIVE_OR_WARCHIVE_DECL void\nbasic_xml_oarchive<Archive>::init(){\n    // xml header\n    this->This()->put(\"<?xml version=\\\"1.0\\\" encoding=\\\"UTF-8\\\" standalone=\\\"yes\\\" ?>\\n\");\n    this->This()->put(\"<!DOCTYPE boost_serialization>\\n\");\n    // xml document wrapper - outer root\n    this->This()->put(\"<boost_serialization\");\n    write_attribute(\"signature\", BOOST_ARCHIVE_SIGNATURE());\n    write_attribute(\"version\", BOOST_ARCHIVE_VERSION());\n    this->This()->put(\">\\n\");\n}\n\ntemplate<class Archive>\nBOOST_ARCHIVE_OR_WARCHIVE_DECL void\nbasic_xml_oarchive<Archive>::windup(){\n    // xml_trailer\n    this->This()->put(\"</boost_serialization>\\n\");\n}\n\ntemplate<class Archive>\nBOOST_ARCHIVE_OR_WARCHIVE_DECL\nbasic_xml_oarchive<Archive>::basic_xml_oarchive(unsigned int flags) :\n    detail::common_oarchive<Archive>(flags),\n    depth(0),\n    pending_preamble(false),\n    indent_next(false)\n{\n}\n\ntemplate<class Archive>\nBOOST_ARCHIVE_OR_WARCHIVE_DECL\nbasic_xml_oarchive<Archive>::~basic_xml_oarchive(){\n}\n\n} // namespace archive\n} // namespace boost\n"
  },
  {
    "path": "include/boost/archive/impl/text_iarchive_impl.ipp",
    "content": "/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// text_iarchive_impl.ipp:\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .\n// Distributed under the Boost Software License, Version 1.0. (See\n// accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for updates, documentation, and revision history.\n\n//////////////////////////////////////////////////////////////////////\n// implementation of basic_text_iprimitive overrides for the combination\n// of template parameters used to implement a text_iprimitive\n\n#include <cstddef> // size_t, NULL\n#include <boost/config.hpp>\n#if defined(BOOST_NO_STDC_NAMESPACE)\nnamespace std{ \n    using ::size_t; \n} // namespace std\n#endif\n\n#include <boost/detail/workaround.hpp> // RogueWave\n\n#include <boost/archive/text_iarchive.hpp>\n\nnamespace boost {\nnamespace archive {\n\ntemplate<class Archive>\nBOOST_ARCHIVE_DECL void\ntext_iarchive_impl<Archive>::load(char *s)\n{\n    std::size_t size;\n    * this->This() >> size;\n    // skip separating space\n    is.get();\n    // Works on all tested platforms\n    is.read(s, size);\n    s[size] = '\\0';\n}\n\ntemplate<class Archive>\nBOOST_ARCHIVE_DECL void\ntext_iarchive_impl<Archive>::load(std::string &s)\n{\n    std::size_t size;\n    * this->This() >> size;\n    // skip separating space\n    is.get();\n    // borland de-allocator fixup\n    #if BOOST_WORKAROUND(_RWSTD_VER, BOOST_TESTED_AT(20101))\n    if(NULL != s.data())\n    #endif\n        s.resize(size);\n    if(0 < size)\n        is.read(&(*s.begin()), size);\n}\n\n#ifndef BOOST_NO_CWCHAR\n#ifndef BOOST_NO_INTRINSIC_WCHAR_T\ntemplate<class Archive>\nBOOST_ARCHIVE_DECL void\ntext_iarchive_impl<Archive>::load(wchar_t *ws)\n{\n    std::size_t size;\n    * this->This() >> size;\n    // skip separating space\n    is.get();\n    is.read((char *)ws, size * sizeof(wchar_t)/sizeof(char));\n    ws[size] = L'\\0';\n}\n#endif // BOOST_NO_INTRINSIC_WCHAR_T\n\n#ifndef BOOST_NO_STD_WSTRING\ntemplate<class Archive>\nBOOST_ARCHIVE_DECL void\ntext_iarchive_impl<Archive>::load(std::wstring &ws)\n{\n    std::size_t size;\n    * this->This() >> size;\n    // borland de-allocator fixup\n    #if BOOST_WORKAROUND(_RWSTD_VER, BOOST_TESTED_AT(20101))\n    if(NULL != ws.data())\n    #endif\n        ws.resize(size);\n    // skip separating space\n    is.get();\n    is.read((char *)ws.data(), size * sizeof(wchar_t)/sizeof(char));\n}\n\n#endif // BOOST_NO_STD_WSTRING\n#endif // BOOST_NO_CWCHAR\n\ntemplate<class Archive>\nBOOST_ARCHIVE_DECL void\ntext_iarchive_impl<Archive>::load_override(class_name_type & t){\n    basic_text_iarchive<Archive>::load_override(t);\n}\n\ntemplate<class Archive>\nBOOST_ARCHIVE_DECL void\ntext_iarchive_impl<Archive>::init(){\n    basic_text_iarchive<Archive>::init();\n}\n\ntemplate<class Archive>\nBOOST_ARCHIVE_DECL \ntext_iarchive_impl<Archive>::text_iarchive_impl(\n    std::istream & is, \n    unsigned int flags\n) :\n    basic_text_iprimitive<std::istream>(\n        is, \n        0 != (flags & no_codecvt)\n    ),\n    basic_text_iarchive<Archive>(flags)\n{}\n\n} // namespace archive\n} // namespace boost\n"
  },
  {
    "path": "include/boost/archive/impl/text_oarchive_impl.ipp",
    "content": "/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// text_oarchive_impl.ipp:\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .\n// Distributed under the Boost Software License, Version 1.0. (See\n// accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for updates, documentation, and revision history.\n\n#include <string>\n#include <boost/config.hpp>\n#include <cstddef> // size_t\n\n#include <boost/config.hpp>\n#if defined(BOOST_NO_STDC_NAMESPACE)\nnamespace std{ \n    using ::size_t; \n} // namespace std\n#endif\n\n#ifndef BOOST_NO_CWCHAR\n#include <cwchar>\n#ifdef BOOST_NO_STDC_NAMESPACE\nnamespace std{ using ::wcslen; }\n#endif\n#endif\n\n#include <boost/archive/text_oarchive.hpp>\n\nnamespace boost { \nnamespace archive {\n\n//////////////////////////////////////////////////////////////////////\n// implementation of basic_text_oprimitive overrides for the combination\n// of template parameters used to create a text_oprimitive\n\ntemplate<class Archive>\nBOOST_ARCHIVE_DECL void\ntext_oarchive_impl<Archive>::save(const char * s)\n{\n    const std::size_t len = std::ostream::traits_type::length(s);\n    *this->This() << len;\n    this->This()->newtoken();\n    os << s;\n}\n\ntemplate<class Archive>\nBOOST_ARCHIVE_DECL void\ntext_oarchive_impl<Archive>::save(const std::string &s)\n{\n    const std::size_t size = s.size();\n    *this->This() << size;\n    this->This()->newtoken();\n    os << s;\n}\n\n#ifndef BOOST_NO_CWCHAR\n#ifndef BOOST_NO_INTRINSIC_WCHAR_T\ntemplate<class Archive>\nBOOST_ARCHIVE_DECL void\ntext_oarchive_impl<Archive>::save(const wchar_t * ws)\n{\n    const std::size_t l = std::wcslen(ws);\n    * this->This() << l;\n    this->This()->newtoken();\n    os.write((const char *)ws, l * sizeof(wchar_t)/sizeof(char));\n}\n#endif\n\n#ifndef BOOST_NO_STD_WSTRING\ntemplate<class Archive>\nBOOST_ARCHIVE_DECL void\ntext_oarchive_impl<Archive>::save(const std::wstring &ws)\n{\n    const std::size_t l = ws.size();\n    * this->This() << l;\n    this->This()->newtoken();\n    os.write((const char *)(ws.data()), l * sizeof(wchar_t)/sizeof(char));\n}\n#endif\n#endif // BOOST_NO_CWCHAR\n\ntemplate<class Archive>\nBOOST_ARCHIVE_DECL \ntext_oarchive_impl<Archive>::text_oarchive_impl(\n    std::ostream & os, \n    unsigned int flags\n) :\n    basic_text_oprimitive<std::ostream>(\n        os, \n        0 != (flags & no_codecvt)\n    ),\n    basic_text_oarchive<Archive>(flags)\n{\n}\n\ntemplate<class Archive>\nBOOST_ARCHIVE_DECL void\ntext_oarchive_impl<Archive>::save_binary(const void *address, std::size_t count){\n    put('\\n');\n    this->end_preamble();\n    #if ! defined(__MWERKS__)\n    this->basic_text_oprimitive<std::ostream>::save_binary(\n    #else\n    this->basic_text_oprimitive::save_binary(\n    #endif\n        address, \n        count\n    );\n    this->delimiter = this->eol;\n}\n\n} // namespace archive\n} // namespace boost\n\n"
  },
  {
    "path": "include/boost/archive/impl/text_wiarchive_impl.ipp",
    "content": "/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// text_text_wiarchive_impl.ipp:\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .\n// Distributed under the Boost Software License, Version 1.0. (See\n// accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for updates, documentation, and revision history.\n\n#include <cstddef> // size_t, NULL\n\n#include <boost/config.hpp>\n#if defined(BOOST_NO_STDC_NAMESPACE)\nnamespace std{ \n    using ::size_t; \n} // namespace std\n#endif\n\n#include <boost/detail/workaround.hpp>  // fixup for RogueWave\n\n#ifndef BOOST_NO_STD_WSTREAMBUF\n#include <boost/archive/basic_text_iprimitive.hpp>\n\nnamespace boost { \nnamespace archive {\n\n//////////////////////////////////////////////////////////////////////\n// implementation of wiprimtives functions\n//\ntemplate<class Archive>\nBOOST_WARCHIVE_DECL void\ntext_wiarchive_impl<Archive>::load(char *s)\n{\n    std::size_t size;\n    * this->This() >> size;\n    // skip separating space\n    is.get();\n    while(size-- > 0){\n        *s++ = is.narrow(is.get(), '\\0');\n    }\n    *s = '\\0';\n}\n\ntemplate<class Archive>\nBOOST_WARCHIVE_DECL void\ntext_wiarchive_impl<Archive>::load(std::string &s)\n{\n    std::size_t size;\n    * this->This() >> size;\n    // skip separating space\n    is.get();\n    #if BOOST_WORKAROUND(_RWSTD_VER, BOOST_TESTED_AT(20101))\n    if(NULL != s.data())\n    #endif\n        s.resize(0);\n    s.reserve(size);\n    while(size-- > 0){\n        char x = is.narrow(is.get(), '\\0');\n        s += x;\n    }\n}\n\n#ifndef BOOST_NO_INTRINSIC_WCHAR_T\ntemplate<class Archive>\nBOOST_WARCHIVE_DECL void\ntext_wiarchive_impl<Archive>::load(wchar_t *s)\n{\n    std::size_t size;\n    * this->This() >> size;\n    // skip separating space\n    is.get();\n    // Works on all tested platforms\n    is.read(s, size);\n    s[size] = L'\\0';\n}\n#endif\n\n#ifndef BOOST_NO_STD_WSTRING\ntemplate<class Archive>\nBOOST_WARCHIVE_DECL void\ntext_wiarchive_impl<Archive>::load(std::wstring &ws)\n{\n    std::size_t size;\n    * this->This() >> size;\n    // skip separating space\n    is.get();\n    // borland complains about resize\n    // borland de-allocator fixup\n    #if BOOST_WORKAROUND(_RWSTD_VER, BOOST_TESTED_AT(20101))\n    if(NULL != ws.data())\n    #endif\n        ws.resize(size);\n    // note breaking a rule here - is this a problem on some platform\n    is.read(const_cast<wchar_t *>(ws.data()), size);\n}\n#endif\n\ntemplate<class Archive>\nBOOST_WARCHIVE_DECL \ntext_wiarchive_impl<Archive>::text_wiarchive_impl(\n    std::wistream & is, \n    unsigned int flags\n) :\n    basic_text_iprimitive<std::wistream>(\n        is, \n        0 != (flags & no_codecvt)\n    ),\n    basic_text_iarchive<Archive>(flags)\n{\n}\n\n} // archive\n} // boost\n\n#endif // BOOST_NO_STD_WSTREAMBUF\n"
  },
  {
    "path": "include/boost/archive/impl/text_woarchive_impl.ipp",
    "content": "/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// text_woarchive_impl.ipp:\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .\n// Distributed under the Boost Software License, Version 1.0. (See\n// accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for updates, documentation, and revision history.\n\n#include <boost/config.hpp>\n#ifndef BOOST_NO_STD_WSTREAMBUF\n\n#include <cstring>\n#include <cstddef> // size_t\n#if defined(BOOST_NO_STDC_NAMESPACE) && ! defined(__LIBCOMO__)\nnamespace std{ \n    using ::strlen;\n    using ::size_t; \n} // namespace std\n#endif\n\n#include <ostream>\n\n#include <boost/archive/text_woarchive.hpp>\n\nnamespace boost {\nnamespace archive {\n\n//////////////////////////////////////////////////////////////////////\n// implementation of woarchive functions\n//\ntemplate<class Archive>\nBOOST_WARCHIVE_DECL void\ntext_woarchive_impl<Archive>::save(const char *s)\n{\n    // note: superfluous local variable fixes borland warning\n    const std::size_t size = std::strlen(s);\n    * this->This() << size;\n    this->This()->newtoken();\n    while(*s != '\\0')\n        os.put(os.widen(*s++));\n}\n\ntemplate<class Archive>\nBOOST_WARCHIVE_DECL void\ntext_woarchive_impl<Archive>::save(const std::string &s)\n{\n    const std::size_t size = s.size();\n    * this->This() << size;\n    this->This()->newtoken();\n    const char * cptr = s.data();\n    for(std::size_t i = size; i-- > 0;)\n        os.put(os.widen(*cptr++));\n}\n\n#ifndef BOOST_NO_INTRINSIC_WCHAR_T\ntemplate<class Archive>\nBOOST_WARCHIVE_DECL void\ntext_woarchive_impl<Archive>::save(const wchar_t *ws)\n{\n    const std::size_t size = std::wostream::traits_type::length(ws);\n    * this->This() << size;\n    this->This()->newtoken();\n    os.write(ws, size);\n}\n#endif\n\n#ifndef BOOST_NO_STD_WSTRING\ntemplate<class Archive>\nBOOST_WARCHIVE_DECL void\ntext_woarchive_impl<Archive>::save(const std::wstring &ws)\n{\n    const std::size_t size = ws.length();\n    * this->This() << size;\n    this->This()->newtoken();\n    os.write(ws.data(), size);\n}\n#endif\n\n} // namespace archive\n} // namespace boost\n\n#endif\n\n"
  },
  {
    "path": "include/boost/archive/impl/xml_iarchive_impl.ipp",
    "content": "/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// xml_iarchive_impl.cpp:\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .\n// Distributed under the Boost Software License, Version 1.0. (See\n// accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for updates, documentation, and revision history.\n\n#include <boost/config.hpp>\n#include <cstring> // memcpy\n#include <cstddef> // NULL\n\n#if defined(BOOST_NO_STDC_NAMESPACE)\nnamespace std{ \n    using ::memcpy;\n} // namespace std\n#endif\n\n#ifndef BOOST_NO_CWCHAR\n#include <cwchar> // mbstate_t and mbrtowc\n#if defined(BOOST_NO_STDC_NAMESPACE)\nnamespace std{ \n    using ::mbstate_t;\n    using ::mbrtowc;\n } // namespace std\n#endif\n#endif // BOOST_NO_CWCHAR\n\n#include <boost/detail/workaround.hpp> // RogueWave and Dinkumware\n#if BOOST_WORKAROUND(BOOST_DINKUMWARE_STDLIB, == 1)\n#include <boost/archive/dinkumware.hpp>\n#endif\n\n#include <boost/core/uncaught_exceptions.hpp>\n#include <boost/core/no_exceptions_support.hpp>\n\n#include <boost/archive/xml_archive_exception.hpp>\n#include <boost/archive/iterators/dataflow_exception.hpp>\n#include <boost/archive/basic_xml_archive.hpp>\n#include <boost/archive/xml_iarchive.hpp>\n\n#include \"basic_xml_grammar.hpp\"\n\nnamespace boost {\nnamespace archive {\n\n/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// implemenations of functions specific to char archives\n\n// wide char stuff used by char archives\n\n#ifndef BOOST_NO_CWCHAR\n#ifndef BOOST_NO_STD_WSTRING\ntemplate<class Archive>\nBOOST_ARCHIVE_DECL void\nxml_iarchive_impl<Archive>::load(std::wstring &ws){\n    std::string s;\n    bool result = gimpl->parse_string(is, s);\n    if(! result)\n        boost::serialization::throw_exception(\n            xml_archive_exception(xml_archive_exception::xml_archive_parsing_error)\n        );\n    \n    #if BOOST_WORKAROUND(_RWSTD_VER, BOOST_TESTED_AT(20101))\n    if(NULL != ws.data())\n    #endif\n    ws.resize(0);\n    std::mbstate_t mbs = std::mbstate_t();\n    const char * start = s.data();\n    const char * end = start + s.size();\n    while(start < end){\n        wchar_t wc;\n        std::size_t count = std::mbrtowc(&wc, start, end - start, &mbs);\n        if(count == static_cast<std::size_t>(-1))\n            boost::serialization::throw_exception(\n                iterators::dataflow_exception(\n                    iterators::dataflow_exception::invalid_conversion\n                )\n            );\n        if(count == static_cast<std::size_t>(-2))\n            continue;\n        start += count;\n        ws += wc;\n    }\n}\n#endif // BOOST_NO_STD_WSTRING\n\n#ifndef BOOST_NO_INTRINSIC_WCHAR_T\ntemplate<class Archive>\nBOOST_ARCHIVE_DECL void\nxml_iarchive_impl<Archive>::load(wchar_t * ws){\n    std::string s;\n    bool result = gimpl->parse_string(is, s);\n    if(! result)\n        boost::serialization::throw_exception(\n            xml_archive_exception(\n                xml_archive_exception::xml_archive_parsing_error\n            )\n        );\n        \n    std::mbstate_t mbs = std::mbstate_t();\n    const char * start = s.data();\n    const char * end = start + s.size();\n    while(start < end){\n        wchar_t wc;\n        std::size_t length = std::mbrtowc(&wc, start, end - start, &mbs);\n        if(static_cast<std::size_t>(-1) == length)\n            boost::serialization::throw_exception(\n                iterators::dataflow_exception(\n                    iterators::dataflow_exception::invalid_conversion\n                )\n            );\n        if(static_cast<std::size_t>(-2) == length)\n            continue;\n\n        start += length;\n        *ws++ = wc;\n    }\n    *ws = L'\\0';\n}\n#endif // BOOST_NO_INTRINSIC_WCHAR_T\n\n#endif // BOOST_NO_CWCHAR\n\ntemplate<class Archive>\nBOOST_ARCHIVE_DECL void\nxml_iarchive_impl<Archive>::load(std::string &s){\n    bool result = gimpl->parse_string(is, s);\n    if(! result)\n        boost::serialization::throw_exception(\n            xml_archive_exception(xml_archive_exception::xml_archive_parsing_error)\n        );\n}\n\ntemplate<class Archive>\nBOOST_ARCHIVE_DECL void\nxml_iarchive_impl<Archive>::load(char * s){\n    std::string tstring;\n    bool result = gimpl->parse_string(is, tstring);\n    if(! result)\n        boost::serialization::throw_exception(\n            xml_archive_exception(xml_archive_exception::xml_archive_parsing_error)\n        );\n    std::memcpy(s, tstring.data(), tstring.size());\n    s[tstring.size()] = 0;\n}\n\ntemplate<class Archive>\nBOOST_ARCHIVE_DECL void\nxml_iarchive_impl<Archive>::load_override(class_name_type & t){\n    const std::string & s = gimpl->rv.class_name;\n    if(s.size() > BOOST_SERIALIZATION_MAX_KEY_SIZE - 1)\n        boost::serialization::throw_exception(\n            archive_exception(archive_exception::invalid_class_name)\n       );\n    char * tptr = t;\n    std::memcpy(tptr, s.data(), s.size());\n    tptr[s.size()] = '\\0';\n}\n\ntemplate<class Archive>\nBOOST_ARCHIVE_DECL void\nxml_iarchive_impl<Archive>::init(){\n    gimpl->init(is);\n    this->set_library_version(\n        boost::serialization::library_version_type(gimpl->rv.version)\n    );\n}\n\ntemplate<class Archive>\nBOOST_ARCHIVE_DECL\nxml_iarchive_impl<Archive>::xml_iarchive_impl(\n    std::istream &is_,\n    unsigned int flags\n) :\n    basic_text_iprimitive<std::istream>(\n        is_, \n        0 != (flags & no_codecvt)\n    ),\n    basic_xml_iarchive<Archive>(flags),\n    gimpl(new xml_grammar())\n{}\n\ntemplate<class Archive>\nBOOST_ARCHIVE_DECL\nxml_iarchive_impl<Archive>::~xml_iarchive_impl(){\n    if(boost::core::uncaught_exceptions() > 0)\n        return;\n    if(0 == (this->get_flags() & no_header)){\n        gimpl->windup(is);\n    }\n}\n} // namespace archive\n} // namespace boost\n"
  },
  {
    "path": "include/boost/archive/impl/xml_oarchive_impl.ipp",
    "content": "/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// xml_oarchive_impl.ipp:\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .\n// Distributed under the Boost Software License, Version 1.0. (See\n// accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n#include <ostream>\n#include <iomanip>\n#include <algorithm> // std::copy\n#include <string>\n\n#include <cstring> // strlen\n#include <boost/config.hpp> // msvc 6.0 needs this to suppress warnings\n#if defined(BOOST_NO_STDC_NAMESPACE)\nnamespace std{ \n    using ::strlen; \n} // namespace std\n#endif\n\n#include <boost/core/uncaught_exceptions.hpp>\n#include <boost/archive/iterators/xml_escape.hpp>\n#include <boost/archive/iterators/ostream_iterator.hpp>\n\n#ifndef BOOST_NO_CWCHAR\n#include <boost/archive/wcslen.hpp>\n#include <boost/archive/iterators/mb_from_wchar.hpp>\n#endif\n\nnamespace boost {\nnamespace archive {\n\n/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// implemenations of functions specific to char archives\n\n// wide char stuff used by char archives\n#ifndef BOOST_NO_CWCHAR\n// copy chars to output escaping to xml and translating wide chars to mb chars\ntemplate<class InputIterator>\nvoid save_iterator(std::ostream &os, InputIterator begin, InputIterator end){\n    typedef boost::archive::iterators::mb_from_wchar<\n        boost::archive::iterators::xml_escape<InputIterator>\n    > translator;\n    std::copy(\n        translator(begin),\n        translator(end),\n        boost::archive::iterators::ostream_iterator<char>(os)\n    );\n}\n\n#ifndef BOOST_NO_STD_WSTRING\ntemplate<class Archive>\nBOOST_ARCHIVE_DECL void\nxml_oarchive_impl<Archive>::save(const std::wstring & ws){\n//  at least one library doesn't typedef value_type for strings\n//  so rather than using string directly make a pointer iterator out of it\n//    save_iterator(os, ws.data(), ws.data() + std::wcslen(ws.data()));\n    save_iterator(os, ws.data(), ws.data() + ws.size());\n}\n#endif\n\n#ifndef BOOST_NO_INTRINSIC_WCHAR_T\ntemplate<class Archive>\nBOOST_ARCHIVE_DECL void\nxml_oarchive_impl<Archive>::save(const wchar_t * ws){\n    save_iterator(os, ws, ws + std::wcslen(ws));\n}\n#endif\n\n#endif // BOOST_NO_CWCHAR\n\ntemplate<class Archive>\nBOOST_ARCHIVE_DECL void\nxml_oarchive_impl<Archive>::save(const std::string & s){\n//  at least one library doesn't typedef value_type for strings\n//  so rather than using string directly make a pointer iterator out of it\n    typedef boost::archive::iterators::xml_escape<\n        const char * \n    > xml_escape_translator;\n    std::copy(\n        xml_escape_translator(s.data()),\n        xml_escape_translator(s.data()+ s.size()),\n        boost::archive::iterators::ostream_iterator<char>(os)\n    );\n}\n\ntemplate<class Archive>\nBOOST_ARCHIVE_DECL void\nxml_oarchive_impl<Archive>::save(const char * s){\n    typedef boost::archive::iterators::xml_escape<\n        const char * \n    > xml_escape_translator;\n    std::copy(\n        xml_escape_translator(s),\n        xml_escape_translator(s + std::strlen(s)),\n        boost::archive::iterators::ostream_iterator<char>(os)\n    );\n}\n\ntemplate<class Archive>\nBOOST_ARCHIVE_DECL\nxml_oarchive_impl<Archive>::xml_oarchive_impl(\n    std::ostream & os_, \n    unsigned int flags\n) : \n    basic_text_oprimitive<std::ostream>(\n        os_,\n        0 != (flags & no_codecvt)\n    ),\n    basic_xml_oarchive<Archive>(flags)\n{}\n\ntemplate<class Archive>\nBOOST_ARCHIVE_DECL void\nxml_oarchive_impl<Archive>::save_binary(const void *address, std::size_t count){\n    this->end_preamble();\n    #if ! defined(__MWERKS__)\n    this->basic_text_oprimitive<std::ostream>::save_binary(\n    #else\n    this->basic_text_oprimitive::save_binary(\n    #endif\n        address, \n        count\n    );\n    this->indent_next = true;\n}\n\ntemplate<class Archive>\nBOOST_ARCHIVE_DECL\nxml_oarchive_impl<Archive>::~xml_oarchive_impl(){\n    if(boost::core::uncaught_exceptions() > 0)\n        return;\n    if(0 == (this->get_flags() & no_header)){\n        this->put(\"</boost_serialization>\\n\");\n    }\n}\n\n} // namespace archive\n} // namespace boost\n"
  },
  {
    "path": "include/boost/archive/impl/xml_wiarchive_impl.ipp",
    "content": "/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// xml_wiarchive_impl.ipp:\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .\n// Distributed under the Boost Software License, Version 1.0. (See\n// accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for updates, documentation, and revision history.\n\n#include <cstring>\n#if defined(BOOST_NO_STDC_NAMESPACE)\nnamespace std{ \n    using ::memcpy; \n} //std\n#endif\n\n#include <boost/config.hpp> // msvc 6.0 needs this to suppress warnings\n#ifndef BOOST_NO_STD_WSTREAMBUF\n\n#include <boost/assert.hpp>\n#include <algorithm> // std::copy\n#include <boost/detail/workaround.hpp> // Dinkumware and RogueWave\n#if BOOST_WORKAROUND(BOOST_DINKUMWARE_STDLIB, == 1)\n#include <boost/archive/dinkumware.hpp>\n#endif\n\n#include <boost/io/ios_state.hpp>\n#include <boost/core/uncaught_exceptions.hpp>\n#include <boost/core/no_exceptions_support.hpp>\n#include <boost/serialization/string.hpp>\n\n#include <boost/archive/basic_xml_archive.hpp>\n#include <boost/archive/xml_wiarchive.hpp>\n\n#include <boost/archive/xml_archive_exception.hpp>\n#include <boost/archive/iterators/mb_from_wchar.hpp>\n\n#include <boost/archive/detail/utf8_codecvt_facet.hpp>\n\n#include \"basic_xml_grammar.hpp\"\n\nnamespace boost {\nnamespace archive {\n\n/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// implemenations of functions specific to wide char archives\n\nnamespace { // anonymous\n\nvoid copy_to_ptr(char * s, const std::wstring & ws){\n    std::copy(\n        iterators::mb_from_wchar<std::wstring::const_iterator>(\n            ws.begin()\n        ), \n        iterators::mb_from_wchar<std::wstring::const_iterator>(\n            ws.end()\n        ), \n        s\n    );\n    s[ws.size()] = 0;\n}\n\n} // anonymous\n\ntemplate<class Archive>\nBOOST_WARCHIVE_DECL void\nxml_wiarchive_impl<Archive>::load(std::string & s){\n    std::wstring ws;\n    bool result = gimpl->parse_string(is, ws);\n    if(! result)\n        boost::serialization::throw_exception(\n            xml_archive_exception(xml_archive_exception::xml_archive_parsing_error)\n        );\n    #if BOOST_WORKAROUND(_RWSTD_VER, BOOST_TESTED_AT(20101))\n    if(NULL != s.data())\n    #endif\n        s.resize(0);\n    s.reserve(ws.size());\n    std::copy(\n        iterators::mb_from_wchar<std::wstring::iterator>(\n            ws.begin()\n        ), \n        iterators::mb_from_wchar<std::wstring::iterator>(\n            ws.end()\n        ), \n        std::back_inserter(s)\n    );\n}\n\n#ifndef BOOST_NO_STD_WSTRING\ntemplate<class Archive>\nBOOST_WARCHIVE_DECL void\nxml_wiarchive_impl<Archive>::load(std::wstring & ws){\n    bool result = gimpl->parse_string(is, ws);\n    if(! result)\n        boost::serialization::throw_exception(\n            xml_archive_exception(xml_archive_exception::xml_archive_parsing_error)\n        );\n}\n#endif\n\ntemplate<class Archive>\nBOOST_WARCHIVE_DECL void\nxml_wiarchive_impl<Archive>::load(char * s){\n    std::wstring ws;\n    bool result = gimpl->parse_string(is, ws);\n    if(! result)\n        boost::serialization::throw_exception(\n            xml_archive_exception(xml_archive_exception::xml_archive_parsing_error)\n        );\n    copy_to_ptr(s, ws);\n}\n\n#ifndef BOOST_NO_INTRINSIC_WCHAR_T\ntemplate<class Archive>\nBOOST_WARCHIVE_DECL void\nxml_wiarchive_impl<Archive>::load(wchar_t * ws){\n    std::wstring twstring;\n    bool result = gimpl->parse_string(is, twstring);\n    if(! result)\n        boost::serialization::throw_exception(\n            xml_archive_exception(xml_archive_exception::xml_archive_parsing_error)\n        );\n    std::memcpy(ws, twstring.c_str(), twstring.size());\n    ws[twstring.size()] = L'\\0';\n}\n#endif\n\ntemplate<class Archive>\nBOOST_WARCHIVE_DECL void\nxml_wiarchive_impl<Archive>::load_override(class_name_type & t){\n    const std::wstring & ws = gimpl->rv.class_name;\n    if(ws.size() > BOOST_SERIALIZATION_MAX_KEY_SIZE - 1)\n        boost::serialization::throw_exception(\n            archive_exception(archive_exception::invalid_class_name)\n        );\n    copy_to_ptr(t, ws);\n}\n\ntemplate<class Archive>\nBOOST_WARCHIVE_DECL void\nxml_wiarchive_impl<Archive>::init(){\n    gimpl->init(is);\n    this->set_library_version(\n        boost::serialization::library_version_type(gimpl->rv.version)\n    );\n}\n\ntemplate<class Archive>\nBOOST_WARCHIVE_DECL\nxml_wiarchive_impl<Archive>::xml_wiarchive_impl(\n    std::wistream &is_,\n    unsigned int flags\n) :\n    basic_text_iprimitive<std::wistream>(\n        is_, \n        true // don't change the codecvt - use the one below\n    ),\n    basic_xml_iarchive<Archive>(flags),\n    gimpl(new xml_wgrammar())\n{\n    if(0 == (flags & no_codecvt)){\n        archive_locale = std::locale(\n            is_.getloc(),\n            new boost::archive::detail::utf8_codecvt_facet\n        );\n        // libstdc++ crashes without this\n        is_.sync();\n        is_.imbue(archive_locale);\n    }\n}\n\ntemplate<class Archive>\nBOOST_WARCHIVE_DECL\nxml_wiarchive_impl<Archive>::~xml_wiarchive_impl(){\n    if(boost::core::uncaught_exceptions() > 0)\n        return;\n    if(0 == (this->get_flags() & no_header)){\n        gimpl->windup(is);\n    }\n}\n\n} // namespace archive\n} // namespace boost\n\n#endif  // BOOST_NO_STD_WSTREAMBUF\n"
  },
  {
    "path": "include/boost/archive/impl/xml_woarchive_impl.ipp",
    "content": "/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// xml_woarchive_impl.ipp:\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .\n// Distributed under the Boost Software License, Version 1.0. (See\n// accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n#include <boost/config.hpp>\n#ifndef BOOST_NO_STD_WSTREAMBUF\n\n#include <ostream>\n#include <string>\n#include <algorithm> // std::copy\n#include <locale>\n\n#include <cstring> // strlen\n#include <cstdlib> // mbtowc\n#ifndef BOOST_NO_CWCHAR\n#include <cwchar>  // wcslen\n#endif\n\n#include <boost/config.hpp>\n#if defined(BOOST_NO_STDC_NAMESPACE)\nnamespace std{ \n    using ::strlen; \n    #if ! defined(BOOST_NO_INTRINSIC_WCHAR_T)\n        using ::mbtowc; \n        using ::wcslen;\n    #endif\n} // namespace std\n#endif\n\n#include <boost/core/uncaught_exceptions.hpp>\n\n#include <boost/archive/xml_woarchive.hpp>\n#include <boost/archive/detail/utf8_codecvt_facet.hpp>\n\n#include <boost/serialization/throw_exception.hpp>\n\n#include <boost/archive/iterators/xml_escape.hpp>\n#include <boost/archive/iterators/wchar_from_mb.hpp>\n#include <boost/archive/iterators/ostream_iterator.hpp>\n#include <boost/archive/iterators/dataflow_exception.hpp>\n\nnamespace boost {\nnamespace archive {\n\n/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// implemenations of functions specific to wide char archives\n\n// copy chars to output escaping to xml and widening characters as we go\ntemplate<class InputIterator>\nvoid save_iterator(std::wostream &os, InputIterator begin, InputIterator end){\n    typedef iterators::wchar_from_mb<\n        iterators::xml_escape<InputIterator>\n    > xmbtows;\n    std::copy(\n        xmbtows(begin),\n        xmbtows(end),\n        boost::archive::iterators::ostream_iterator<wchar_t>(os)\n    );\n}\n\ntemplate<class Archive>\nBOOST_WARCHIVE_DECL void\nxml_woarchive_impl<Archive>::save(const std::string & s){\n    // note: we don't use s.begin() and s.end() because dinkumware\n    // doesn't have string::value_type defined. So use a wrapper\n    // around these values to implement the definitions.\n    const char * begin = s.data();\n    const char * end = begin + s.size();\n    save_iterator(os, begin, end);\n}\n\n#ifndef BOOST_NO_STD_WSTRING\ntemplate<class Archive>\nBOOST_WARCHIVE_DECL void\nxml_woarchive_impl<Archive>::save(const std::wstring & ws){\n#if 0\n    typedef iterators::xml_escape<std::wstring::const_iterator> xmbtows;\n    std::copy(\n        xmbtows(ws.begin()),\n        xmbtows(ws.end()),\n        boost::archive::iterators::ostream_iterator<wchar_t>(os)\n    );\n#endif\n    typedef iterators::xml_escape<const wchar_t *> xmbtows;\n    std::copy(\n        xmbtows(ws.data()),\n        xmbtows(ws.data() + ws.size()),\n        boost::archive::iterators::ostream_iterator<wchar_t>(os)\n    );\n}\n#endif //BOOST_NO_STD_WSTRING\n\ntemplate<class Archive>\nBOOST_WARCHIVE_DECL void\nxml_woarchive_impl<Archive>::save(const char * s){\n   save_iterator(os, s, s + std::strlen(s));\n}\n\n#ifndef BOOST_NO_INTRINSIC_WCHAR_T\ntemplate<class Archive>\nBOOST_WARCHIVE_DECL void\nxml_woarchive_impl<Archive>::save(const wchar_t * ws){\n    typedef iterators::xml_escape<const wchar_t *> xmbtows;\n    std::copy(\n        xmbtows(ws),\n        xmbtows(ws + std::wcslen(ws)),\n        boost::archive::iterators::ostream_iterator<wchar_t>(os)\n    );\n}\n#endif\n\ntemplate<class Archive>\nBOOST_WARCHIVE_DECL\nxml_woarchive_impl<Archive>::xml_woarchive_impl(\n    std::wostream & os_,\n    unsigned int flags\n) :\n    basic_text_oprimitive<std::wostream>(\n        os_,\n        true // don't change the codecvt - use the one below\n    ),\n    basic_xml_oarchive<Archive>(flags)\n{\n    if(0 == (flags & no_codecvt)){\n        archive_locale = std::locale(\n            os_.getloc(),\n            new boost::archive::detail::utf8_codecvt_facet\n        );\n        os_.flush();\n        os_.imbue(archive_locale);\n    }\n}\n\ntemplate<class Archive>\nBOOST_WARCHIVE_DECL\nxml_woarchive_impl<Archive>::~xml_woarchive_impl(){\n    if(boost::core::uncaught_exceptions() > 0)\n        return;\n    if(0 == (this->get_flags() & no_header)){\n        os << L\"</boost_serialization>\";\n    }\n}\n\ntemplate<class Archive>\nBOOST_WARCHIVE_DECL void\nxml_woarchive_impl<Archive>::save_binary(\n    const void *address,\n    std::size_t count\n){\n    this->end_preamble();\n    #if ! defined(__MWERKS__)\n    this->basic_text_oprimitive<std::wostream>::save_binary(\n    #else\n    this->basic_text_oprimitive::save_binary(\n    #endif\n        address, \n        count\n    );\n    this->indent_next = true;\n}\n\n} // namespace archive\n} // namespace boost\n\n#endif //BOOST_NO_STD_WSTREAMBUF\n"
  },
  {
    "path": "include/boost/archive/iterators/base64_exception.hpp",
    "content": "#ifndef BOOST_ARCHIVE_ITERATORS_BASE64_EXCEPTION_HPP\n#define BOOST_ARCHIVE_ITERATORS_BASE64_EXCEPTION_HPP\n\n// MS compatible compilers support #pragma once\n#if defined(_MSC_VER)\n# pragma once\n#endif\n\n/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// base64_exception.hpp:\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for updates, documentation, and revision history.\n\n#include <boost/config.hpp>\n#ifndef BOOST_NO_EXCEPTIONS\n#include <exception>\n\n#include <boost/assert.hpp>\n\nnamespace boost {\nnamespace archive {\nnamespace iterators {\n\n//////////////////////////////////////////////////////////////////////\n// exceptions thrown by base64s\n//\nclass base64_exception : public std::exception\n{\npublic:\n    typedef enum {\n        invalid_code,       // attempt to encode a value > 6 bits\n        invalid_character,  // decode a value not in base64 char set\n        other_exception\n    } exception_code;\n    exception_code code;\n\n    base64_exception(exception_code c = other_exception) : code(c)\n    {}\n\n    virtual const char *what( ) const BOOST_NOEXCEPT_OR_NOTHROW\n    {\n        const char *msg = \"unknown exception code\";\n        switch(code){\n        case invalid_code:\n            msg = \"attempt to encode a value > 6 bits\";\n            break;\n        case invalid_character:\n            msg = \"attempt to decode a value not in base64 char set\";\n            break;\n        default:\n            BOOST_ASSERT(false);\n            break;\n        }\n        return msg;\n    }\n};\n\n} // namespace iterators\n} // namespace archive\n} // namespace boost\n\n#endif //BOOST_NO_EXCEPTIONS\n#endif //BOOST_ARCHIVE_ITERATORS_ARCHIVE_EXCEPTION_HPP\n"
  },
  {
    "path": "include/boost/archive/iterators/base64_from_binary.hpp",
    "content": "#ifndef BOOST_ARCHIVE_ITERATORS_BASE64_FROM_BINARY_HPP\n#define BOOST_ARCHIVE_ITERATORS_BASE64_FROM_BINARY_HPP\n\n// MS compatible compilers support #pragma once\n#if defined(_MSC_VER)\n# pragma once\n#endif\n\n/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// base64_from_binary.hpp\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for updates, documentation, and revision history.\n\n#include <boost/assert.hpp>\n\n#include <cstddef> // size_t\n#if defined(BOOST_NO_STDC_NAMESPACE)\nnamespace std{\n    using ::size_t;\n} // namespace std\n#endif\n\n#include <boost/iterator/transform_iterator.hpp>\n#include <boost/archive/iterators/dataflow_exception.hpp>\n\nnamespace boost {\nnamespace archive {\nnamespace iterators {\n\n/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// convert binary integers to base64 characters\n\nnamespace detail {\n\ntemplate<class CharType>\nstruct from_6_bit {\n    typedef CharType result_type;\n    CharType operator()(CharType t) const{\n        static const char * lookup_table =\n            \"ABCDEFGHIJKLMNOPQRSTUVWXYZ\"\n            \"abcdefghijklmnopqrstuvwxyz\"\n            \"0123456789\"\n            \"+/\";\n        BOOST_ASSERT(t < 64);\n        return lookup_table[static_cast<size_t>(t)];\n    }\n};\n\n} // namespace detail\n\n// note: what we would like to do is\n// template<class Base, class CharType = typename Base::value_type>\n//  typedef transform_iterator<\n//      from_6_bit<CharType>,\n//      transform_width<Base, 6, sizeof(Base::value_type) * 8, CharType>\n//  > base64_from_binary;\n// but C++ won't accept this.  Rather than using a \"type generator\" and\n// using a different syntax, make a derivation which should be equivalent.\n//\n// Another issue addressed here is that the transform_iterator doesn't have\n// a templated constructor.  This makes it incompatible with the dataflow\n// ideal.  This is also addressed here.\n\n//template<class Base, class CharType = typename Base::value_type>\ntemplate<\n    class Base,\n    class CharType = typename boost::iterator_value<Base>::type\n>\nclass base64_from_binary :\n    public transform_iterator<\n        detail::from_6_bit<CharType>,\n        Base\n    >\n{\n    friend class boost::iterator_core_access;\n    typedef transform_iterator<\n        typename detail::from_6_bit<CharType>,\n        Base\n    > super_t;\n\npublic:\n    // make composable by using templated constructor\n    template<class T>\n    base64_from_binary(T start) :\n        super_t(\n            Base(static_cast< T >(start)),\n            detail::from_6_bit<CharType>()\n        )\n    {}\n    // intel 7.1 doesn't like default copy constructor\n    base64_from_binary(const base64_from_binary & rhs) :\n        super_t(\n            Base(rhs.base_reference()),\n            detail::from_6_bit<CharType>()\n        )\n    {}\n//    base64_from_binary(){};\n};\n\n} // namespace iterators\n} // namespace archive\n} // namespace boost\n\n#endif // BOOST_ARCHIVE_ITERATORS_BASE64_FROM_BINARY_HPP\n"
  },
  {
    "path": "include/boost/archive/iterators/binary_from_base64.hpp",
    "content": "#ifndef BOOST_ARCHIVE_ITERATORS_BINARY_FROM_BASE64_HPP\n#define BOOST_ARCHIVE_ITERATORS_BINARY_FROM_BASE64_HPP\n\n// MS compatible compilers support #pragma once\n#if defined(_MSC_VER)\n# pragma once\n#endif\n\n/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// binary_from_base64.hpp\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for updates, documentation, and revision history.\n\n#include <boost/assert.hpp>\n\n#include <boost/serialization/throw_exception.hpp>\n#include <boost/static_assert.hpp>\n\n#include <boost/iterator/transform_iterator.hpp>\n#include <boost/archive/iterators/dataflow_exception.hpp>\n\nnamespace boost {\nnamespace archive {\nnamespace iterators {\n\n/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// convert base64 characters to binary data\n\nnamespace detail {\n\ntemplate<class CharType>\nstruct to_6_bit {\n    typedef CharType result_type;\n    CharType operator()(CharType t) const{\n        static const signed char lookup_table[] = {\n            -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,\n            -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,\n            -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,62,-1,-1,-1,63,\n            52,53,54,55,56,57,58,59,60,61,-1,-1,-1, 0,-1,-1, // render '=' as 0\n            -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,10,11,12,13,14,\n            15,16,17,18,19,20,21,22,23,24,25,-1,-1,-1,-1,-1,\n            -1,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,\n            41,42,43,44,45,46,47,48,49,50,51,-1,-1,-1,-1,-1\n        };\n        // metrowerks trips this assertion - how come?\n        #if ! defined(__MWERKS__)\n        BOOST_STATIC_ASSERT(128 == sizeof(lookup_table));\n        #endif\n        signed char value = -1;\n        if((unsigned)t <= 127)\n            value = lookup_table[(unsigned)t];\n        if(-1 == value)\n            boost::serialization::throw_exception(\n                dataflow_exception(dataflow_exception::invalid_base64_character)\n            );\n        return value;\n    }\n};\n\n} // namespace detail\n\n// note: what we would like to do is\n// template<class Base, class CharType = typename Base::value_type>\n//  typedef transform_iterator<\n//      from_6_bit<CharType>,\n//      transform_width<Base, 6, sizeof(Base::value_type) * 8, CharType>\n//  > base64_from_binary;\n// but C++ won't accept this.  Rather than using a \"type generator\" and\n// using a different syntax, make a derivation which should be equivalent.\n//\n// Another issue addressed here is that the transform_iterator doesn't have\n// a templated constructor.  This makes it incompatible with the dataflow\n// ideal.  This is also addressed here.\n\ntemplate<\n    class Base,\n    class CharType = typename boost::iterator_value<Base>::type\n>\nclass binary_from_base64 : public\n    transform_iterator<\n        detail::to_6_bit<CharType>,\n        Base\n    >\n{\n    friend class boost::iterator_core_access;\n    typedef transform_iterator<\n        detail::to_6_bit<CharType>,\n        Base\n    > super_t;\npublic:\n    // make composable by using templated constructor\n    template<class T>\n    binary_from_base64(T  start) :\n        super_t(\n            Base(static_cast< T >(start)),\n            detail::to_6_bit<CharType>()\n        )\n    {}\n    // intel 7.1 doesn't like default copy constructor\n    binary_from_base64(const binary_from_base64 & rhs) :\n        super_t(\n            Base(rhs.base_reference()),\n            detail::to_6_bit<CharType>()\n        )\n    {}\n//    binary_from_base64(){};\n};\n\n} // namespace iterators\n} // namespace archive\n} // namespace boost\n\n#endif // BOOST_ARCHIVE_ITERATORS_BINARY_FROM_BASE64_HPP\n"
  },
  {
    "path": "include/boost/archive/iterators/dataflow.hpp",
    "content": "#ifndef BOOST_ARCHIVE_ITERATORS_DATAFLOW_HPP\n#define BOOST_ARCHIVE_ITERATORS_DATAFLOW_HPP\n\n// MS compatible compilers support #pragma once\n#if defined(_MSC_VER)\n# pragma once\n#endif\n\n/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// dataflow.hpp\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for updates, documentation, and revision history.\n\n#include <boost/assert.hpp>\n\n#include <boost/mpl/eval_if.hpp>\n#include <boost/mpl/if.hpp>\n#include <boost/mpl/apply.hpp>\n#include <boost/mpl/plus.hpp>\n#include <boost/mpl/int.hpp>\n\n#include <boost/type_traits/is_convertible.hpp>\n#include <boost/type_traits/is_base_and_derived.hpp>\n#include <boost/type_traits/is_pointer.hpp>\n#include <boost/iterator/iterator_adaptor.hpp>\n#include <boost/iterator/iterator_traits.hpp>\n#include <boost/static_assert.hpp>\n\nnamespace boost {\nnamespace archive {\nnamespace iterators {\n\n// poor man's tri-state\nstruct tri_state {\n    enum state_enum {\n        is_false = false,\n        is_true = true,\n        is_indeterminant\n    } m_state;\n    // convert to bool\n    operator bool (){\n        BOOST_ASSERT(is_indeterminant != m_state);\n        return is_true == m_state ? true : false;\n    }\n    // assign from bool\n    tri_state & operator=(bool rhs) {\n        m_state = rhs ? is_true : is_false;\n        return *this;\n    }\n    tri_state(bool rhs) :\n        m_state(rhs ? is_true : is_false)\n    {}\n    tri_state(state_enum state) :\n        m_state(state)\n    {}\n    bool operator==(const tri_state & rhs) const {\n        return m_state == rhs.m_state;\n    }\n    bool operator!=(const tri_state & rhs) const {\n        return m_state != rhs.m_state;\n    }\n};\n\n/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// implement functions common to dataflow iterators\ntemplate<class Derived>\nclass dataflow {\n    bool m_eoi;\nprotected:\n    // test for iterator equality\n    tri_state equal(const Derived & rhs) const {\n        if(m_eoi && rhs.m_eoi)\n            return true;\n        if(m_eoi || rhs.m_eoi)\n            return false;\n        return tri_state(tri_state::is_indeterminant);\n    }\n    void eoi(bool tf){\n        m_eoi = tf;\n    }\n    bool eoi() const {\n        return m_eoi;\n    }\npublic:\n    dataflow(bool tf) :\n        m_eoi(tf)\n    {}\n    dataflow() : // used for iterator end\n        m_eoi(true)\n    {}\n};\n\n} // namespace iterators\n} // namespace archive\n} // namespace boost\n\n#endif // BOOST_ARCHIVE_ITERATORS_DATAFLOW_HPP\n"
  },
  {
    "path": "include/boost/archive/iterators/dataflow_exception.hpp",
    "content": "#ifndef BOOST_ARCHIVE_ITERATORS_DATAFLOW_EXCEPTION_HPP\n#define BOOST_ARCHIVE_ITERATORS_DATAFLOW_EXCEPTION_HPP\n\n// MS compatible compilers support #pragma once\n#if defined(_MSC_VER)\n# pragma once\n#endif\n\n/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// dataflow_exception.hpp:\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for updates, documentation, and revision history.\n\n#include <boost/config.hpp>\n#ifndef BOOST_NO_EXCEPTIONS\n#include <exception>\n#endif //BOOST_NO_EXCEPTIONS\n\n#include <boost/assert.hpp>\n\nnamespace boost {\nnamespace archive {\nnamespace iterators {\n\n//////////////////////////////////////////////////////////////////////\n// exceptions thrown by dataflows\n//\nclass dataflow_exception : public std::exception\n{\npublic:\n    typedef enum {\n        invalid_6_bitcode,\n        invalid_base64_character,\n        invalid_xml_escape_sequence,\n        comparison_not_permitted,\n        invalid_conversion,\n        other_exception\n    } exception_code;\n    exception_code code;\n\n    dataflow_exception(exception_code c = other_exception) : code(c)\n    {}\n\n    const char *what( ) const BOOST_NOEXCEPT_OR_NOTHROW BOOST_OVERRIDE\n    {\n        const char *msg = \"unknown exception code\";\n        switch(code){\n        case invalid_6_bitcode:\n            msg = \"attempt to encode a value > 6 bits\";\n            break;\n        case invalid_base64_character:\n            msg = \"attempt to decode a value not in base64 char set\";\n            break;\n        case invalid_xml_escape_sequence:\n            msg = \"invalid xml escape_sequence\";\n            break;\n        case comparison_not_permitted:\n            msg = \"cannot invoke iterator comparison now\";\n            break;\n        case invalid_conversion:\n            msg = \"invalid multbyte/wide char conversion\";\n            break;\n        default:\n            BOOST_ASSERT(false);\n            break;\n        }\n        return msg;\n    }\n};\n\n} // namespace iterators\n} // namespace archive\n} // namespace boost\n\n#endif //BOOST_ARCHIVE_ITERATORS_DATAFLOW_EXCEPTION_HPP\n"
  },
  {
    "path": "include/boost/archive/iterators/escape.hpp",
    "content": "#ifndef BOOST_ARCHIVE_ITERATORS_ESCAPE_HPP\n#define BOOST_ARCHIVE_ITERATORS_ESCAPE_HPP\n\n// MS compatible compilers support #pragma once\n#if defined(_MSC_VER)\n# pragma once\n#endif\n\n/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// escape.hpp\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for updates, documentation, and revision history.\n\n#include <boost/assert.hpp>\n#include <cstddef> // NULL\n\n#include <boost/iterator/iterator_adaptor.hpp>\n#include <boost/iterator/iterator_traits.hpp>\n\nnamespace boost {\nnamespace archive {\nnamespace iterators {\n\n/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// insert escapes into text\n\ntemplate<class Derived, class Base>\nclass escape :\n    public boost::iterator_adaptor<\n        Derived,\n        Base,\n        typename boost::iterator_value<Base>::type,\n        single_pass_traversal_tag,\n        typename boost::iterator_value<Base>::type\n    >\n{\n    typedef typename boost::iterator_value<Base>::type base_value_type;\n    typedef typename boost::iterator_reference<Base>::type reference_type;\n    friend class boost::iterator_core_access;\n\n    typedef typename boost::iterator_adaptor<\n        Derived,\n        Base,\n        base_value_type,\n        single_pass_traversal_tag,\n        base_value_type\n    > super_t;\n\n    typedef escape<Derived, Base> this_t;\n\n    void dereference_impl() {\n        m_current_value = static_cast<Derived *>(this)->fill(m_bnext, m_bend);\n        m_full = true;\n    }\n\n    //Access the value referred to\n    reference_type dereference() const {\n        if(!m_full)\n            const_cast<this_t *>(this)->dereference_impl();\n        return m_current_value;\n    }\n\n    bool equal(const this_t & rhs) const {\n        if(m_full){\n            if(! rhs.m_full)\n                const_cast<this_t *>(& rhs)->dereference_impl();\n        }\n        else{\n            if(rhs.m_full)\n                const_cast<this_t *>(this)->dereference_impl();\n        }\n        if(m_bnext != rhs.m_bnext)\n            return false;\n        if(this->base_reference() != rhs.base_reference())\n            return false;\n        return true;\n    }\n\n   void increment(){\n        if(m_bnext != m_bend && ++m_bnext < m_bend){\n            m_current_value = *m_bnext;\n            return;\n        }\n        ++(this->base_reference());\n        m_bnext = NULL;\n        m_bend = NULL;\n        m_full = false;\n    }\n\n    // buffer to handle pending characters\n    const base_value_type *m_bnext;\n    const base_value_type *m_bend;\n    bool m_full;\n    base_value_type m_current_value;\npublic:\n    escape(Base base) :\n        super_t(base),\n        m_bnext(NULL),\n        m_bend(NULL),\n        m_full(false),\n        m_current_value(0)\n    {\n    }\n};\n\n} // namespace iterators\n} // namespace archive\n} // namespace boost\n\n#endif // BOOST_ARCHIVE_ITERATORS_ESCAPE_HPP\n"
  },
  {
    "path": "include/boost/archive/iterators/insert_linebreaks.hpp",
    "content": "#ifndef BOOST_ARCHIVE_ITERATORS_INSERT_LINEBREAKS_HPP\n#define BOOST_ARCHIVE_ITERATORS_INSERT_LINEBREAKS_HPP\n\n// MS compatible compilers support #pragma once\n#if defined(_MSC_VER)\n# pragma once\n#endif\n\n/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// insert_linebreaks.hpp\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for updates, documentation, and revision history.\n\n#include <boost/assert.hpp>\n\n#include <boost/config.hpp>\n#if defined(BOOST_NO_STDC_NAMESPACE)\nnamespace std{ using ::memcpy; }\n#endif\n\n#include <boost/iterator/iterator_adaptor.hpp>\n#include <boost/iterator/iterator_traits.hpp>\n\nnamespace boost {\nnamespace archive {\nnamespace iterators {\n\n/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// insert line break every N characters\ntemplate<\n    class Base,\n    int N,\n    class CharType = typename boost::iterator_value<Base>::type\n>\nclass insert_linebreaks :\n    public iterator_adaptor<\n        insert_linebreaks<Base, N, CharType>,\n        Base,\n        CharType,\n        single_pass_traversal_tag,\n        CharType\n    >\n{\nprivate:\n    friend class boost::iterator_core_access;\n    typedef iterator_adaptor<\n        insert_linebreaks<Base, N, CharType>,\n        Base,\n        CharType,\n        single_pass_traversal_tag,\n        CharType\n    > super_t;\n\n    bool equal(const insert_linebreaks<Base, N, CharType> & rhs) const {\n        return\n//            m_count == rhs.m_count\n//            && base_reference() == rhs.base_reference()\n            this->base_reference() == rhs.base_reference()\n        ;\n    }\n\n    void increment() {\n        if(m_count == N){\n            m_count = 0;\n            return;\n        }\n        ++m_count;\n        ++(this->base_reference());\n    }\n    CharType dereference() const {\n        if(m_count == N)\n            return '\\n';\n        return * (this->base_reference());\n    }\n    unsigned int m_count;\npublic:\n    // make composable by using templated constructor\n    template<class T>\n    insert_linebreaks(T  start) :\n        super_t(Base(static_cast< T >(start))),\n        m_count(0)\n    {}\n    // intel 7.1 doesn't like default copy constructor\n    insert_linebreaks(const insert_linebreaks & rhs) :\n        super_t(rhs.base_reference()),\n        m_count(rhs.m_count)\n    {}\n};\n\n} // namespace iterators\n} // namespace archive\n} // namespace boost\n\n#endif // BOOST_ARCHIVE_ITERATORS_INSERT_LINEBREAKS_HPP\n"
  },
  {
    "path": "include/boost/archive/iterators/istream_iterator.hpp",
    "content": "#ifndef BOOST_ARCHIVE_ITERATORS_ISTREAM_ITERATOR_HPP\n#define BOOST_ARCHIVE_ITERATORS_ISTREAM_ITERATOR_HPP\n\n// MS compatible compilers support #pragma once\n#if defined(_MSC_VER)\n# pragma once\n#endif\n\n/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// istream_iterator.hpp\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for updates, documentation, and revision history.\n\n// note: this is a custom version of the standard istream_iterator.\n// This is necessary as the standard version doesn't work as expected\n// for wchar_t based streams on systems for which wchar_t not a true\n// type but rather a synonym for some integer type.\n\n#include <cstddef> // NULL\n#include <istream>\n#include <boost/iterator/iterator_facade.hpp>\n\nnamespace boost {\nnamespace archive {\nnamespace iterators {\n\n// given a type, make an input iterator based on a pointer to that type\ntemplate<class Elem = char>\nclass istream_iterator :\n    public boost::iterator_facade<\n        istream_iterator<Elem>,\n        Elem,\n        std::input_iterator_tag,\n        Elem\n    >\n{\n    friend class boost::iterator_core_access;\n    typedef istream_iterator this_t ;\n    typedef typename boost::iterator_facade<\n        istream_iterator<Elem>,\n        Elem,\n        std::input_iterator_tag,\n        Elem\n    > super_t;\n    typedef typename std::basic_istream<Elem> istream_type;\n\n    bool equal(const this_t & rhs) const {\n        // note: only  works for comparison against end of stream\n        return m_istream == rhs.m_istream;\n    }\n\n    //Access the value referred to\n    Elem dereference() const {\n        return static_cast<Elem>(m_istream->peek());\n    }\n\n    void increment(){\n        if(NULL != m_istream){\n            m_istream->ignore(1);\n        }\n    }\n\n    istream_type *m_istream;\n    Elem m_current_value;\npublic:\n    istream_iterator(istream_type & is) :\n        m_istream(& is)\n    {\n        //increment();\n    }\n\n    istream_iterator() :\n        m_istream(NULL),\n        m_current_value(NULL)\n    {}\n\n    istream_iterator(const istream_iterator<Elem> & rhs) :\n        m_istream(rhs.m_istream),\n        m_current_value(rhs.m_current_value)\n    {}\n};\n\n} // namespace iterators\n} // namespace archive\n} // namespace boost\n\n#endif // BOOST_ARCHIVE_ITERATORS_ISTREAM_ITERATOR_HPP\n"
  },
  {
    "path": "include/boost/archive/iterators/mb_from_wchar.hpp",
    "content": "#ifndef BOOST_ARCHIVE_ITERATORS_MB_FROM_WCHAR_HPP\n#define BOOST_ARCHIVE_ITERATORS_MB_FROM_WCHAR_HPP\n\n// MS compatible compilers support #pragma once\n#if defined(_MSC_VER)\n# pragma once\n#endif\n\n/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// mb_from_wchar.hpp\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for updates, documentation, and revision history.\n\n#include <boost/assert.hpp>\n#include <cstddef> // size_t\n#include <cstring> // memcpy\n#ifndef BOOST_NO_CWCHAR\n#include <cwchar> //  mbstate_t\n#endif\n#include <boost/config.hpp>\n#if defined(BOOST_NO_STDC_NAMESPACE)\nnamespace std{\n    using ::mbstate_t;\n    using ::memcpy;\n} // namespace std\n#endif\n\n#include <boost/archive/detail/utf8_codecvt_facet.hpp>\n#include <boost/iterator/iterator_adaptor.hpp>\n\nnamespace boost {\nnamespace archive {\nnamespace iterators {\n\n/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// class used by text archives to translate wide strings and to char\n// strings of the currently selected locale\ntemplate<class Base>    // the input iterator\nclass mb_from_wchar\n    : public boost::iterator_adaptor<\n        mb_from_wchar<Base>,\n        Base,\n        wchar_t,\n        single_pass_traversal_tag,\n        char\n    >\n{\n    friend class boost::iterator_core_access;\n\n    typedef typename boost::iterator_adaptor<\n        mb_from_wchar<Base>,\n        Base,\n        wchar_t,\n        single_pass_traversal_tag,\n        char\n    > super_t;\n\n    typedef mb_from_wchar<Base> this_t;\n\n    char dereference_impl() {\n        if(! m_full){\n            fill();\n            m_full = true;\n        }\n        return m_buffer[m_bnext];\n    }\n\n    char dereference() const {\n        return (const_cast<this_t *>(this))->dereference_impl();\n    }\n    // test for iterator equality\n    bool equal(const mb_from_wchar<Base> & rhs) const {\n        // once the value is filled, the base_reference has been incremented\n        // so don't permit comparison anymore.\n        return\n            0 == m_bend\n            && 0 == m_bnext\n            && this->base_reference() == rhs.base_reference()\n        ;\n    }\n\n    void fill(){\n        wchar_t value = * this->base_reference();\n        const wchar_t *wend;\n        char *bend;\n        BOOST_VERIFY(\n            m_codecvt_facet.out(\n                m_mbs,\n                & value, & value + 1, wend,\n                m_buffer, m_buffer + sizeof(m_buffer), bend\n            )\n            ==\n            std::codecvt_base::ok\n        );\n        m_bnext = 0;\n        m_bend = bend - m_buffer;\n    }\n\n    void increment(){\n        if(++m_bnext < m_bend)\n            return;\n        m_bend =\n        m_bnext = 0;\n        ++(this->base_reference());\n        m_full = false;\n    }\n\n    boost::archive::detail::utf8_codecvt_facet m_codecvt_facet;\n    std::mbstate_t m_mbs;\n    // buffer to handle pending characters\n    char m_buffer[9 /* MB_CUR_MAX */];\n    std::size_t m_bend;\n    std::size_t m_bnext;\n    bool m_full;\n\npublic:\n    // make composable by using templated constructor\n    template<class T>\n    mb_from_wchar(T start) :\n        super_t(Base(static_cast< T >(start))),\n        m_mbs(std::mbstate_t()),\n        m_bend(0),\n        m_bnext(0),\n        m_full(false)\n    {}\n    // intel 7.1 doesn't like default copy constructor\n    mb_from_wchar(const mb_from_wchar & rhs) :\n        super_t(rhs.base_reference()),\n        m_mbs(rhs.m_mbs),\n        m_bend(rhs.m_bend),\n        m_bnext(rhs.m_bnext),\n        m_full(rhs.m_full)\n    {\n        std::memcpy(m_buffer, rhs.m_buffer, sizeof(m_buffer));\n    }\n};\n\n} // namespace iterators\n} // namespace archive\n} // namespace boost\n\n#endif // BOOST_ARCHIVE_ITERATORS_MB_FROM_WCHAR_HPP\n"
  },
  {
    "path": "include/boost/archive/iterators/ostream_iterator.hpp",
    "content": "#ifndef BOOST_ARCHIVE_ITERATORS_OSTREAM_ITERATOR_HPP\n#define BOOST_ARCHIVE_ITERATORS_OSTREAM_ITERATOR_HPP\n\n// MS compatible compilers support #pragma once\n#if defined(_MSC_VER)\n# pragma once\n#endif\n\n/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// ostream_iterator.hpp\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for updates, documentation, and revision history.\n\n// note: this is a custom version of the standard ostream_iterator.\n// This is necessary as the standard version doesn't work as expected\n// for wchar_t based streams on systems for which wchar_t not a true\n// type but rather a synonym for some integer type.\n\n#include <ostream>\n#include <boost/iterator/iterator_facade.hpp>\n\nnamespace boost {\nnamespace archive {\nnamespace iterators {\n\n// given a type, make an input iterator based on a pointer to that type\ntemplate<class Elem>\nclass ostream_iterator :\n    public boost::iterator_facade<\n        ostream_iterator<Elem>,\n        Elem,\n        std::output_iterator_tag,\n        ostream_iterator<Elem> &\n    >\n{\n    friend class boost::iterator_core_access;\n    typedef ostream_iterator this_t ;\n    typedef Elem char_type;\n    typedef std::basic_ostream<char_type> ostream_type;\n\n    //emulate the behavior of std::ostream\n    ostream_iterator & dereference() const {\n        return const_cast<ostream_iterator &>(*this);\n    }\n    bool equal(const this_t & rhs) const {\n        return m_ostream == rhs.m_ostream;\n    }\n    void increment(){}\nprotected:\n    ostream_type *m_ostream;\n    void put_val(char_type e){\n        if(NULL != m_ostream){\n            m_ostream->put(e);\n            if(! m_ostream->good())\n                m_ostream = NULL;\n        }\n    }\npublic:\n    this_t & operator=(char_type c){\n        put_val(c);\n        return *this;\n    }\n    ostream_iterator(ostream_type & os) :\n        m_ostream (& os)\n    {}\n    ostream_iterator() :\n        m_ostream (NULL)\n    {}\n    ostream_iterator(const ostream_iterator & rhs) :\n        m_ostream (rhs.m_ostream)\n    {}\n};\n\n} // namespace iterators\n} // namespace archive\n} // namespace boost\n\n#endif // BOOST_ARCHIVE_ITERATORS_OSTREAM_ITERATOR_HPP\n"
  },
  {
    "path": "include/boost/archive/iterators/remove_whitespace.hpp",
    "content": "#ifndef BOOST_ARCHIVE_ITERATORS_REMOVE_WHITESPACE_HPP\n#define BOOST_ARCHIVE_ITERATORS_REMOVE_WHITESPACE_HPP\n\n// MS compatible compilers support #pragma once\n#if defined(_MSC_VER)\n# pragma once\n#endif\n\n/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// remove_whitespace.hpp\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for updates, documentation, and revision history.\n\n#include <boost/assert.hpp>\n\n#include <boost/iterator/iterator_adaptor.hpp>\n#include <boost/iterator/filter_iterator.hpp>\n#include <boost/iterator/iterator_traits.hpp>\n\n// here is the default standard implementation of the functor used\n// by the filter iterator to remove spaces.  Unfortunately usage\n// of this implementation in combination with spirit trips a bug\n// VC 6.5.  The only way I can find to work around it is to\n// implement a special non-standard version for this platform\n\n#ifndef BOOST_NO_CWCTYPE\n#include <cwctype> // iswspace\n#if defined(BOOST_NO_STDC_NAMESPACE)\nnamespace std{ using ::iswspace; }\n#endif\n#endif\n\n#include <cctype> // isspace\n#if defined(BOOST_NO_STDC_NAMESPACE)\nnamespace std{ using ::isspace; }\n#endif\n\n#if defined(__STD_RWCOMPILER_H__) || defined(_RWSTD_VER)\n// this is required for the RW STL on Linux and Tru64.\n#undef isspace\n#undef iswspace\n#endif\n\nnamespace { // anonymous\n\ntemplate<class CharType>\nstruct remove_whitespace_predicate;\n\ntemplate<>\nstruct remove_whitespace_predicate<char>\n{\n    bool operator()(unsigned char t){\n        return ! std::isspace(t);\n    }\n};\n\n#ifndef BOOST_NO_CWCHAR\ntemplate<>\nstruct remove_whitespace_predicate<wchar_t>\n{\n    bool operator()(wchar_t t){\n        return ! std::iswspace(t);\n    }\n};\n#endif\n\n} // namespace anonymous\n\n/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// convert base64 file data (including whitespace and padding) to binary\n\nnamespace boost {\nnamespace archive {\nnamespace iterators {\n\n// custom version of filter iterator which doesn't look ahead further than\n// necessary\n\ntemplate<class Predicate, class Base>\nclass filter_iterator\n    : public boost::iterator_adaptor<\n        filter_iterator<Predicate, Base>,\n        Base,\n        use_default,\n        single_pass_traversal_tag\n    >\n{\n    friend class boost::iterator_core_access;\n    typedef typename boost::iterator_adaptor<\n        filter_iterator<Predicate, Base>,\n        Base,\n        use_default,\n        single_pass_traversal_tag\n    > super_t;\n    typedef filter_iterator<Predicate, Base> this_t;\n    typedef typename super_t::reference reference_type;\n\n    reference_type dereference_impl(){\n        if(! m_full){\n            while(! m_predicate(* this->base_reference()))\n                ++(this->base_reference());\n            m_full = true;\n        }\n        return * this->base_reference();\n    }\n\n    reference_type dereference() const {\n        return const_cast<this_t *>(this)->dereference_impl();\n    }\n\n    Predicate m_predicate;\n    bool m_full;\npublic:\n    // note: this function is public only because comeau compiler complained\n    // I don't know if this is because the compiler is wrong or what\n    void increment(){\n        m_full = false;\n        ++(this->base_reference());\n    }\n    filter_iterator(Base start) :\n        super_t(start),\n        m_full(false)\n    {}\n    filter_iterator(){}\n};\n\ntemplate<class Base>\nclass remove_whitespace :\n    public filter_iterator<\n        remove_whitespace_predicate<\n            typename boost::iterator_value<Base>::type\n            //typename Base::value_type\n        >,\n        Base\n    >\n{\n    friend class boost::iterator_core_access;\n    typedef filter_iterator<\n        remove_whitespace_predicate<\n            typename boost::iterator_value<Base>::type\n            //typename Base::value_type\n        >,\n        Base\n    > super_t;\npublic:\n//    remove_whitespace(){} // why is this needed?\n    // make composable by using templated constructor\n    template<class T>\n    remove_whitespace(T start) :\n        super_t(Base(static_cast< T >(start)))\n    {}\n    // intel 7.1 doesn't like default copy constructor\n    remove_whitespace(const remove_whitespace & rhs) :\n        super_t(rhs.base_reference())\n    {}\n};\n\n} // namespace iterators\n} // namespace archive\n} // namespace boost\n\n#endif // BOOST_ARCHIVE_ITERATORS_REMOVE_WHITESPACE_HPP\n"
  },
  {
    "path": "include/boost/archive/iterators/transform_width.hpp",
    "content": "#ifndef BOOST_ARCHIVE_ITERATORS_TRANSFORM_WIDTH_HPP\n#define BOOST_ARCHIVE_ITERATORS_TRANSFORM_WIDTH_HPP\n\n// MS compatible compilers support #pragma once\n#if defined(_MSC_VER)\n# pragma once\n#endif\n\n/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// transform_width.hpp\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for updates, documentation, and revision history.\n\n// iterator which takes elements of x bits and returns elements of y bits.\n// used to change streams of 8 bit characters into streams of 6 bit characters.\n// and vice-versa for implementing base64 encodeing/decoding. Be very careful\n// when using and end iterator.  end is only reliable detected when the input\n// stream length is some common multiple of x and y.  E.G. Base64 6 bit\n// character and 8 bit bytes. Lowest common multiple is 24 => 4 6 bit characters\n// or 3 8 bit characters\n\n#include <boost/iterator/iterator_adaptor.hpp>\n#include <boost/iterator/iterator_traits.hpp>\n\n#include <algorithm> // std::min\n\nnamespace boost {\nnamespace archive {\nnamespace iterators {\n\n/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// class used by text archives to translate char strings to wchar_t\n// strings of the currently selected locale\ntemplate<\n    class Base,\n    int BitsOut,\n    int BitsIn,\n    class CharType = typename boost::iterator_value<Base>::type // output character\n>\nclass transform_width :\n    public boost::iterator_adaptor<\n        transform_width<Base, BitsOut, BitsIn, CharType>,\n        Base,\n        CharType,\n        single_pass_traversal_tag,\n        CharType\n    >\n{\n    friend class boost::iterator_core_access;\n    typedef typename boost::iterator_adaptor<\n        transform_width<Base, BitsOut, BitsIn, CharType>,\n        Base,\n        CharType,\n        single_pass_traversal_tag,\n        CharType\n    > super_t;\n\n    typedef transform_width<Base, BitsOut, BitsIn, CharType> this_t;\n    typedef typename iterator_value<Base>::type base_value_type;\n\n    void fill();\n\n    CharType dereference() const {\n        if(!m_buffer_out_full)\n            const_cast<this_t *>(this)->fill();\n        return m_buffer_out;\n    }\n\n    bool equal_impl(const this_t & rhs){\n        if(BitsIn < BitsOut) // discard any left over bits\n            return this->base_reference() == rhs.base_reference();\n        else{\n            // BitsIn > BitsOut  // zero fill\n            if(this->base_reference() == rhs.base_reference()){\n                m_end_of_sequence = true;\n                return 0 == m_remaining_bits;\n            }\n            return false;\n        }\n    }\n\n    // standard iterator interface\n    bool equal(const this_t & rhs) const {\n        return const_cast<this_t *>(this)->equal_impl(rhs);\n    }\n\n    void increment(){\n        m_buffer_out_full = false;\n    }\n\n    bool m_buffer_out_full;\n    CharType m_buffer_out;\n\n    // last read element from input\n    base_value_type m_buffer_in;\n\n    // number of bits to left in the input buffer.\n    unsigned int m_remaining_bits;\n\n    // flag to indicate we've reached end of data.\n    bool m_end_of_sequence;\n\npublic:\n    // make composable by using templated constructor\n    template<class T>\n    transform_width(T start) :\n        super_t(Base(static_cast< T >(start))),\n        m_buffer_out_full(false),\n        m_buffer_out(0),\n        // To disable GCC warning, but not truly necessary\n\t    //(m_buffer_in will be initialized later before being\n\t    //used because m_remaining_bits == 0)\n        m_buffer_in(0),\n        m_remaining_bits(0),\n        m_end_of_sequence(false)\n    {}\n    // intel 7.1 doesn't like default copy constructor\n    transform_width(const transform_width & rhs) :\n        super_t(rhs.base_reference()),\n        m_buffer_out_full(rhs.m_buffer_out_full),\n        m_buffer_out(rhs.m_buffer_out),\n        m_buffer_in(rhs.m_buffer_in),\n        m_remaining_bits(rhs.m_remaining_bits),\n        m_end_of_sequence(false)\n    {}\n};\n\ntemplate<\n    class Base,\n    int BitsOut,\n    int BitsIn,\n    class CharType\n>\nvoid transform_width<Base, BitsOut, BitsIn, CharType>::fill() {\n    unsigned int missing_bits = BitsOut;\n    m_buffer_out = 0;\n    do{\n        if(0 == m_remaining_bits){\n            if(m_end_of_sequence){\n                m_buffer_in = 0;\n                m_remaining_bits = missing_bits;\n            }\n            else{\n                m_buffer_in = * this->base_reference()++;\n                m_remaining_bits = BitsIn;\n            }\n        }\n\n        // append these bits to the next output\n        // up to the size of the output\n        unsigned int i = (std::min)(missing_bits, m_remaining_bits);\n        // shift interesting bits to least significant position\n        base_value_type j = m_buffer_in >> (m_remaining_bits - i);\n        // and mask off the un interesting higher bits\n        // note presumption of twos complement notation\n        j &= (1 << i) - 1;\n        // append then interesting bits to the output value\n        m_buffer_out <<= i;\n        m_buffer_out |= j;\n\n        // and update counters\n        missing_bits -= i;\n        m_remaining_bits -= i;\n    }while(0 < missing_bits);\n    m_buffer_out_full = true;\n}\n\n} // namespace iterators\n} // namespace archive\n} // namespace boost\n\n#endif // BOOST_ARCHIVE_ITERATORS_TRANSFORM_WIDTH_HPP\n"
  },
  {
    "path": "include/boost/archive/iterators/unescape.hpp",
    "content": "#ifndef BOOST_ARCHIVE_ITERATORS_UNESCAPE_HPP\n#define BOOST_ARCHIVE_ITERATORS_UNESCAPE_HPP\n\n// MS compatible compilers support #pragma once\n#if defined(_MSC_VER)\n# pragma once\n#endif\n\n/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// unescape.hpp\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for updates, documentation, and revision history.\n\n#include <boost/assert.hpp>\n\n#include <boost/iterator/iterator_adaptor.hpp>\n#include <boost/pointee.hpp>\n\nnamespace boost {\nnamespace archive {\nnamespace iterators {\n\n/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// class used by text archives to translate char strings to wchar_t\n// strings of the currently selected locale\ntemplate<class Derived, class Base>\nclass unescape\n    : public boost::iterator_adaptor<\n        unescape<Derived, Base>,\n        Base,\n        typename pointee<Base>::type,\n        single_pass_traversal_tag,\n        typename pointee<Base>::type\n    >\n{\n    friend class boost::iterator_core_access;\n    typedef typename boost::iterator_adaptor<\n        unescape<Derived, Base>,\n        Base,\n        typename pointee<Base>::type,\n        single_pass_traversal_tag,\n        typename pointee<Base>::type\n    > super_t;\n\n    typedef unescape<Derived, Base> this_t;\npublic:\n    typedef typename this_t::value_type value_type;\n    typedef typename this_t::reference reference;\nprivate:\n    value_type dereference_impl() {\n        if(! m_full){\n            m_current_value = static_cast<Derived *>(this)->drain();\n            m_full = true;\n        }\n        return m_current_value;\n    }\n\n    reference dereference() const {\n        return const_cast<this_t *>(this)->dereference_impl();\n    }\n\n    value_type m_current_value;\n    bool m_full;\n\n    void increment(){\n        ++(this->base_reference());\n        dereference_impl();\n        m_full = false;\n    }\n\npublic:\n\n    unescape(Base base) :\n        super_t(base),\n        m_full(false)\n    {}\n\n};\n\n} // namespace iterators\n} // namespace archive\n} // namespace boost\n\n#endif // BOOST_ARCHIVE_ITERATORS_UNESCAPE_HPP\n"
  },
  {
    "path": "include/boost/archive/iterators/wchar_from_mb.hpp",
    "content": "#ifndef BOOST_ARCHIVE_ITERATORS_WCHAR_FROM_MB_HPP\n#define BOOST_ARCHIVE_ITERATORS_WCHAR_FROM_MB_HPP\n\n// MS compatible compilers support #pragma once\n#if defined(_MSC_VER)\n# pragma once\n#endif\n\n/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// wchar_from_mb.hpp\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for updates, documentation, and revision history.\n\n#include <cctype>\n#include <cstddef> // size_t\n#ifndef BOOST_NO_CWCHAR\n#include <cwchar>  // mbstate_t\n#endif\n#include <algorithm> // copy\n\n#include <boost/config.hpp>\n#if defined(BOOST_NO_STDC_NAMESPACE)\nnamespace std{\n    using ::mbstate_t;\n} // namespace std\n#endif\n#include <boost/assert.hpp>\n#include <boost/core/ignore_unused.hpp>\n#include <boost/array.hpp>\n#include <boost/iterator/iterator_adaptor.hpp>\n#include <boost/archive/detail/utf8_codecvt_facet.hpp>\n#include <boost/archive/iterators/dataflow_exception.hpp>\n#include <boost/serialization/throw_exception.hpp>\n\n#include <iostream>\n\nnamespace boost {\nnamespace archive {\nnamespace iterators {\n\n/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// class used by text archives to translate char strings to wchar_t\n// strings of the currently selected locale\ntemplate<class Base>\nclass wchar_from_mb\n    : public boost::iterator_adaptor<\n        wchar_from_mb<Base>,\n        Base,\n        wchar_t,\n        single_pass_traversal_tag,\n        wchar_t\n    >\n{\n    friend class boost::iterator_core_access;\n    typedef typename boost::iterator_adaptor<\n        wchar_from_mb<Base>,\n        Base,\n        wchar_t,\n        single_pass_traversal_tag,\n        wchar_t\n    > super_t;\n\n    typedef wchar_from_mb<Base> this_t;\n\n    void drain();\n\n    wchar_t dereference() const {\n        if(m_output.m_next == m_output.m_next_available)\n            return static_cast<wchar_t>(0);\n        return * m_output.m_next;\n    }\n\n    void increment(){\n        if(m_output.m_next == m_output.m_next_available)\n            return;\n        if(++m_output.m_next == m_output.m_next_available){\n            if(m_input.m_done)\n                return;\n            drain();\n        }\n    }\n\n    bool equal(this_t const & rhs) const {\n        return dereference() == rhs.dereference();\n    }\n\n    boost::archive::detail::utf8_codecvt_facet m_codecvt_facet;\n    std::mbstate_t m_mbs;\n\n    template<typename T>\n    struct sliding_buffer {\n        boost::array<T, 32> m_buffer;\n        typename boost::array<T, 32>::const_iterator m_next_available;\n        typename boost::array<T, 32>::iterator m_next;\n        bool m_done;\n        // default ctor\n        sliding_buffer() :\n            m_next_available(m_buffer.begin()),\n            m_next(m_buffer.begin()),\n            m_done(false)\n        {}\n        // copy ctor\n        sliding_buffer(const sliding_buffer & rhs) :\n            m_next_available(\n                std::copy(\n                    rhs.m_buffer.begin(),\n                    rhs.m_next_available,\n                    m_buffer.begin()\n                )\n            ),\n            m_next(\n                m_buffer.begin() + (rhs.m_next - rhs.m_buffer.begin())\n            ),\n            m_done(rhs.m_done)\n        {}\n    };\n\n    sliding_buffer<typename iterator_value<Base>::type> m_input;\n    sliding_buffer<typename iterator_value<this_t>::type> m_output;\n\npublic:\n    // make composable by using templated constructor\n    template<class T>\n    wchar_from_mb(T start) :\n        super_t(Base(static_cast< T >(start))),\n        m_mbs(std::mbstate_t())\n    {\n        BOOST_ASSERT(std::mbsinit(&m_mbs));\n        drain();\n    }\n    // default constructor used as an end iterator\n    wchar_from_mb(){}\n\n    // copy ctor\n    wchar_from_mb(const wchar_from_mb & rhs) :\n        super_t(rhs.base_reference()),\n        m_mbs(rhs.m_mbs),\n        m_input(rhs.m_input),\n        m_output(rhs.m_output)\n    {}\n};\n\ntemplate<class Base>\nvoid wchar_from_mb<Base>::drain(){\n    BOOST_ASSERT(! m_input.m_done);\n    for(;;){\n        typename boost::iterators::iterator_reference<Base>::type c = *(this->base_reference());\n        // a null character in a multibyte stream is takes as end of string\n        if(0 == c){\n            m_input.m_done = true;\n            break;\n        }\n        ++(this->base_reference());\n        * const_cast<typename iterator_value<Base>::type *>(\n            (m_input.m_next_available++)\n        ) = c;\n        // if input buffer is full - we're done for now\n        if(m_input.m_buffer.end() == m_input.m_next_available)\n            break;\n    }\n    const typename boost::iterators::iterator_value<Base>::type * input_new_start;\n    typename iterator_value<this_t>::type * next_available;\n\n    BOOST_ATTRIBUTE_UNUSED // redundant with ignore_unused below but clarifies intention\n    std::codecvt_base::result r = m_codecvt_facet.in(\n        m_mbs,\n        m_input.m_buffer.begin(),\n        m_input.m_next_available,\n        input_new_start,\n        m_output.m_buffer.begin(),\n        m_output.m_buffer.end(),\n        next_available\n    );\n    BOOST_ASSERT(std::codecvt_base::ok == r);\n    m_output.m_next_available = next_available;\n    m_output.m_next = m_output.m_buffer.begin();\n\n    // we're done with some of the input so shift left.\n    m_input.m_next_available = std::copy(\n        input_new_start,\n        m_input.m_next_available,\n        m_input.m_buffer.begin()\n    );\n    m_input.m_next = m_input.m_buffer.begin();\n}\n\n} // namespace iterators\n} // namespace archive\n} // namespace boost\n\n#endif // BOOST_ARCHIVE_ITERATORS_WCHAR_FROM_MB_HPP\n"
  },
  {
    "path": "include/boost/archive/iterators/xml_escape.hpp",
    "content": "#ifndef BOOST_ARCHIVE_ITERATORS_XML_ESCAPE_HPP\n#define BOOST_ARCHIVE_ITERATORS_XML_ESCAPE_HPP\n\n// MS compatible compilers support #pragma once\n#if defined(_MSC_VER)\n# pragma once\n#endif\n\n/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// xml_escape.hpp\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for updates, documentation, and revision history.\n\n#include <boost/assert.hpp>\n#include <boost/archive/iterators/escape.hpp>\n\nnamespace boost {\nnamespace archive {\nnamespace iterators {\n\n/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// insert escapes into xml text\n\ntemplate<class Base>\nclass xml_escape\n    : public escape<xml_escape<Base>, Base>\n{\n    friend class boost::iterator_core_access;\n\n    typedef escape<xml_escape<Base>, Base> super_t;\n\npublic:\n    char fill(const char * & bstart, const char * & bend);\n    wchar_t fill(const wchar_t * & bstart, const wchar_t * & bend);\n\n    template<class T>\n    xml_escape(T start) :\n        super_t(Base(static_cast< T >(start)))\n    {}\n    // intel 7.1 doesn't like default copy constructor\n    xml_escape(const xml_escape & rhs) :\n        super_t(rhs.base_reference())\n    {}\n};\n\ntemplate<class Base>\nchar xml_escape<Base>::fill(\n    const char * & bstart,\n    const char * & bend\n){\n    char current_value = * this->base_reference();\n    switch(current_value){\n    case '<':\n        bstart = \"&lt;\";\n        bend = bstart + 4;\n        break;\n    case '>':\n        bstart = \"&gt;\";\n        bend = bstart + 4;\n        break;\n    case '&':\n        bstart = \"&amp;\";\n        bend = bstart + 5;\n        break;\n    case '\"':\n        bstart = \"&quot;\";\n        bend = bstart + 6;\n        break;\n    case '\\'':\n        bstart = \"&apos;\";\n        bend = bstart + 6;\n        break;\n    default:\n        bstart=\"\";\n        bend=bstart;\n        return current_value;\n    }\n    return *bstart;\n}\n\ntemplate<class Base>\nwchar_t xml_escape<Base>::fill(\n    const wchar_t * & bstart,\n    const wchar_t * & bend\n){\n    wchar_t current_value = * this->base_reference();\n    switch(current_value){\n    case '<':\n        bstart = L\"&lt;\";\n        bend = bstart + 4;\n        break;\n    case '>':\n        bstart = L\"&gt;\";\n        bend = bstart + 4;\n        break;\n    case '&':\n        bstart = L\"&amp;\";\n        bend = bstart + 5;\n        break;\n    case '\"':\n        bstart = L\"&quot;\";\n        bend = bstart + 6;\n        break;\n    case '\\'':\n        bstart = L\"&apos;\";\n        bend = bstart + 6;\n        break;\n    default:\n        return current_value;\n    }\n    return *bstart;\n}\n\n} // namespace iterators\n} // namespace archive\n} // namespace boost\n\n#endif // BOOST_ARCHIVE_ITERATORS_XML_ESCAPE_HPP\n"
  },
  {
    "path": "include/boost/archive/iterators/xml_unescape.hpp",
    "content": "#ifndef BOOST_ARCHIVE_ITERATORS_XML_UNESCAPE_HPP\n#define BOOST_ARCHIVE_ITERATORS_XML_UNESCAPE_HPP\n\n// MS compatible compilers support #pragma once\n#if defined(_MSC_VER)\n# pragma once\n#endif\n\n/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// xml_unescape.hpp\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for updates, documentation, and revision history.\n\n#include <boost/config.hpp>\n#include <boost/detail/workaround.hpp>\n#include <boost/assert.hpp>\n\n#include <boost/serialization/throw_exception.hpp>\n\n#include <boost/archive/iterators/unescape.hpp>\n#include <boost/archive/iterators/dataflow_exception.hpp>\n\nnamespace boost {\nnamespace archive {\nnamespace iterators {\n\n/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// replace &??? xml escape sequences with the corresponding characters\ntemplate<class Base>\nclass xml_unescape\n    : public unescape<xml_unescape<Base>, Base>\n{\n    friend class boost::iterator_core_access;\n    typedef xml_unescape<Base> this_t;\n    typedef unescape<this_t, Base> super_t;\n    typedef typename boost::iterator_reference<this_t> reference_type;\n\n    reference_type dereference() const {\n        return unescape<xml_unescape<Base>, Base>::dereference();\n    }\npublic:\n    // msvc versions prior to 14.0 crash with and ICE\n    #if BOOST_WORKAROUND(BOOST_MSVC, < 1900)\n        typedef int value_type;\n    #else\n        typedef typename super_t::value_type value_type;\n    #endif\n\n    void drain_residue(const char *literal);\n    value_type drain();\n\n    template<class T>\n    xml_unescape(T start) :\n        super_t(Base(static_cast< T >(start)))\n    {}\n    // intel 7.1 doesn't like default copy constructor\n    xml_unescape(const xml_unescape & rhs) :\n        super_t(rhs.base_reference())\n    {}\n};\n\ntemplate<class Base>\nvoid xml_unescape<Base>::drain_residue(const char * literal){\n    do{\n        if(* literal != * ++(this->base_reference()))\n            boost::serialization::throw_exception(\n                dataflow_exception(\n                    dataflow_exception::invalid_xml_escape_sequence\n                )\n            );\n    }\n    while('\\0' != * ++literal);\n}\n\n// note key constraint on this function is that can't \"look ahead\" any\n// more than necessary into base iterator.  Doing so would alter the base\n// iterator reference which would make subsequent iterator comparisons\n// incorrect and thereby break the composiblity of iterators.\ntemplate<class Base>\ntypename xml_unescape<Base>::value_type\n//int\nxml_unescape<Base>::drain(){\n    value_type retval = * this->base_reference();\n    if('&' != retval){\n        return retval;\n    }\n    retval = * ++(this->base_reference());\n    switch(retval){\n    case 'l': // &lt;\n        drain_residue(\"t;\");\n        retval = '<';\n        break;\n    case 'g': // &gt;\n        drain_residue(\"t;\");\n        retval = '>';\n        break;\n    case 'a':\n        retval = * ++(this->base_reference());\n        switch(retval){\n        case 'p': // &apos;\n            drain_residue(\"os;\");\n            retval = '\\'';\n            break;\n        case 'm': // &amp;\n            drain_residue(\"p;\");\n            retval = '&';\n            break;\n        }\n        break;\n    case 'q':\n        drain_residue(\"uot;\");\n        retval = '\"';\n        break;\n    }\n    return retval;\n}\n\n} // namespace iterators\n} // namespace archive\n} // namespace boost\n\n#endif // BOOST_ARCHIVE_ITERATORS_XML_UNESCAPE_HPP\n"
  },
  {
    "path": "include/boost/archive/iterators/xml_unescape_exception.hpp",
    "content": "#ifndef BOOST_ARCHIVE_ITERATORS_XML_UNESCAPE_EXCEPTION_HPP\n#define BOOST_ARCHIVE_ITERATORS_XML_UNESCAPE_EXCEPTION_HPP\n\n// MS compatible compilers support #pragma once\n#if defined(_MSC_VER)\n# pragma once\n#endif\n\n/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// xml_unescape_exception.hpp:\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for updates, documentation, and revision history.\n\n#include <boost/config.hpp>\n#ifndef BOOST_NO_EXCEPTIONS\n#include <exception>\n\n#include <boost/assert.hpp>\n\nnamespace boost {\nnamespace archive {\nnamespace iterators {\n\n//////////////////////////////////////////////////////////////////////\n// exceptions thrown by xml_unescapes\n//\nclass xml_unescape_exception : public std::exception\n{\npublic:\n    xml_unescape_exception()\n    {}\n\n    virtual const char *what( ) const BOOST_NOEXCEPT_OR_NOTHROW\n    {\n        return \"xml contained un-recognized escape code\";\n    }\n};\n\n} // namespace iterators\n} // namespace archive\n} // namespace boost\n\n#endif //BOOST_NO_EXCEPTIONS\n#endif //BOOST_ARCHIVE_ITERATORS_XML_UNESCAPE_EXCEPTION_HPP\n"
  },
  {
    "path": "include/boost/archive/polymorphic_binary_iarchive.hpp",
    "content": "#ifndef BOOST_ARCHIVE_POLYMORPHIC_BINARY_IARCHIVE_HPP\n#define BOOST_ARCHIVE_POLYMORPHIC_BINARY_IARCHIVE_HPP\n\n// MS compatible compilers support #pragma once\n#if defined(_MSC_VER)\n# pragma once\n#endif\n\n/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// polymorphic_binary_iarchive.hpp\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for updates, documentation, and revision history.\n\n#include <boost/config.hpp>\n#include <boost/archive/binary_iarchive.hpp>\n#include <boost/archive/detail/polymorphic_iarchive_route.hpp>\n\n#ifdef BOOST_MSVC\n#  pragma warning(push)\n#  pragma warning(disable : 4511 4512)\n#endif\n\nnamespace boost {\nnamespace archive {\n\nclass BOOST_SYMBOL_VISIBLE polymorphic_binary_iarchive :\n    public detail::polymorphic_iarchive_route<binary_iarchive>\n{\npublic:\n    polymorphic_binary_iarchive(std::istream & is, unsigned int flags = 0) :\n        detail::polymorphic_iarchive_route<binary_iarchive>(is, flags)\n    {}\n    ~polymorphic_binary_iarchive() BOOST_OVERRIDE {}\n};\n\n} // namespace archive\n} // namespace boost\n\n#ifdef BOOST_MSVC\n#pragma warning(pop)\n#endif\n\n// required by export\nBOOST_SERIALIZATION_REGISTER_ARCHIVE(\n    boost::archive::polymorphic_binary_iarchive\n)\n\n#endif // BOOST_ARCHIVE_POLYMORPHIC_BINARY_IARCHIVE_HPP\n"
  },
  {
    "path": "include/boost/archive/polymorphic_binary_oarchive.hpp",
    "content": "#ifndef BOOST_ARCHIVE_POLYMORPHIC_BINARY_OARCHIVE_HPP\n#define BOOST_ARCHIVE_POLYMORPHIC_BINARY_OARCHIVE_HPP\n\n// MS compatible compilers support #pragma once\n#if defined(_MSC_VER)\n# pragma once\n#endif\n\n/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// polymorphic_binary_oarchive.hpp\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for updates, documentation, and revision history.\n\n#include <boost/config.hpp>\n#include <boost/archive/binary_oarchive.hpp>\n#include <boost/archive/detail/polymorphic_oarchive_route.hpp>\n\nnamespace boost {\nnamespace archive {\n\nclass BOOST_SYMBOL_VISIBLE polymorphic_binary_oarchive :\n    public detail::polymorphic_oarchive_route<binary_oarchive>\n{\npublic:\n    polymorphic_binary_oarchive(std::ostream & os, unsigned int flags = 0) :\n        detail::polymorphic_oarchive_route<binary_oarchive>(os, flags)\n    {}\n    ~polymorphic_binary_oarchive() BOOST_OVERRIDE {}\n};\n\n} // namespace archive\n} // namespace boost\n\n// required by export\nBOOST_SERIALIZATION_REGISTER_ARCHIVE(\n    boost::archive::polymorphic_binary_oarchive\n)\n\n#endif // BOOST_ARCHIVE_POLYMORPHIC_BINARY_OARCHIVE_HPP\n"
  },
  {
    "path": "include/boost/archive/polymorphic_iarchive.hpp",
    "content": "#ifndef BOOST_ARCHIVE_POLYMORPHIC_IARCHIVE_HPP\n#define BOOST_ARCHIVE_POLYMORPHIC_IARCHIVE_HPP\n\n// MS compatible compilers support #pragma once\n#if defined(_MSC_VER)\n# pragma once\n#endif\n\n/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// polymorphic_iarchive.hpp\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for updates, documentation, and revision history.\n\n#include <cstddef> // std::size_t\n#include <climits> // ULONG_MAX\n#include <string>\n\n#include <boost/config.hpp>\n#if defined(BOOST_NO_STDC_NAMESPACE)\nnamespace std{\n    using ::size_t;\n} // namespace std\n#endif\n\n#include <boost/cstdint.hpp>\n\n#include <boost/archive/detail/iserializer.hpp>\n#include <boost/archive/detail/interface_iarchive.hpp>\n#include <boost/serialization/library_version_type.hpp>\n#include <boost/serialization/nvp.hpp>\n#include <boost/archive/detail/register_archive.hpp>\n\n#include <boost/archive/detail/decl.hpp>\n#include <boost/archive/detail/abi_prefix.hpp> // must be the last header\n\nnamespace boost {\nnamespace serialization {\n    class extended_type_info;\n} // namespace serialization\nnamespace archive {\nnamespace detail {\n    class basic_iarchive;\n    class basic_iserializer;\n}\n\nclass polymorphic_iarchive;\n\nclass BOOST_SYMBOL_VISIBLE polymorphic_iarchive_impl :\n    public detail::interface_iarchive<polymorphic_iarchive>\n{\n#ifdef BOOST_NO_MEMBER_TEMPLATE_FRIENDS\npublic:\n#else\n    friend class detail::interface_iarchive<polymorphic_iarchive>;\n    friend class load_access;\n#endif\n    // primitive types the only ones permitted by polymorphic archives\n    virtual void load(bool & t) = 0;\n\n    virtual void load(char & t) = 0;\n    virtual void load(signed char & t) = 0;\n    virtual void load(unsigned char & t) = 0;\n    #ifndef BOOST_NO_CWCHAR\n    #ifndef BOOST_NO_INTRINSIC_WCHAR_T\n    virtual void load(wchar_t & t) = 0;\n    #endif\n    #endif\n    virtual void load(short & t) = 0;\n    virtual void load(unsigned short & t) = 0;\n    virtual void load(int & t) = 0;\n    virtual void load(unsigned int & t) = 0;\n    virtual void load(long & t) = 0;\n    virtual void load(unsigned long & t) = 0;\n\n    #if defined(BOOST_HAS_LONG_LONG)\n    virtual void load(boost::long_long_type & t) = 0;\n    virtual void load(boost::ulong_long_type & t) = 0;\n    #elif defined(BOOST_HAS_MS_INT64)\n    virtual void load(__int64 & t) = 0;\n    virtual void load(unsigned __int64 & t) = 0;\n    #endif\n\n    virtual void load(float & t) = 0;\n    virtual void load(double & t) = 0;\n\n    // string types are treated as primitives\n    virtual void load(std::string & t) = 0;\n    #ifndef BOOST_NO_STD_WSTRING\n    virtual void load(std::wstring & t) = 0;\n    #endif\n\n    // used for xml and other tagged formats\n    virtual void load_start(const char * name) = 0;\n    virtual void load_end(const char * name) = 0;\n    virtual void register_basic_serializer(const detail::basic_iserializer & bis) = 0;\n    virtual detail::helper_collection & get_helper_collection() = 0;\n\n    // msvc and borland won't automatically pass these to the base class so\n    // make it explicit here\n    template<class T>\n    void load_override(T & t)\n    {\n        archive::load(* this->This(), t);\n    }\n    // special treatment for name-value pairs.\n    template<class T>\n    void load_override(\n        const boost::serialization::nvp< T > & t\n    ){\n        load_start(t.name());\n        archive::load(* this->This(), t.value());\n        load_end(t.name());\n    }\nprotected:\n    virtual ~polymorphic_iarchive_impl() {}\npublic:\n    // utility function implemented by all legal archives\n    virtual void set_library_version(\n        boost::serialization::library_version_type archive_library_version\n    ) = 0;\n    virtual boost::serialization::library_version_type get_library_version() const = 0;\n    virtual unsigned int get_flags() const = 0;\n    virtual void delete_created_pointers() = 0;\n    virtual void reset_object_address(\n        const void * new_address,\n        const void * old_address\n    ) = 0;\n\n    virtual void load_binary(void * t, std::size_t size) = 0;\n\n    // these are used by the serialization library implementation.\n    virtual void load_object(\n        void *t,\n        const detail::basic_iserializer & bis\n    ) = 0;\n    virtual const detail::basic_pointer_iserializer * load_pointer(\n        void * & t,\n        const detail::basic_pointer_iserializer * bpis_ptr,\n        const detail::basic_pointer_iserializer * (*finder)(\n            const boost::serialization::extended_type_info & type\n        )\n    ) = 0;\n};\n\n} // namespace archive\n} // namespace boost\n\n#include <boost/archive/detail/abi_suffix.hpp> // pops abi_suffix.hpp pragmas\n\nnamespace boost {\nnamespace archive {\n\nclass BOOST_SYMBOL_VISIBLE polymorphic_iarchive :\n    public polymorphic_iarchive_impl\n{\npublic:\n    ~polymorphic_iarchive() BOOST_OVERRIDE {}\n};\n\n} // namespace archive\n} // namespace boost\n\n// required by export\nBOOST_SERIALIZATION_REGISTER_ARCHIVE(boost::archive::polymorphic_iarchive)\n\n#endif // BOOST_ARCHIVE_POLYMORPHIC_IARCHIVE_HPP\n"
  },
  {
    "path": "include/boost/archive/polymorphic_oarchive.hpp",
    "content": "#ifndef BOOST_ARCHIVE_POLYMORPHIC_OARCHIVE_HPP\n#define BOOST_ARCHIVE_POLYMORPHIC_OARCHIVE_HPP\n\n// MS compatible compilers support #pragma once\n#if defined(_MSC_VER)\n# pragma once\n#endif\n\n/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// polymorphic_oarchive.hpp\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for updates, documentation, and revision history.\n\n#include <cstddef> // size_t\n#include <climits> // ULONG_MAX\n#include <string>\n\n#include <boost/config.hpp>\n#if defined(BOOST_NO_STDC_NAMESPACE)\nnamespace std{\n    using ::size_t;\n} // namespace std\n#endif\n\n#include <boost/cstdint.hpp>\n#include <boost/archive/detail/oserializer.hpp>\n#include <boost/archive/detail/interface_oarchive.hpp>\n#include <boost/serialization/nvp.hpp>\n#include <boost/archive/detail/register_archive.hpp>\n\n#include <boost/archive/detail/decl.hpp>\n#include <boost/archive/detail/abi_prefix.hpp> // must be the last header\n\nnamespace boost {\nnamespace serialization {\n    class extended_type_info;\n} // namespace serialization\nnamespace archive {\nnamespace detail {\n    class basic_oarchive;\n    class basic_oserializer;\n}\n\nclass polymorphic_oarchive;\n\nclass BOOST_SYMBOL_VISIBLE polymorphic_oarchive_impl :\n    public detail::interface_oarchive<polymorphic_oarchive>\n{\n#ifdef BOOST_NO_MEMBER_TEMPLATE_FRIENDS\npublic:\n#else\n    friend class detail::interface_oarchive<polymorphic_oarchive>;\n    friend class save_access;\n#endif\n    // primitive types the only ones permitted by polymorphic archives\n    virtual void save(const bool t) = 0;\n\n    virtual void save(const char t) = 0;\n    virtual void save(const signed char t) = 0;\n    virtual void save(const unsigned char t) = 0;\n    #ifndef BOOST_NO_CWCHAR\n    #ifndef BOOST_NO_INTRINSIC_WCHAR_T\n    virtual void save(const wchar_t t) = 0;\n    #endif\n    #endif\n    virtual void save(const short t) = 0;\n    virtual void save(const unsigned short t) = 0;\n    virtual void save(const int t) = 0;\n    virtual void save(const unsigned int t) = 0;\n    virtual void save(const long t) = 0;\n    virtual void save(const unsigned long t) = 0;\n\n    #if defined(BOOST_HAS_LONG_LONG)\n    virtual void save(const boost::long_long_type t) = 0;\n    virtual void save(const boost::ulong_long_type t) = 0;\n    #elif defined(BOOST_HAS_MS_INT64)\n    virtual void save(const __int64 t) = 0;\n    virtual void save(const unsigned __int64 t) = 0;\n    #endif\n\n    virtual void save(const float t) = 0;\n    virtual void save(const double t) = 0;\n\n    // string types are treated as primitives\n    virtual void save(const std::string & t) = 0;\n    #ifndef BOOST_NO_STD_WSTRING\n    virtual void save(const std::wstring & t) = 0;\n    #endif\n\n    virtual void save_null_pointer() = 0;\n    // used for xml and other tagged formats\n    virtual void save_start(const char * name) = 0;\n    virtual void save_end(const char * name) = 0;\n    virtual void register_basic_serializer(const detail::basic_oserializer & bos) = 0;\n    virtual detail::helper_collection & get_helper_collection() = 0;\n\n    virtual void end_preamble() = 0;\n\n    // msvc and borland won't automatically pass these to the base class so\n    // make it explicit here\n    template<class T>\n    void save_override(T & t)\n    {\n        archive::save(* this->This(), t);\n    }\n    // special treatment for name-value pairs.\n    template<class T>\n    void save_override(\n            const ::boost::serialization::nvp< T > & t\n        ){\n        save_start(t.name());\n        archive::save(* this->This(), t.const_value());\n        save_end(t.name());\n    }\nprotected:\n    virtual ~polymorphic_oarchive_impl() {}\npublic:\n    // utility functions implemented by all legal archives\n    virtual unsigned int get_flags() const = 0;\n    virtual boost::serialization::library_version_type get_library_version() const = 0;\n    virtual void save_binary(const void * t, std::size_t size) = 0;\n\n    virtual void save_object(\n        const void *x,\n        const detail::basic_oserializer & bos\n    ) = 0;\n    virtual void save_pointer(\n        const void * t,\n        const detail::basic_pointer_oserializer * bpos_ptr\n    ) = 0;\n};\n\n// note: preserve naming symmetry\nclass BOOST_SYMBOL_VISIBLE polymorphic_oarchive :\n    public polymorphic_oarchive_impl\n{\npublic:\n    ~polymorphic_oarchive() BOOST_OVERRIDE {}\n};\n\n} // namespace archive\n} // namespace boost\n\n// required by export\nBOOST_SERIALIZATION_REGISTER_ARCHIVE(boost::archive::polymorphic_oarchive)\n\n#include <boost/archive/detail/abi_suffix.hpp> // pops abi_suffix.hpp pragmas\n\n#endif // BOOST_ARCHIVE_POLYMORPHIC_OARCHIVE_HPP\n"
  },
  {
    "path": "include/boost/archive/polymorphic_text_iarchive.hpp",
    "content": "#ifndef BOOST_ARCHIVE_POLYMORPHIC_TEXT_IARCHIVE_HPP\n#define BOOST_ARCHIVE_POLYMORPHIC_TEXT_IARCHIVE_HPP\n\n// MS compatible compilers support #pragma once\n#if defined(_MSC_VER)\n# pragma once\n#endif\n\n/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// polymorphic_text_iarchive.hpp\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for updates, documentation, and revision history.\n\n#include <boost/config.hpp>\n#include <boost/archive/text_iarchive.hpp>\n#include <boost/archive/detail/polymorphic_iarchive_route.hpp>\n\n#ifdef BOOST_MSVC\n#  pragma warning(push)\n#  pragma warning(disable : 4511 4512)\n#endif\n\nnamespace boost {\nnamespace archive {\n\nclass BOOST_SYMBOL_VISIBLE polymorphic_text_iarchive :\n    public detail::polymorphic_iarchive_route<text_iarchive>\n{\npublic:\n    polymorphic_text_iarchive(std::istream & is, unsigned int flags = 0) :\n        detail::polymorphic_iarchive_route<text_iarchive>(is, flags)\n    {}\n    ~polymorphic_text_iarchive() BOOST_OVERRIDE {}\n};\n\n} // namespace archive\n} // namespace boost\n\n#ifdef BOOST_MSVC\n#pragma warning(pop)\n#endif\n\n// required by export\nBOOST_SERIALIZATION_REGISTER_ARCHIVE(\n    boost::archive::polymorphic_text_iarchive\n)\n\n#endif // BOOST_ARCHIVE_POLYMORPHIC_TEXT_IARCHIVE_HPP\n"
  },
  {
    "path": "include/boost/archive/polymorphic_text_oarchive.hpp",
    "content": "#ifndef BOOST_ARCHIVE_POLYMORPHIC_TEXT_OARCHIVE_HPP\n#define BOOST_ARCHIVE_POLYMORPHIC_TEXT_OARCHIVE_HPP\n\n// MS compatible compilers support #pragma once\n#if defined(_MSC_VER)\n# pragma once\n#endif\n\n/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// polymorphic_text_oarchive.hpp\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for updates, documentation, and revision history.\n\n#include <boost/config.hpp>\n#include <boost/archive/text_oarchive.hpp>\n#include <boost/archive/detail/polymorphic_oarchive_route.hpp>\n\nnamespace boost {\nnamespace archive {\n\nclass BOOST_SYMBOL_VISIBLE polymorphic_text_oarchive :\n    public detail::polymorphic_oarchive_route<text_oarchive>\n{\npublic:\n    polymorphic_text_oarchive(std::ostream & os, unsigned int flags = 0) :\n        detail::polymorphic_oarchive_route<text_oarchive>(os, flags)\n    {}\n    ~polymorphic_text_oarchive() BOOST_OVERRIDE {}\n};\n\n} // namespace archive\n} // namespace boost\n\n// required by export\nBOOST_SERIALIZATION_REGISTER_ARCHIVE(\n    boost::archive::polymorphic_text_oarchive\n)\n\n#endif // BOOST_ARCHIVE_POLYMORPHIC_TEXT_OARCHIVE_HPP\n"
  },
  {
    "path": "include/boost/archive/polymorphic_text_wiarchive.hpp",
    "content": "#ifndef BOOST_ARCHIVE_POLYMORPHIC_TEXT_WIARCHIVE_HPP\n#define BOOST_ARCHIVE_POLYMORPHIC_TEXT_WIARCHIVE_HPP\n\n// MS compatible compilers support #pragma once\n#if defined(_MSC_VER)\n# pragma once\n#endif\n\n/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// polymorphic_text_wiarchive.hpp\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for updates, documentation, and revision history.\n\n#include <boost/config.hpp>\n#ifdef BOOST_NO_STD_WSTREAMBUF\n#error \"wide char i/o not supported on this platform\"\n#else\n\n#include <boost/archive/text_wiarchive.hpp>\n#include <boost/archive/detail/polymorphic_iarchive_route.hpp>\n\n#ifdef BOOST_MSVC\n#  pragma warning(push)\n#  pragma warning(disable : 4511 4512)\n#endif\n\nnamespace boost {\nnamespace archive {\n\nclass BOOST_SYMBOL_VISIBLE polymorphic_text_wiarchive :\n    public detail::polymorphic_iarchive_route<text_wiarchive>\n{\npublic:\n    polymorphic_text_wiarchive(std::wistream & is, unsigned int flags = 0) :\n        detail::polymorphic_iarchive_route<text_wiarchive>(is, flags)\n    {}\n    ~polymorphic_text_wiarchive() BOOST_OVERRIDE {}\n};\n\n} // namespace archive\n} // namespace boost\n\n#ifdef BOOST_MSVC\n#pragma warning(pop)\n#endif\n\n// required by export\nBOOST_SERIALIZATION_REGISTER_ARCHIVE(\n    boost::archive::polymorphic_text_wiarchive\n)\n\n#endif // BOOST_NO_STD_WSTREAMBUF\n#endif // BOOST_ARCHIVE_POLYMORPHIC_TEXT_WIARCHIVE_HPP\n"
  },
  {
    "path": "include/boost/archive/polymorphic_text_woarchive.hpp",
    "content": "#ifndef BOOST_ARCHIVE_POLYMORPHIC_TEXT_WOARCHIVE_HPP\n#define BOOST_ARCHIVE_POLYMORPHIC_TEXT_WOARCHIVE_HPP\n\n// MS compatible compilers support #pragma once\n#if defined(_MSC_VER)\n# pragma once\n#endif\n\n/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// polymorphic_text_oarchive.hpp\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for updates, documentation, and revision history.\n\n#include <boost/config.hpp>\n#ifdef BOOST_NO_STD_WSTREAMBUF\n#error \"wide char i/o not supported on this platform\"\n#else\n\n#include <boost/archive/text_woarchive.hpp>\n#include <boost/archive/detail/polymorphic_oarchive_route.hpp>\n\nnamespace boost {\nnamespace archive {\n\nclass BOOST_SYMBOL_VISIBLE polymorphic_text_woarchive :\n    public detail::polymorphic_oarchive_route<text_woarchive>\n{\npublic:\n    polymorphic_text_woarchive(std::wostream & os, unsigned int flags = 0) :\n        detail::polymorphic_oarchive_route<text_woarchive>(os, flags)\n    {}\n    ~polymorphic_text_woarchive() BOOST_OVERRIDE {}\n};\n\n} // namespace archive\n} // namespace boost\n\n// required by export\nBOOST_SERIALIZATION_REGISTER_ARCHIVE(\n    boost::archive::polymorphic_text_woarchive\n)\n\n#endif // BOOST_NO_STD_WSTREAMBUF\n#endif // BOOST_ARCHIVE_POLYMORPHIC_TEXT_WOARCHIVE_HPP\n"
  },
  {
    "path": "include/boost/archive/polymorphic_xml_iarchive.hpp",
    "content": "#ifndef BOOST_ARCHIVE_POLYMORPHIC_XML_IARCHIVE_HPP\n#define BOOST_ARCHIVE_POLYMORPHIC_XML_IARCHIVE_HPP\n\n// MS compatible compilers support #pragma once\n#if defined(_MSC_VER)\n# pragma once\n#endif\n\n/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// polymorphic_xml_iarchive.hpp\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for updates, documentation, and revision history.\n\n#include <boost/config.hpp>\n#include <boost/archive/xml_iarchive.hpp>\n#include <boost/archive/detail/polymorphic_iarchive_route.hpp>\n\n#ifdef BOOST_MSVC\n#  pragma warning(push)\n#  pragma warning(disable : 4511 4512)\n#endif\n\nnamespace boost {\nnamespace archive {\n\nclass BOOST_SYMBOL_VISIBLE polymorphic_xml_iarchive :\n    public detail::polymorphic_iarchive_route<xml_iarchive>\n{\npublic:\n    polymorphic_xml_iarchive(std::istream & is, unsigned int flags = 0) :\n        detail::polymorphic_iarchive_route<xml_iarchive>(is, flags)\n    {}\n    ~polymorphic_xml_iarchive() BOOST_OVERRIDE {}\n};\n\n} // namespace archive\n} // namespace boost\n\n#ifdef BOOST_MSVC\n#pragma warning(pop)\n#endif\n\n// required by export\nBOOST_SERIALIZATION_REGISTER_ARCHIVE(\n    boost::archive::polymorphic_xml_iarchive\n)\n\n#endif // BOOST_ARCHIVE_POLYMORPHIC_XML_IARCHIVE_HPP\n"
  },
  {
    "path": "include/boost/archive/polymorphic_xml_oarchive.hpp",
    "content": "#ifndef BOOST_ARCHIVE_POLYMORPHIC_XML_OARCHIVE_HPP\n#define BOOST_ARCHIVE_POLYMORPHIC_XML_OARCHIVE_HPP\n\n// MS compatible compilers support #pragma once\n#if defined(_MSC_VER)\n# pragma once\n#endif\n\n/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// polymorphic_xml_oarchive.hpp\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for updates, documentation, and revision history.\n\n#include <boost/config.hpp>\n#include <boost/archive/xml_oarchive.hpp>\n#include <boost/archive/detail/polymorphic_oarchive_route.hpp>\n\nnamespace boost {\nnamespace archive {\n\nclass BOOST_SYMBOL_VISIBLE polymorphic_xml_oarchive :\n    public detail::polymorphic_oarchive_route<xml_oarchive>\n{\npublic:\n    polymorphic_xml_oarchive(std::ostream & os, unsigned int flags = 0) :\n        detail::polymorphic_oarchive_route<xml_oarchive>(os, flags)\n    {}\n    ~polymorphic_xml_oarchive() BOOST_OVERRIDE {}\n};\n} // namespace archive\n} // namespace boost\n\n// required by export\nBOOST_SERIALIZATION_REGISTER_ARCHIVE(\n    boost::archive::polymorphic_xml_oarchive\n)\n\n#endif // BOOST_ARCHIVE_POLYMORPHIC_XML_OARCHIVE_HPP\n"
  },
  {
    "path": "include/boost/archive/polymorphic_xml_wiarchive.hpp",
    "content": "#ifndef BOOST_ARCHIVE_POLYMORPHIC_XML_WIARCHIVE_HPP\n#define BOOST_ARCHIVE_POLYMORPHIC_XML_WIARCHIVE_HPP\n\n// MS compatible compilers support #pragma once\n#if defined(_MSC_VER)\n# pragma once\n#endif\n\n/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// polymorphic_xml_wiarchive.hpp\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for updates, documentation, and revision history.\n\n#include <boost/config.hpp>\n#ifdef BOOST_NO_STD_WSTREAMBUF\n#error \"wide char i/o not supported on this platform\"\n#else\n\n#include <boost/archive/xml_wiarchive.hpp>\n#include <boost/archive/detail/polymorphic_iarchive_route.hpp>\n\nnamespace boost {\nnamespace archive {\n\nclass BOOST_SYMBOL_VISIBLE polymorphic_xml_wiarchive :\n    public detail::polymorphic_iarchive_route<xml_wiarchive>\n{\npublic:\n    polymorphic_xml_wiarchive(std::wistream & is, unsigned int flags = 0) :\n        detail::polymorphic_iarchive_route<xml_wiarchive>(is, flags)\n    {}\n    ~polymorphic_xml_wiarchive() BOOST_OVERRIDE {}\n};\n\n} // namespace archive\n} // namespace boost\n\n// required by export\nBOOST_SERIALIZATION_REGISTER_ARCHIVE(\n    boost::archive::polymorphic_xml_wiarchive\n)\n\n#endif // BOOST_NO_STD_WSTREAMBUF\n#endif // BOOST_ARCHIVE_POLYMORPHIC_XML_WIARCHIVE_HPP\n"
  },
  {
    "path": "include/boost/archive/polymorphic_xml_woarchive.hpp",
    "content": "#ifndef BOOST_ARCHIVE_POLYMORPHIC_XML_WOARCHIVE_HPP\n#define BOOST_ARCHIVE_POLYMORPHIC_XML_WOARCHIVE_HPP\n\n// MS compatible compilers support #pragma once\n#if defined(_MSC_VER)\n# pragma once\n#endif\n\n/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// polymorphic_xml_woarchive.hpp\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for updates, documentation, and revision history.\n\n#include <boost/config.hpp>\n#ifdef BOOST_NO_STD_WSTREAMBUF\n#error \"wide char i/o not supported on this platform\"\n#else\n\n#include <boost/archive/xml_woarchive.hpp>\n#include <boost/archive/detail/polymorphic_oarchive_route.hpp>\n\nnamespace boost {\nnamespace archive {\n\nclass BOOST_SYMBOL_VISIBLE polymorphic_xml_woarchive :\n    public detail::polymorphic_oarchive_route<xml_woarchive>\n{\npublic:\n    polymorphic_xml_woarchive(std::wostream & os, unsigned int flags = 0) :\n        detail::polymorphic_oarchive_route<xml_woarchive>(os, flags)\n    {}\n    ~polymorphic_xml_woarchive() BOOST_OVERRIDE {}\n};\n\n} // namespace archive\n} // namespace boost\n\n// required by export\nBOOST_SERIALIZATION_REGISTER_ARCHIVE(\n    boost::archive::polymorphic_xml_woarchive\n)\n\n#endif // BOOST_NO_STD_WSTREAMBUF\n#endif // BOOST_ARCHIVE_POLYMORPHIC_XML_WOARCHIVE_HPP\n"
  },
  {
    "path": "include/boost/archive/text_iarchive.hpp",
    "content": "#ifndef BOOST_ARCHIVE_TEXT_IARCHIVE_HPP\n#define BOOST_ARCHIVE_TEXT_IARCHIVE_HPP\n\n// MS compatible compilers support #pragma once\n#if defined(_MSC_VER)\n# pragma once\n#endif\n\n/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// text_iarchive.hpp\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for updates, documentation, and revision history.\n\n#include <istream>\n\n#include <boost/config.hpp>\n#include <boost/archive/detail/auto_link_archive.hpp>\n#include <boost/archive/basic_text_iprimitive.hpp>\n#include <boost/archive/basic_text_iarchive.hpp>\n#include <boost/archive/detail/register_archive.hpp>\n#include <boost/serialization/item_version_type.hpp>\n\n#include <boost/archive/detail/abi_prefix.hpp> // must be the last header\n\n#ifdef BOOST_MSVC\n#  pragma warning(push)\n#  pragma warning(disable : 4511 4512)\n#endif\n\nnamespace boost {\nnamespace archive {\n\nnamespace detail {\n    template<class Archive> class interface_iarchive;\n} // namespace detail\n\ntemplate<class Archive>\nclass BOOST_SYMBOL_VISIBLE text_iarchive_impl :\n    public basic_text_iprimitive<std::istream>,\n    public basic_text_iarchive<Archive>\n{\n#ifdef BOOST_NO_MEMBER_TEMPLATE_FRIENDS\npublic:\n#else\nprotected:\n    friend class detail::interface_iarchive<Archive>;\n    friend class load_access;\n#endif\n    template<class T>\n    void load(T & t){\n        basic_text_iprimitive<std::istream>::load(t);\n    }\n    void load(version_type & t){\n        unsigned int v;\n        load(v);\n        t = version_type(v);\n    }\n    void load(boost::serialization::item_version_type & t){\n        unsigned int v;\n        load(v);\n        t = boost::serialization::item_version_type(v);\n    }\n    BOOST_ARCHIVE_DECL void\n    load(char * t);\n    #ifndef BOOST_NO_INTRINSIC_WCHAR_T\n    BOOST_ARCHIVE_DECL void\n    load(wchar_t * t);\n    #endif\n    BOOST_ARCHIVE_DECL void\n    load(std::string &s);\n    #ifndef BOOST_NO_STD_WSTRING\n    BOOST_ARCHIVE_DECL void\n    load(std::wstring &ws);\n    #endif\n    template<class T>\n    void load_override(T & t){\n        basic_text_iarchive<Archive>::load_override(t);\n    }\n    BOOST_ARCHIVE_DECL void\n    load_override(class_name_type & t);\n    BOOST_ARCHIVE_DECL void\n    init();\n    BOOST_ARCHIVE_DECL\n    text_iarchive_impl(std::istream & is, unsigned int flags);\n    // don't import inline definitions! leave this as a reminder.\n    //BOOST_ARCHIVE_DECL\n    ~text_iarchive_impl() BOOST_OVERRIDE {}\n};\n\n} // namespace archive\n} // namespace boost\n\n#ifdef BOOST_MSVC\n#pragma warning(pop)\n#endif\n\n#include <boost/archive/detail/abi_suffix.hpp> // pops abi_suffix.hpp pragmas\n\n#ifdef BOOST_MSVC\n#  pragma warning(push)\n#  pragma warning(disable : 4511 4512)\n#endif\n\nnamespace boost {\nnamespace archive {\n\nclass BOOST_SYMBOL_VISIBLE text_iarchive :\n    public text_iarchive_impl<text_iarchive>{\npublic:\n    text_iarchive(std::istream & is_, unsigned int flags = 0) :\n        // note: added _ to suppress useless gcc warning\n        text_iarchive_impl<text_iarchive>(is_, flags)\n    {\n        if(0 == (flags & no_header))\n             init();\n    }\n    ~text_iarchive() BOOST_OVERRIDE {}\n};\n\n} // namespace archive\n} // namespace boost\n\n// required by export\nBOOST_SERIALIZATION_REGISTER_ARCHIVE(boost::archive::text_iarchive)\n\n#ifdef BOOST_MSVC\n#pragma warning(pop)\n#endif\n\n#endif // BOOST_ARCHIVE_TEXT_IARCHIVE_HPP\n"
  },
  {
    "path": "include/boost/archive/text_oarchive.hpp",
    "content": "#ifndef BOOST_ARCHIVE_TEXT_OARCHIVE_HPP\n#define BOOST_ARCHIVE_TEXT_OARCHIVE_HPP\n\n// MS compatible compilers support #pragma once\n#if defined(_MSC_VER)\n# pragma once\n#endif\n\n/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// text_oarchive.hpp\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for updates, documentation, and revision history.\n\n#include <ostream>\n#include <cstddef> // std::size_t\n\n#include <boost/config.hpp>\n#if defined(BOOST_NO_STDC_NAMESPACE)\nnamespace std{\n    using ::size_t;\n} // namespace std\n#endif\n\n#include <boost/archive/detail/auto_link_archive.hpp>\n#include <boost/archive/basic_text_oprimitive.hpp>\n#include <boost/archive/basic_text_oarchive.hpp>\n#include <boost/archive/detail/register_archive.hpp>\n#include <boost/serialization/item_version_type.hpp>\n\n#include <boost/archive/detail/abi_prefix.hpp> // must be the last header\n\n#ifdef BOOST_MSVC\n#  pragma warning(push)\n#  pragma warning(disable : 4511 4512)\n#endif\n\nnamespace boost {\nnamespace archive {\n\nnamespace detail {\n    template<class Archive> class interface_oarchive;\n} // namespace detail\n\ntemplate<class Archive>\nclass BOOST_SYMBOL_VISIBLE text_oarchive_impl :\n     /* protected ? */ public basic_text_oprimitive<std::ostream>,\n     public basic_text_oarchive<Archive>\n{\n#ifdef BOOST_NO_MEMBER_TEMPLATE_FRIENDS\npublic:\n#else\nprotected:\n    friend class detail::interface_oarchive<Archive>;\n    friend class basic_text_oarchive<Archive>;\n    friend class save_access;\n#endif\n    template<class T>\n    void save(const T & t){\n        this->newtoken();\n        basic_text_oprimitive<std::ostream>::save(t);\n    }\n    void save(const version_type & t){\n        save(static_cast<unsigned int>(t));\n    }\n    void save(const boost::serialization::item_version_type & t){\n        save(static_cast<unsigned int>(t));\n    }\n    BOOST_ARCHIVE_DECL void\n    save(const char * t);\n    #ifndef BOOST_NO_INTRINSIC_WCHAR_T\n    BOOST_ARCHIVE_DECL void\n    save(const wchar_t * t);\n    #endif\n    BOOST_ARCHIVE_DECL void\n    save(const std::string &s);\n    #ifndef BOOST_NO_STD_WSTRING\n    BOOST_ARCHIVE_DECL void\n    save(const std::wstring &ws);\n    #endif\n    BOOST_ARCHIVE_DECL\n    text_oarchive_impl(std::ostream & os, unsigned int flags);\n    // don't import inline definitions! leave this as a reminder.\n    //BOOST_ARCHIVE_DECL\n    ~text_oarchive_impl() BOOST_OVERRIDE {}\npublic:\n    BOOST_ARCHIVE_DECL void\n    save_binary(const void *address, std::size_t count);\n};\n\n// do not derive from this class.  If you want to extend this functionality\n// via inheritance, derived from text_oarchive_impl instead.  This will\n// preserve correct static polymorphism.\nclass BOOST_SYMBOL_VISIBLE text_oarchive :\n    public text_oarchive_impl<text_oarchive>\n{\npublic:\n    text_oarchive(std::ostream & os_, unsigned int flags = 0) :\n        // note: added _ to suppress useless gcc warning\n        text_oarchive_impl<text_oarchive>(os_, flags)\n    {\n        if(0 == (flags & no_header))\n            init();\n    }\n    ~text_oarchive() BOOST_OVERRIDE {}\n};\n\n} // namespace archive\n} // namespace boost\n\n// required by export\nBOOST_SERIALIZATION_REGISTER_ARCHIVE(boost::archive::text_oarchive)\n\n#ifdef BOOST_MSVC\n#pragma warning(pop)\n#endif\n\n#include <boost/archive/detail/abi_suffix.hpp> // pops abi_suffix.hpp pragmas\n\n#endif // BOOST_ARCHIVE_TEXT_OARCHIVE_HPP\n"
  },
  {
    "path": "include/boost/archive/text_wiarchive.hpp",
    "content": "#ifndef BOOST_ARCHIVE_TEXT_WIARCHIVE_HPP\n#define BOOST_ARCHIVE_TEXT_WIARCHIVE_HPP\n\n// MS compatible compilers support #pragma once\n#if defined(_MSC_VER)\n# pragma once\n#endif\n\n/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// text_wiarchive.hpp\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for updates, documentation, and revision history.\n\n#include <boost/config.hpp>\n#ifdef BOOST_NO_STD_WSTREAMBUF\n#error \"wide char i/o not supported on this platform\"\n#else\n\n#include <istream>\n\n#include <boost/archive/detail/auto_link_warchive.hpp>\n#include <boost/archive/basic_text_iprimitive.hpp>\n#include <boost/archive/basic_text_iarchive.hpp>\n#include <boost/archive/detail/register_archive.hpp>\n#include <boost/serialization/item_version_type.hpp>\n\n#include <boost/archive/detail/abi_prefix.hpp> // must be the last header\n\n#ifdef BOOST_MSVC\n#  pragma warning(push)\n#  pragma warning(disable : 4511 4512)\n#endif\n\nnamespace boost {\nnamespace archive {\n\nnamespace detail {\n    template<class Archive> class interface_iarchive;\n} // namespace detail\n\ntemplate<class Archive>\nclass BOOST_SYMBOL_VISIBLE text_wiarchive_impl :\n    public basic_text_iprimitive<std::wistream>,\n    public basic_text_iarchive<Archive>\n{\n#ifdef BOOST_NO_MEMBER_TEMPLATE_FRIENDS\npublic:\n#else\nprotected:\n    #if BOOST_WORKAROUND(BOOST_MSVC, < 1500)\n        // for some inexplicable reason insertion of \"class\" generates compile erro\n        // on msvc 7.1\n        friend detail::interface_iarchive<Archive>;\n        friend load_access;\n    #else\n        friend class detail::interface_iarchive<Archive>;\n        friend class load_access;\n    #endif\n#endif\n    template<class T>\n    void load(T & t){\n        basic_text_iprimitive<std::wistream>::load(t);\n    }\n    void load(version_type & t){\n        unsigned int v;\n        load(v);\n        t = version_type(v);\n    }\n    void load(boost::serialization::item_version_type & t){\n        unsigned int v;\n        load(v);\n        t = boost::serialization::item_version_type(v);\n    }\n    BOOST_WARCHIVE_DECL void\n    load(char * t);\n    #ifndef BOOST_NO_INTRINSIC_WCHAR_T\n    BOOST_WARCHIVE_DECL void\n    load(wchar_t * t);\n    #endif\n    BOOST_WARCHIVE_DECL void\n    load(std::string &s);\n    #ifndef BOOST_NO_STD_WSTRING\n    BOOST_WARCHIVE_DECL void\n    load(std::wstring &ws);\n    #endif\n    template<class T>\n    void load_override(T & t){\n        basic_text_iarchive<Archive>::load_override(t);\n    }\n    BOOST_WARCHIVE_DECL\n    text_wiarchive_impl(std::wistream & is, unsigned int flags);\n    ~text_wiarchive_impl() BOOST_OVERRIDE {}\n};\n\n} // namespace archive\n} // namespace boost\n\n#ifdef BOOST_MSVC\n#pragma warning(pop)\n#endif\n\n#include <boost/archive/detail/abi_suffix.hpp> // pops abi_suffix.hpp pragmas\n\n#ifdef BOOST_MSVC\n#  pragma warning(push)\n#  pragma warning(disable : 4511 4512)\n#endif\n\nnamespace boost {\nnamespace archive {\n\nclass BOOST_SYMBOL_VISIBLE text_wiarchive :\n    public text_wiarchive_impl<text_wiarchive>{\npublic:\n    text_wiarchive(std::wistream & is, unsigned int flags = 0) :\n        text_wiarchive_impl<text_wiarchive>(is, flags)\n    {\n        if(0 == (flags & no_header))\n            init();\n    }\n    ~text_wiarchive() BOOST_OVERRIDE {}\n};\n\n} // namespace archive\n} // namespace boost\n\n// required by export\nBOOST_SERIALIZATION_REGISTER_ARCHIVE(boost::archive::text_wiarchive)\n\n#ifdef BOOST_MSVC\n#pragma warning(pop)\n#endif\n\n#endif // BOOST_NO_STD_WSTREAMBUF\n#endif // BOOST_ARCHIVE_TEXT_WIARCHIVE_HPP\n"
  },
  {
    "path": "include/boost/archive/text_woarchive.hpp",
    "content": "#ifndef BOOST_ARCHIVE_TEXT_WOARCHIVE_HPP\n#define BOOST_ARCHIVE_TEXT_WOARCHIVE_HPP\n\n// MS compatible compilers support #pragma once\n#if defined(_MSC_VER)\n# pragma once\n#endif\n\n/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// text_woarchive.hpp\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for updates, documentation, and revision history.\n\n#include <boost/config.hpp>\n\n#ifdef BOOST_NO_STD_WSTREAMBUF\n#error \"wide char i/o not supported on this platform\"\n#else\n\n#include <ostream>\n#include <cstddef> // size_t\n\n#if defined(BOOST_NO_STDC_NAMESPACE)\nnamespace std{\n    using ::size_t;\n} // namespace std\n#endif\n\n#include <boost/archive/detail/auto_link_warchive.hpp>\n#include <boost/archive/basic_text_oprimitive.hpp>\n#include <boost/archive/basic_text_oarchive.hpp>\n#include <boost/archive/detail/register_archive.hpp>\n#include <boost/serialization/item_version_type.hpp>\n\n#include <boost/archive/detail/abi_prefix.hpp> // must be the last header\n\n#ifdef BOOST_MSVC\n#  pragma warning(push)\n#  pragma warning(disable : 4511 4512)\n#endif\n\nnamespace boost {\nnamespace archive {\n\nnamespace detail {\n    template<class Archive> class interface_oarchive;\n} // namespace detail\n\ntemplate<class Archive>\nclass BOOST_SYMBOL_VISIBLE text_woarchive_impl :\n    public basic_text_oprimitive<std::wostream>,\n    public basic_text_oarchive<Archive>\n{\n#ifdef BOOST_NO_MEMBER_TEMPLATE_FRIENDS\npublic:\n#else\nprotected:\n    #if BOOST_WORKAROUND(BOOST_MSVC, < 1500)\n        // for some inexplicable reason insertion of \"class\" generates compile erro\n        // on msvc 7.1\n        friend detail::interface_oarchive<Archive>;\n        friend basic_text_oarchive<Archive>;\n        friend save_access;\n    #else\n        friend class detail::interface_oarchive<Archive>;\n        friend class basic_text_oarchive<Archive>;\n        friend class save_access;\n    #endif\n#endif\n    template<class T>\n    void save(const T & t){\n        this->newtoken();\n        basic_text_oprimitive<std::wostream>::save(t);\n    }\n    void save(const version_type & t){\n        save(static_cast<unsigned int>(t));\n    }\n    void save(const boost::serialization::item_version_type & t){\n        save(static_cast<unsigned int>(t));\n    }\n    BOOST_WARCHIVE_DECL void\n    save(const char * t);\n    #ifndef BOOST_NO_INTRINSIC_WCHAR_T\n    BOOST_WARCHIVE_DECL void\n    save(const wchar_t * t);\n    #endif\n    BOOST_WARCHIVE_DECL void\n    save(const std::string &s);\n    #ifndef BOOST_NO_STD_WSTRING\n    BOOST_WARCHIVE_DECL void\n    save(const std::wstring &ws);\n    #endif\n    text_woarchive_impl(std::wostream & os, unsigned int flags) :\n        basic_text_oprimitive<std::wostream>(\n            os,\n            0 != (flags & no_codecvt)\n        ),\n        basic_text_oarchive<Archive>(flags)\n    {}\npublic:\n    void save_binary(const void *address, std::size_t count){\n        put(static_cast<wchar_t>('\\n'));\n        this->end_preamble();\n        #if ! defined(__MWERKS__)\n        this->basic_text_oprimitive<std::wostream>::save_binary(\n        #else\n        this->basic_text_oprimitive::save_binary(\n        #endif\n            address,\n            count\n        );\n        put(static_cast<wchar_t>('\\n'));\n        this->delimiter = this->none;\n    }\n\n};\n\n// we use the following because we can't use\n// typedef text_oarchive_impl<text_oarchive_impl<...> > text_oarchive;\n\n// do not derive from this class.  If you want to extend this functionality\n// via inheritance, derived from text_oarchive_impl instead.  This will\n// preserve correct static polymorphism.\nclass BOOST_SYMBOL_VISIBLE text_woarchive :\n    public text_woarchive_impl<text_woarchive>\n{\npublic:\n    text_woarchive(std::wostream & os, unsigned int flags = 0) :\n        text_woarchive_impl<text_woarchive>(os, flags)\n    {\n        if(0 == (flags & no_header))\n            init();\n    }\n    ~text_woarchive() BOOST_OVERRIDE {}\n};\n\n} // namespace archive\n} // namespace boost\n\n// required by export\nBOOST_SERIALIZATION_REGISTER_ARCHIVE(boost::archive::text_woarchive)\n\n#ifdef BOOST_MSVC\n#pragma warning(pop)\n#endif\n\n#include <boost/archive/detail/abi_suffix.hpp> // pops abi_suffix.hpp pragmas\n\n#endif // BOOST_NO_STD_WSTREAMBUF\n#endif // BOOST_ARCHIVE_TEXT_WOARCHIVE_HPP\n"
  },
  {
    "path": "include/boost/archive/tmpdir.hpp",
    "content": "#ifndef BOOST_ARCHIVE_TMPDIR_HPP\n#define BOOST_ARCHIVE_TMPDIR_HPP\n\n// MS compatible compilers support #pragma once\n#if defined(_MSC_VER)\n# pragma once\n#endif\n\n/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// tmpdir.hpp:\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for updates, documentation, and revision history.\n\n#include <cstdlib> // getenv\n#include <cstddef> // NULL\n\n#include <boost/config.hpp>\n#ifdef BOOST_NO_STDC_NAMESPACE\nnamespace std {\n    using ::getenv;\n}\n#endif\n\nnamespace boost {\nnamespace archive {\n\ninline const char * tmpdir(){\n    const char *dirname;\n    dirname = std::getenv(\"TMP\");\n    if(NULL == dirname)\n        dirname = std::getenv(\"TMPDIR\");\n    if(NULL == dirname)\n        dirname = std::getenv(\"TEMP\");\n    if(NULL == dirname){\n        //BOOST_ASSERT(false); // no temp directory found\n        dirname = \".\";\n    }\n    return dirname;\n}\n\n} // archive\n} // boost\n\n#endif // BOOST_ARCHIVE_TMPDIR_HPP\n"
  },
  {
    "path": "include/boost/archive/wcslen.hpp",
    "content": "#ifndef BOOST_ARCHIVE_WCSLEN_HPP\n#define BOOST_ARCHIVE_WCSLEN_HPP\n\n// MS compatible compilers support #pragma once\n#if defined(_MSC_VER)\n# pragma once\n#endif\n\n/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// wcslen.hpp:\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for updates, documentation, and revision history.\n\n#include <cstddef> // size_t\n#include <boost/config.hpp>\n#if defined(BOOST_NO_STDC_NAMESPACE)\nnamespace std{\n    using ::size_t;\n} // namespace std\n#endif\n\n#ifndef BOOST_NO_CWCHAR\n\n// a couple of libraries which include wchar_t don't include\n// wcslen\n\n#if defined(BOOST_DINKUMWARE_STDLIB) && BOOST_DINKUMWARE_STDLIB < 306 \\\n|| defined(__LIBCOMO__)\n\nnamespace std {\ninline std::size_t wcslen(const wchar_t * ws)\n{\n    const wchar_t * eows = ws;\n    while(* eows != 0)\n        ++eows;\n    return eows - ws;\n}\n} // namespace std\n\n#else\n\n#ifndef BOOST_NO_CWCHAR\n#include <cwchar>\n#endif\n#ifdef BOOST_NO_STDC_NAMESPACE\nnamespace std{ using ::wcslen; }\n#endif\n\n#endif // wcslen\n\n#endif //BOOST_NO_CWCHAR\n\n#endif //BOOST_ARCHIVE_WCSLEN_HPP\n"
  },
  {
    "path": "include/boost/archive/xml_archive_exception.hpp",
    "content": "#ifndef BOOST_ARCHIVE_XML_ARCHIVE_EXCEPTION_HPP\n#define BOOST_ARCHIVE_XML_ARCHIVE_EXCEPTION_HPP\n\n// MS compatible compilers support #pragma once\n#if defined(_MSC_VER)\n# pragma once\n#endif\n\n/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// xml_archive_exception.hpp:\n\n// (C) Copyright 2007 Robert Ramey - http://www.rrsd.com .\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for updates, documentation, and revision history.\n\n#include <exception>\n#include <boost/assert.hpp>\n\n#include <boost/config.hpp>\n#include <boost/archive/detail/decl.hpp>\n#include <boost/archive/archive_exception.hpp>\n\n#include <boost/archive/detail/abi_prefix.hpp> // must be the last header\n\nnamespace boost {\nnamespace archive {\n\n//////////////////////////////////////////////////////////////////////\n// exceptions thrown by xml archives\n//\nclass BOOST_SYMBOL_VISIBLE xml_archive_exception :\n    public virtual boost::archive::archive_exception\n{\npublic:\n    typedef enum {\n        xml_archive_parsing_error,    // see save_register\n        xml_archive_tag_mismatch,\n        xml_archive_tag_name_error\n    } exception_code;\n    BOOST_ARCHIVE_DECL xml_archive_exception(\n        exception_code c,\n        const char * e1 = NULL,\n        const char * e2 = NULL\n    );\n    BOOST_ARCHIVE_DECL xml_archive_exception(xml_archive_exception const &);\n    BOOST_ARCHIVE_DECL ~xml_archive_exception() BOOST_NOEXCEPT_OR_NOTHROW BOOST_OVERRIDE;\n};\n\n}// namespace archive\n}// namespace boost\n\n#include <boost/archive/detail/abi_suffix.hpp> // pops abi_suffix.hpp pragmas\n\n#endif //BOOST_XML_ARCHIVE_ARCHIVE_EXCEPTION_HPP\n"
  },
  {
    "path": "include/boost/archive/xml_iarchive.hpp",
    "content": "#ifndef BOOST_ARCHIVE_XML_IARCHIVE_HPP\n#define BOOST_ARCHIVE_XML_IARCHIVE_HPP\n\n// MS compatible compilers support #pragma once\n#if defined(_MSC_VER)\n# pragma once\n#endif\n\n/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// xml_iarchive.hpp\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for updates, documentation, and revision history.\n\n#include <istream>\n\n#include <boost/scoped_ptr.hpp>\n#include <boost/archive/detail/auto_link_archive.hpp>\n#include <boost/archive/basic_text_iprimitive.hpp>\n#include <boost/archive/basic_xml_iarchive.hpp>\n#include <boost/archive/detail/register_archive.hpp>\n#include <boost/serialization/item_version_type.hpp>\n\n#include <boost/archive/detail/abi_prefix.hpp> // must be the last header\n\n#ifdef BOOST_MSVC\n#  pragma warning(push)\n#  pragma warning(disable : 4511 4512)\n#endif\n\nnamespace boost {\nnamespace archive {\n\nnamespace detail {\n    template<class Archive> class interface_iarchive;\n} // namespace detail\n\ntemplate<class CharType>\nclass basic_xml_grammar;\ntypedef basic_xml_grammar<char> xml_grammar;\n\ntemplate<class Archive>\nclass BOOST_SYMBOL_VISIBLE xml_iarchive_impl :\n    public basic_text_iprimitive<std::istream>,\n    public basic_xml_iarchive<Archive>\n{\n#ifdef BOOST_NO_MEMBER_TEMPLATE_FRIENDS\npublic:\n#else\nprotected:\n    friend class detail::interface_iarchive<Archive>;\n    friend class basic_xml_iarchive<Archive>;\n    friend class load_access;\n#endif\n    // use boost:scoped_ptr to implement automatic deletion;\n    boost::scoped_ptr<xml_grammar> gimpl;\n\n    std::istream & get_is(){\n        return is;\n    }\n    template<class T>\n    void load(T & t){\n        basic_text_iprimitive<std::istream>::load(t);\n    }\n    void\n    load(version_type & t){\n        unsigned int v;\n        load(v);\n        t = version_type(v);\n    }\n    void\n    load(boost::serialization::item_version_type & t){\n        unsigned int v;\n        load(v);\n        t = boost::serialization::item_version_type(v);\n    }\n    BOOST_ARCHIVE_DECL void\n    load(char * t);\n    #ifndef BOOST_NO_INTRINSIC_WCHAR_T\n    BOOST_ARCHIVE_DECL void\n    load(wchar_t * t);\n    #endif\n    BOOST_ARCHIVE_DECL void\n    load(std::string &s);\n    #ifndef BOOST_NO_STD_WSTRING\n    BOOST_ARCHIVE_DECL void\n    load(std::wstring &ws);\n    #endif\n    template<class T>\n    void load_override(T & t){\n        basic_xml_iarchive<Archive>::load_override(t);\n    }\n    BOOST_ARCHIVE_DECL void\n    load_override(class_name_type & t);\n    BOOST_ARCHIVE_DECL void\n    init();\n    BOOST_ARCHIVE_DECL\n    xml_iarchive_impl(std::istream & is, unsigned int flags);\n    BOOST_ARCHIVE_DECL\n    ~xml_iarchive_impl() BOOST_OVERRIDE;\n};\n\n} // namespace archive\n} // namespace boost\n\n#ifdef BOOST_MSVC\n#pragma warning(pop)\n#endif\n\n#include <boost/archive/detail/abi_suffix.hpp> // pops abi_suffix.hpp pragmas\n#ifdef BOOST_MSVC\n#  pragma warning(push)\n#  pragma warning(disable : 4511 4512)\n#endif\n\nnamespace boost {\nnamespace archive {\n\nclass BOOST_SYMBOL_VISIBLE xml_iarchive :\n    public xml_iarchive_impl<xml_iarchive>{\npublic:\n    xml_iarchive(std::istream & is, unsigned int flags = 0) :\n        xml_iarchive_impl<xml_iarchive>(is, flags)\n    {\n        if(0 == (flags & no_header))\n            init();\n    }\n    ~xml_iarchive() BOOST_OVERRIDE {}\n};\n\n} // namespace archive\n} // namespace boost\n\n// required by export\nBOOST_SERIALIZATION_REGISTER_ARCHIVE(boost::archive::xml_iarchive)\n\n#ifdef BOOST_MSVC\n#pragma warning(pop)\n#endif\n\n#endif // BOOST_ARCHIVE_XML_IARCHIVE_HPP\n"
  },
  {
    "path": "include/boost/archive/xml_oarchive.hpp",
    "content": "#ifndef BOOST_ARCHIVE_XML_OARCHIVE_HPP\n#define BOOST_ARCHIVE_XML_OARCHIVE_HPP\n\n// MS compatible compilers support #pragma once\n#if defined(_MSC_VER)\n# pragma once\n#endif\n\n/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// xml_oarchive.hpp\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for updates, documentation, and revision history.\n\n#include <ostream>\n\n#include <cstddef> // size_t\n#include <boost/config.hpp>\n#if defined(BOOST_NO_STDC_NAMESPACE)\nnamespace std{\n    using ::size_t;\n} // namespace std\n#endif\n\n#include <boost/archive/detail/auto_link_archive.hpp>\n#include <boost/archive/basic_text_oprimitive.hpp>\n#include <boost/archive/basic_xml_oarchive.hpp>\n#include <boost/archive/detail/register_archive.hpp>\n#include <boost/serialization/item_version_type.hpp>\n\n#include <boost/archive/detail/abi_prefix.hpp> // must be the last header\n\n#ifdef BOOST_MSVC\n#  pragma warning(push)\n#  pragma warning(disable : 4511 4512)\n#endif\n\nnamespace boost {\nnamespace archive {\n\nnamespace detail {\n    template<class Archive> class interface_oarchive;\n} // namespace detail\n\ntemplate<class Archive>\nclass BOOST_SYMBOL_VISIBLE xml_oarchive_impl :\n    public basic_text_oprimitive<std::ostream>,\n    public basic_xml_oarchive<Archive>\n{\n#ifdef BOOST_NO_MEMBER_TEMPLATE_FRIENDS\npublic:\n#else\nprotected:\n    friend class detail::interface_oarchive<Archive>;\n    friend class basic_xml_oarchive<Archive>;\n    friend class save_access;\n#endif\n    template<class T>\n    void save(const T & t){\n        basic_text_oprimitive<std::ostream>::save(t);\n    }\n    void\n    save(const version_type & t){\n        save(static_cast<unsigned int>(t));\n    }\n    void\n    save(const boost::serialization::item_version_type & t){\n        save(static_cast<unsigned int>(t));\n    }\n    BOOST_ARCHIVE_DECL void\n    save(const char * t);\n    #ifndef BOOST_NO_INTRINSIC_WCHAR_T\n    BOOST_ARCHIVE_DECL void\n    save(const wchar_t * t);\n    #endif\n    BOOST_ARCHIVE_DECL void\n    save(const std::string &s);\n    #ifndef BOOST_NO_STD_WSTRING\n    BOOST_ARCHIVE_DECL void\n    save(const std::wstring &ws);\n    #endif\n    BOOST_ARCHIVE_DECL\n    xml_oarchive_impl(std::ostream & os, unsigned int flags);\n    BOOST_ARCHIVE_DECL\n    ~xml_oarchive_impl() BOOST_OVERRIDE;\npublic:\n    BOOST_ARCHIVE_DECL\n    void save_binary(const void *address, std::size_t count);\n};\n\n} // namespace archive\n} // namespace boost\n\n#ifdef BOOST_MSVC\n#pragma warning(pop)\n#endif\n\n#include <boost/archive/detail/abi_suffix.hpp> // pops abi_suffix.hpp pragmas\n#ifdef BOOST_MSVC\n#  pragma warning(push)\n#  pragma warning(disable : 4511 4512)\n#endif\n\nnamespace boost {\nnamespace archive {\n\n// we use the following because we can't use\n// typedef xml_oarchive_impl<xml_oarchive_impl<...> > xml_oarchive;\n\n// do not derive from this class.  If you want to extend this functionality\n// via inheritance, derived from xml_oarchive_impl instead.  This will\n// preserve correct static polymorphism.\nclass BOOST_SYMBOL_VISIBLE xml_oarchive :\n    public xml_oarchive_impl<xml_oarchive>\n{\npublic:\n    xml_oarchive(std::ostream & os, unsigned int flags = 0) :\n        xml_oarchive_impl<xml_oarchive>(os, flags)\n    {\n        if(0 == (flags & no_header))\n            init();\n    }\n    ~xml_oarchive() BOOST_OVERRIDE {}\n};\n\n} // namespace archive\n} // namespace boost\n\n// required by export\nBOOST_SERIALIZATION_REGISTER_ARCHIVE(boost::archive::xml_oarchive)\n\n#ifdef BOOST_MSVC\n#pragma warning(pop)\n#endif\n\n#endif // BOOST_ARCHIVE_XML_OARCHIVE_HPP\n"
  },
  {
    "path": "include/boost/archive/xml_wiarchive.hpp",
    "content": "#ifndef BOOST_ARCHIVE_XML_WIARCHIVE_HPP\n#define BOOST_ARCHIVE_XML_WIARCHIVE_HPP\n\n// MS compatible compilers support #pragma once\n#if defined(_MSC_VER)\n# pragma once\n#endif\n\n/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// xml_wiarchive.hpp\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for updates, documentation, and revision history.\n\n#include <boost/config.hpp>\n#ifdef BOOST_NO_STD_WSTREAMBUF\n#error \"wide char i/o not supported on this platform\"\n#else\n\n#include <istream>\n\n#include <boost/smart_ptr/scoped_ptr.hpp>\n#include <boost/archive/detail/auto_link_warchive.hpp>\n#include <boost/archive/basic_text_iprimitive.hpp>\n#include <boost/archive/basic_xml_iarchive.hpp>\n#include <boost/archive/detail/register_archive.hpp>\n#include <boost/serialization/item_version_type.hpp>\n\n#include <boost/archive/detail/abi_prefix.hpp> // must be the last header\n\n#ifdef BOOST_MSVC\n#  pragma warning(push)\n#  pragma warning(disable : 4511 4512)\n#endif\n\nnamespace boost {\nnamespace archive {\n\nnamespace detail {\n    template<class Archive> class interface_iarchive;\n} // namespace detail\n\ntemplate<class CharType>\nclass basic_xml_grammar;\ntypedef basic_xml_grammar<wchar_t> xml_wgrammar;\n\ntemplate<class Archive>\nclass BOOST_SYMBOL_VISIBLE xml_wiarchive_impl :\n    public basic_text_iprimitive<std::wistream>,\n    public basic_xml_iarchive<Archive>\n{\n#ifdef BOOST_NO_MEMBER_TEMPLATE_FRIENDS\npublic:\n#else\nprotected:\n    friend class detail::interface_iarchive<Archive>;\n    friend class basic_xml_iarchive<Archive>;\n    friend class load_access;\n#endif\n    std::locale archive_locale;\n    boost::scoped_ptr<xml_wgrammar> gimpl;\n    std::wistream & get_is(){\n        return is;\n    }\n    template<class T>\n    void\n    load(T & t){\n        basic_text_iprimitive<std::wistream>::load(t);\n    }\n    void\n    load(version_type & t){\n        unsigned int v;\n        load(v);\n        t = version_type(v);\n    }\n    void\n    load(boost::serialization::item_version_type & t){\n        unsigned int v;\n        load(v);\n        t = boost::serialization::item_version_type(v);\n    }\n    BOOST_WARCHIVE_DECL void\n    load(char * t);\n    #ifndef BOOST_NO_INTRINSIC_WCHAR_T\n    BOOST_WARCHIVE_DECL void\n    load(wchar_t * t);\n    #endif\n    BOOST_WARCHIVE_DECL void\n    load(std::string &s);\n    #ifndef BOOST_NO_STD_WSTRING\n    BOOST_WARCHIVE_DECL void\n    load(std::wstring &ws);\n    #endif\n    template<class T>\n    void load_override(T & t){\n        basic_xml_iarchive<Archive>::load_override(t);\n    }\n    BOOST_WARCHIVE_DECL void\n    load_override(class_name_type & t);\n    BOOST_WARCHIVE_DECL void\n    init();\n    BOOST_WARCHIVE_DECL\n    xml_wiarchive_impl(std::wistream & is, unsigned int flags);\n    BOOST_WARCHIVE_DECL\n    ~xml_wiarchive_impl() BOOST_OVERRIDE;\n};\n\n} // namespace archive\n} // namespace boost\n\n#ifdef BOOST_MSVC\n#  pragma warning(pop)\n#endif\n\n#include <boost/archive/detail/abi_suffix.hpp> // pops abi_suffix.hpp pragmas\n\n#ifdef BOOST_MSVC\n#  pragma warning(push)\n#  pragma warning(disable : 4511 4512)\n#endif\n\nnamespace boost {\nnamespace archive {\n\nclass BOOST_SYMBOL_VISIBLE xml_wiarchive :\n    public xml_wiarchive_impl<xml_wiarchive>{\npublic:\n    xml_wiarchive(std::wistream & is, unsigned int flags = 0) :\n        xml_wiarchive_impl<xml_wiarchive>(is, flags)\n    {\n    if(0 == (flags & no_header))\n        init();\n    }\n    ~xml_wiarchive() BOOST_OVERRIDE {}\n};\n\n} // namespace archive\n} // namespace boost\n\n// required by export\nBOOST_SERIALIZATION_REGISTER_ARCHIVE(boost::archive::xml_wiarchive)\n\n#ifdef BOOST_MSVC\n#pragma warning(pop)\n#endif\n\n#endif // BOOST_NO_STD_WSTREAMBUF\n#endif // BOOST_ARCHIVE_XML_WIARCHIVE_HPP\n"
  },
  {
    "path": "include/boost/archive/xml_woarchive.hpp",
    "content": "#ifndef BOOST_ARCHIVE_XML_WOARCHIVE_HPP\n#define BOOST_ARCHIVE_XML_WOARCHIVE_HPP\n\n// MS compatible compilers support #pragma once\n#if defined(_MSC_VER)\n# pragma once\n#endif\n\n/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// xml_woarchive.hpp\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for updates, documentation, and revision history.\n\n#include <boost/config.hpp>\n#ifdef BOOST_NO_STD_WSTREAMBUF\n#error \"wide char i/o not supported on this platform\"\n#else\n#include <cstddef> // size_t\n#if defined(BOOST_NO_STDC_NAMESPACE)\nnamespace std{\n    using ::size_t;\n} // namespace std\n#endif\n\n#include <ostream>\n\n#include <boost/archive/detail/auto_link_warchive.hpp>\n#include <boost/archive/basic_text_oprimitive.hpp>\n#include <boost/archive/basic_xml_oarchive.hpp>\n#include <boost/archive/detail/register_archive.hpp>\n#include <boost/serialization/item_version_type.hpp>\n\n#include <boost/archive/detail/abi_prefix.hpp> // must be the last header\n\n#ifdef BOOST_MSVC\n#  pragma warning(push)\n#  pragma warning(disable : 4511 4512)\n#endif\n\nnamespace boost {\nnamespace archive {\n\nnamespace detail {\n    template<class Archive> class interface_oarchive;\n} // namespace detail\n\ntemplate<class Archive>\nclass BOOST_SYMBOL_VISIBLE xml_woarchive_impl :\n    public basic_text_oprimitive<std::wostream>,\n    public basic_xml_oarchive<Archive>\n{\n#ifdef BOOST_NO_MEMBER_TEMPLATE_FRIENDS\npublic:\n#else\nprotected:\n    friend class detail::interface_oarchive<Archive>;\n    friend class basic_xml_oarchive<Archive>;\n    friend class save_access;\n#endif\n    //void end_preamble(){\n    //    basic_xml_oarchive<Archive>::end_preamble();\n    //}\n    template<class T>\n    void\n    save(const T & t){\n        basic_text_oprimitive<std::wostream>::save(t);\n    }\n    void\n    save(const version_type & t){\n        save(static_cast<unsigned int>(t));\n    }\n    void\n    save(const boost::serialization::item_version_type & t){\n        save(static_cast<unsigned int>(t));\n    }\n    BOOST_WARCHIVE_DECL void\n    save(const char * t);\n    #ifndef BOOST_NO_INTRINSIC_WCHAR_T\n    BOOST_WARCHIVE_DECL void\n    save(const wchar_t * t);\n    #endif\n    BOOST_WARCHIVE_DECL void\n    save(const std::string &s);\n    #ifndef BOOST_NO_STD_WSTRING\n    BOOST_WARCHIVE_DECL void\n    save(const std::wstring &ws);\n    #endif\n    BOOST_WARCHIVE_DECL\n    xml_woarchive_impl(std::wostream & os, unsigned int flags);\n    BOOST_WARCHIVE_DECL\n    ~xml_woarchive_impl() BOOST_OVERRIDE;\npublic:\n    BOOST_WARCHIVE_DECL void\n    save_binary(const void *address, std::size_t count);\n\n};\n\n// we use the following because we can't use\n// typedef xml_woarchive_impl<xml_woarchive_impl<...> > xml_woarchive;\n\n// do not derive from this class.  If you want to extend this functionality\n// via inheritance, derived from xml_woarchive_impl instead.  This will\n// preserve correct static polymorphism.\nclass BOOST_SYMBOL_VISIBLE xml_woarchive :\n    public xml_woarchive_impl<xml_woarchive>\n{\npublic:\n    xml_woarchive(std::wostream & os, unsigned int flags = 0) :\n        xml_woarchive_impl<xml_woarchive>(os, flags)\n    {\n    if(0 == (flags & no_header))\n        init();\n    }\n    ~xml_woarchive() BOOST_OVERRIDE {}\n};\n\n} // namespace archive\n} // namespace boost\n\n// required by export\nBOOST_SERIALIZATION_REGISTER_ARCHIVE(boost::archive::xml_woarchive)\n\n#ifdef BOOST_MSVC\n#pragma warning(pop)\n#endif\n\n#include <boost/archive/detail/abi_suffix.hpp> // pops abi_suffix.hpp pragmas\n\n#endif // BOOST_NO_STD_WSTREAMBUF\n#endif // BOOST_ARCHIVE_XML_OARCHIVE_HPP\n"
  },
  {
    "path": "include/boost/serialization/access.hpp",
    "content": "#ifndef BOOST_SERIALIZATION_ACCESS_HPP\n#define BOOST_SERIALIZATION_ACCESS_HPP\n\n// MS compatible compilers support #pragma once\n#if defined(_MSC_VER)\n# pragma once\n#endif\n\n/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// access.hpp: interface for serialization system.\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for updates, documentation, and revision history.\n\n#include <boost/config.hpp>\n\nnamespace boost {\n\nnamespace archive {\nnamespace detail {\n    template<class Archive, class T>\n    class iserializer;\n    template<class Archive, class T>\n    class oserializer;\n} // namespace detail\n} // namespace archive\n\nnamespace serialization {\n\n// forward declarations\ntemplate<class Archive, class T>\ninline void serialize_adl(Archive &, T &, const unsigned int);\nnamespace detail {\n    template<class Archive, class T>\n    struct member_saver;\n    template<class Archive, class T>\n    struct member_loader;\n} // namespace detail\n\n// use an \"accessor class so that we can use:\n// \"friend class boost::serialization::access;\"\n// in any serialized class to permit clean, safe access to private class members\n// by the serialization system\n\nclass access {\npublic:\n    // grant access to \"real\" serialization defaults\n#ifdef BOOST_NO_MEMBER_TEMPLATE_FRIENDS\npublic:\n#else\n    template<class Archive, class T>\n    friend struct detail::member_saver;\n    template<class Archive, class T>\n    friend struct detail::member_loader;\n    template<class Archive, class T>\n    friend class archive::detail::iserializer;\n    template<class Archive, class T>\n    friend class archive::detail::oserializer;\n    template<class Archive, class T>\n    friend inline void serialize(\n        Archive & ar,\n        T & t,\n        const unsigned int file_version\n    );\n    template<class Archive, class T>\n    friend inline void save_construct_data(\n        Archive & ar,\n        const T * t,\n        const unsigned int file_version\n    );\n    template<class Archive, class T>\n    friend inline void load_construct_data(\n        Archive & ar,\n        T * t,\n        const unsigned int file_version\n    );\n#endif\n\n    // pass calls to users's class implementation\n    template<class Archive, class T>\n    static void member_save(\n        Archive & ar,\n        //const T & t,\n        T & t,\n        const unsigned int file_version\n    ){\n        t.save(ar, file_version);\n    }\n    template<class Archive, class T>\n    static void member_load(\n        Archive & ar,\n        T & t,\n        const unsigned int file_version\n    ){\n        t.load(ar, file_version);\n    }\n    template<class Archive, class T>\n    static void serialize(\n        Archive & ar,\n        T & t,\n        const unsigned int file_version\n    ){\n        // note: if you get a compile time error here with a\n        // message something like:\n        // cannot convert parameter 1 from <file type 1> to <file type 2 &>\n        // a likely possible cause is that the class T contains a\n        // serialize function - but that serialize function isn't\n        // a template and corresponds to a file type different than\n        // the class Archive.  To resolve this, don't include an\n        // archive type other than that for which the serialization\n        // function is defined!!!\n        t.serialize(ar, file_version);\n    }\n    template<class T>\n    static void destroy( const T * t) // const appropriate here?\n    {\n        // the const business is an MSVC 6.0 hack that should be\n        // benign on everything else\n        delete const_cast<T *>(t);\n    }\n    template<class T>\n    static void construct(T * t){\n        // default is inplace invocation of default constructor\n        // Note the :: before the placement new. Required if the\n        // class doesn't have a class-specific placement new defined.\n        ::new(t)T;\n    }\n    template<class T, class U>\n    static T & cast_reference(U & u){\n        return static_cast<T &>(u);\n    }\n    template<class T, class U>\n    static T * cast_pointer(U * u){\n        return static_cast<T *>(u);\n    }\n};\n\n} // namespace serialization\n} // namespace boost\n\n#endif // BOOST_SERIALIZATION_ACCESS_HPP\n"
  },
  {
    "path": "include/boost/serialization/archive_input_unordered_map.hpp",
    "content": "#ifndef  BOOST_SERIALIZATION_ARCHIVE_INPUT_UNORDERED_MAP_HPP\n#define BOOST_SERIALIZATION_ARCHIVE_INPUT_UNORDERED_MAP_HPP\n\n// MS compatible compilers support #pragma once\n#if defined(_MSC_VER) && (_MSC_VER >= 1020)\n# pragma once\n#endif\n\n/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// serialization/unordered_map.hpp:\n// serialization for stl unordered_map templates\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .\n// (C) Copyright 2014 Jim Bell\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for updates, documentation, and revision history.\n\n#include <boost/config.hpp>\n#include <boost/serialization/nvp.hpp>\n#include <boost/serialization/detail/stack_constructor.hpp>\n#include <boost/serialization/utility.hpp>\n#include <boost/move/utility_core.hpp>\n\nnamespace boost {\nnamespace serialization {\nnamespace stl {\n\n// map input\ntemplate<class Archive, class Container>\nstruct archive_input_unordered_map\n{\n    inline void operator()(\n        Archive &ar,\n        Container &s,\n        const unsigned int v\n    ){\n        typedef typename Container::value_type type;\n        detail::stack_construct<Archive, type> t(ar, v);\n        ar >> boost::serialization::make_nvp(\"item\", t.reference());\n        std::pair<typename Container::const_iterator, bool> result =\n            s.insert(boost::move(t.reference()));\n        // note: the following presumes that the map::value_type was NOT tracked\n        // in the archive.  This is the usual case, but here there is no way\n        // to determine that.\n        if(result.second){\n            ar.reset_object_address(\n                & (result.first->second),\n                & t.reference().second\n            );\n        }\n    }\n};\n\n// multimap input\ntemplate<class Archive, class Container>\nstruct archive_input_unordered_multimap\n{\n    inline void operator()(\n        Archive &ar,\n        Container &s,\n        const unsigned int v\n    ){\n        typedef typename Container::value_type type;\n        detail::stack_construct<Archive, type> t(ar, v);\n        ar >> boost::serialization::make_nvp(\"item\", t.reference());\n        typename Container::const_iterator result =\n            s.insert(t.reference());\n        // note: the following presumes that the map::value_type was NOT tracked\n        // in the archive.  This is the usual case, but here there is no way\n        // to determine that.\n        ar.reset_object_address(\n            & result->second,\n            & t.reference()\n        );\n    }\n};\n\n} // stl\n} // namespace serialization\n} // namespace boost\n\n#endif // BOOST_SERIALIZATION_ARCHIVE_INPUT_UNORDERED_MAP_HPP\n"
  },
  {
    "path": "include/boost/serialization/archive_input_unordered_set.hpp",
    "content": "#ifndef  BOOST_SERIALIZATION_ARCHIVE_INPUT_UNORDERED_SET_HPP\n#define BOOST_SERIALIZATION_ARCHIVE_INPUT_UNORDERED_SET_HPP\n\n// MS compatible compilers support #pragma once\n#if defined(_MSC_VER) && (_MSC_VER >= 1020)\n# pragma once\n#endif\n\n/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// archive_input_unordered_set.hpp\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .\n// (C) Copyright 2014 Jim Bell\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for updates, documentation, and revision history.\n\n#include <utility>\n#include <boost/serialization/nvp.hpp>\n#include <boost/serialization/detail/stack_constructor.hpp>\n#include <boost/move/utility_core.hpp>\n\nnamespace boost {\nnamespace serialization {\n\nnamespace stl {\n\n// unordered_set input\ntemplate<class Archive, class Container>\nstruct archive_input_unordered_set\n{\n    inline void operator()(\n        Archive &ar,\n        Container &s,\n        const unsigned int v\n    ){\n        typedef typename Container::value_type type;\n        detail::stack_construct<Archive, type> t(ar, v);\n        // borland fails silently w/o full namespace\n        ar >> boost::serialization::make_nvp(\"item\", t.reference());\n        std::pair<typename Container::const_iterator, bool> result =\n            s.insert(boost::move(t.reference()));\n        if(result.second)\n            ar.reset_object_address(& (* result.first), & t.reference());\n    }\n};\n\n// unordered_multiset input\ntemplate<class Archive, class Container>\nstruct archive_input_unordered_multiset\n{\n    inline void operator()(\n        Archive &ar,\n        Container &s,\n        const unsigned int v\n    ){\n        typedef typename Container::value_type type;\n        detail::stack_construct<Archive, type> t(ar, v);\n        ar >> boost::serialization::make_nvp(\"item\", t.reference());\n        typename Container::const_iterator result =\n            s.insert(boost::move(t.reference()));\n        ar.reset_object_address(& (* result), & t.reference());\n    }\n};\n\n} // stl\n} // serialization\n} // boost\n\n#endif // BOOST_SERIALIZATION_ARCHIVE_INPUT_UNORDERED_SET_HPP\n"
  },
  {
    "path": "include/boost/serialization/array.hpp",
    "content": "#ifndef BOOST_SERIALIZATION_ARRAY_HPP\n#define BOOST_SERIALIZATION_ARRAY_HPP\n\n// (C) Copyright 2005 Matthias Troyer and Dave Abrahams\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n// for serialization of <array>. If <array> not supported by the standard\n// library - this file becomes empty.  This is to avoid breaking backward\n// compatibility for applications which used this header to support\n// serialization of native arrays.  Code to serialize native arrays is\n// now always include by default.  RR\n\n#include <boost/config.hpp> // msvc 6.0 needs this for warning suppression\n\n#if defined(BOOST_NO_STDC_NAMESPACE)\n\n#include <iostream>\n#include <cstddef> // std::size_t\nnamespace std{\n    using ::size_t;\n} // namespace std\n#endif\n\n#include <boost/serialization/array_wrapper.hpp>\n\n#ifndef BOOST_NO_CXX11_HDR_ARRAY\n\n#include <array>\n#include <boost/serialization/nvp.hpp>\n\nnamespace boost { namespace serialization {\n\ntemplate <class Archive, class T, std::size_t N>\nvoid serialize(Archive& ar, std::array<T,N>& a, const unsigned int /* version */)\n{\n    ar & boost::serialization::make_nvp(\n        \"elems\",\n        *static_cast<T (*)[N]>(static_cast<void *>(a.data()))\n    );\n\n}\n} } // end namespace boost::serialization\n\n#endif // BOOST_NO_CXX11_HDR_ARRAY\n\n#endif //BOOST_SERIALIZATION_ARRAY_HPP\n"
  },
  {
    "path": "include/boost/serialization/array_optimization.hpp",
    "content": "#ifndef BOOST_SERIALIZATION_ARRAY_OPTIMIZATION_HPP\n#define BOOST_SERIALIZATION_ARRAY_OPTIMIZATION_HPP\n\n// (C) Copyright 2005 Matthias Troyer and Dave Abrahams\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n#include <boost/config.hpp> // msvc 6.0 needs this for warning suppression\n\n#if defined(BOOST_NO_STDC_NAMESPACE)\nnamespace std{\n    using ::size_t;\n} // namespace std\n#endif\n\n#include <boost/mpl/always.hpp>\n#include <boost/mpl/apply.hpp>\n#include <boost/type_traits/remove_const.hpp>\n\nnamespace boost { namespace serialization {\n\ntemplate <class Archive>\nstruct use_array_optimization : boost::mpl::always<boost::mpl::false_> {};\n\n} } // end namespace boost::serialization\n\n#define BOOST_SERIALIZATION_USE_ARRAY_OPTIMIZATION(Archive)           \\\nnamespace boost { namespace serialization {                           \\\ntemplate <> struct use_array_optimization<Archive> {                  \\\n  template <class ValueType>                                          \\\n  struct apply : boost::mpl::apply1<Archive::use_array_optimization   \\\n      , typename boost::remove_const<ValueType>::type                 \\\n    >::type {};                                                       \\\n}; }}\n\n#endif //BOOST_SERIALIZATION_ARRAY_OPTIMIZATION_HPP\n"
  },
  {
    "path": "include/boost/serialization/array_wrapper.hpp",
    "content": "#ifndef BOOST_SERIALIZATION_ARRAY_WRAPPER_HPP\n#define BOOST_SERIALIZATION_ARRAY_WRAPPER_HPP\n\n// (C) Copyright 2005 Matthias Troyer and Dave Abrahams\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n#include <boost/config.hpp> // msvc 6.0 needs this for warning suppression\n\n#if defined(BOOST_NO_STDC_NAMESPACE)\nnamespace std{\n    using ::size_t;\n} // namespace std\n#endif\n\n#include <boost/serialization/nvp.hpp>\n#include <boost/serialization/split_member.hpp>\n#include <boost/serialization/wrapper.hpp>\n#include <boost/serialization/collection_size_type.hpp>\n#include <boost/serialization/array_optimization.hpp>\n#include <boost/mpl/always.hpp>\n#include <boost/mpl/apply.hpp>\n#include <boost/mpl/bool_fwd.hpp>\n#include <boost/type_traits/remove_const.hpp>\n\nnamespace boost { namespace serialization {\n\ntemplate<class T>\nclass array_wrapper :\n    public wrapper_traits<const array_wrapper< T > >\n{\nprivate:\n    array_wrapper & operator=(const array_wrapper & rhs);\n    // note: I would like to make the copy constructor private but this breaks\n    // make_array.  So I make make_array a friend\n    template<class Tx, class S>\n    friend const boost::serialization::array_wrapper<Tx> make_array(Tx * t, S s);\npublic:\n\n    array_wrapper(const array_wrapper & rhs) :\n        m_t(rhs.m_t),\n        m_element_count(rhs.m_element_count)\n    {}\npublic:\n    array_wrapper(T * t, std::size_t s) :\n        m_t(t),\n        m_element_count(s)\n    {}\n\n    // default implementation\n    template<class Archive>\n    void serialize_optimized(Archive &ar, const unsigned int, mpl::false_ ) const\n    {\n      // default implementation does the loop\n      std::size_t c = count();\n      T * t = address();\n      while(0 < c--)\n            ar & boost::serialization::make_nvp(\"item\", *t++);\n    }\n\n    // optimized implementation\n    template<class Archive>\n    void serialize_optimized(Archive &ar, const unsigned int version, mpl::true_ )\n    {\n      boost::serialization::split_member(ar, *this, version);\n    }\n\n    // default implementation\n    template<class Archive>\n    void save(Archive &ar, const unsigned int version) const\n    {\n      ar.save_array(*this,version);\n    }\n\n    // default implementation\n    template<class Archive>\n    void load(Archive &ar, const unsigned int version)\n    {\n      ar.load_array(*this,version);\n    }\n\n    // default implementation\n    template<class Archive>\n    void serialize(Archive &ar, const unsigned int version)\n    {\n      typedef typename\n          boost::serialization::use_array_optimization<Archive>::template apply<\n                    typename remove_const< T >::type\n                >::type use_optimized;\n      serialize_optimized(ar,version,use_optimized());\n    }\n\n    T * address() const\n    {\n      return m_t;\n    }\n\n    std::size_t count() const\n    {\n      return m_element_count;\n    }\n\nprivate:\n    T * const m_t;\n    const std::size_t m_element_count;\n};\n\ntemplate<class T, class S>\ninline\nconst array_wrapper< T > make_array(T* t, S s){\n    const array_wrapper< T > a(t, s);\n    return a;\n}\n\n} } // end namespace boost::serialization\n\n\n#endif //BOOST_SERIALIZATION_ARRAY_WRAPPER_HPP\n"
  },
  {
    "path": "include/boost/serialization/assume_abstract.hpp",
    "content": "#ifndef BOOST_SERIALIZATION_ASSUME_ABSTRACT_HPP\n#define BOOST_SERIALIZATION_ASSUME_ABSTRACT_HPP\n\n// MS compatible compilers support #pragma once\n#if defined(_MSC_VER)\n# pragma once\n#endif\n\n/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// assume_abstract_class.hpp:\n\n// (C) Copyright 2008 Robert Ramey\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for updates, documentation, and revision history.\n\n// this is useful for compilers which don't support the boost::is_abstract\n\n#include <boost/type_traits/is_abstract.hpp>\n#include <boost/mpl/bool_fwd.hpp>\n\n#ifndef BOOST_NO_IS_ABSTRACT\n\n// if there is an intrinsic is_abstract defined, we don't have to do anything\n#define BOOST_SERIALIZATION_ASSUME_ABSTRACT(T)\n\n// but forward to the \"official\" is_abstract\nnamespace boost {\nnamespace serialization {\n    template<class T>\n    struct is_abstract : boost::is_abstract< T > {} ;\n} // namespace serialization\n} // namespace boost\n\n#else\n// we have to \"make\" one\n\nnamespace boost {\nnamespace serialization {\n    template<class T>\n    struct is_abstract : boost::false_type {};\n} // namespace serialization\n} // namespace boost\n\n// define a macro to make explicit designation of this more transparent\n#define BOOST_SERIALIZATION_ASSUME_ABSTRACT(T)        \\\nnamespace boost {                                     \\\nnamespace serialization {                             \\\ntemplate<>                                            \\\nstruct is_abstract< T > : boost::true_type {};        \\\ntemplate<>                                            \\\nstruct is_abstract< const T > : boost::true_type {};  \\\n}}                                                    \\\n/**/\n\n#endif // BOOST_NO_IS_ABSTRACT\n\n#endif //BOOST_SERIALIZATION_ASSUME_ABSTRACT_HPP\n"
  },
  {
    "path": "include/boost/serialization/base_object.hpp",
    "content": "#ifndef BOOST_SERIALIZATION_BASE_OBJECT_HPP\n#define BOOST_SERIALIZATION_BASE_OBJECT_HPP\n\n// MS compatible compilers support #pragma once\n#if defined(_MSC_VER)\n# pragma once\n#endif\n\n/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// base_object.hpp:\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for updates, documentation, and revision history.\n\n// if no archive headers have been included this is a no op\n// this is to permit BOOST_EXPORT etc to be included in a\n// file declaration header\n\n#include <boost/config.hpp>\n#include <boost/detail/workaround.hpp>\n\n#include <boost/mpl/eval_if.hpp>\n#include <boost/mpl/int.hpp>\n#include <boost/mpl/identity.hpp>\n\n#include <boost/type_traits/is_base_and_derived.hpp>\n#include <boost/type_traits/is_pointer.hpp>\n#include <boost/type_traits/is_const.hpp>\n#include <boost/type_traits/is_polymorphic.hpp>\n\n#include <boost/static_assert.hpp>\n#include <boost/serialization/access.hpp>\n#include <boost/serialization/force_include.hpp>\n#include <boost/serialization/void_cast_fwd.hpp>\n\nnamespace boost {\nnamespace serialization {\n\nnamespace detail\n{\n    // get the base type for a given derived type\n    // preserving the const-ness\n    template<class B, class D>\n    struct base_cast\n    {\n        typedef typename\n        mpl::if_<\n            is_const<D>,\n            const B,\n            B\n        >::type type;\n        BOOST_STATIC_ASSERT(is_const<type>::value == is_const<D>::value);\n    };\n\n    // only register void casts if the types are polymorphic\n    template<class Base, class Derived>\n    struct base_register\n    {\n        struct polymorphic {\n            static void const * invoke(){\n                Base const * const b = 0;\n                Derived const * const d = 0;\n                return & void_cast_register(d, b);\n            }\n        };\n        struct non_polymorphic {\n            static void const * invoke(){\n                return 0;\n            }\n        };\n        static void const * invoke(){\n            typedef typename mpl::eval_if<\n                is_polymorphic<Base>,\n                mpl::identity<polymorphic>,\n                mpl::identity<non_polymorphic>\n            >::type type;\n            return type::invoke();\n        }\n    };\n\n} // namespace detail\ntemplate<class Base, class Derived>\ntypename detail::base_cast<Base, Derived>::type &\nbase_object(Derived &d)\n{\n    BOOST_STATIC_ASSERT(( is_base_and_derived<Base,Derived>::value));\n    BOOST_STATIC_ASSERT(! is_pointer<Derived>::value);\n    typedef typename detail::base_cast<Base, Derived>::type type;\n    detail::base_register<type, Derived>::invoke();\n    return access::cast_reference<type, Derived>(d);\n}\n\n} // namespace serialization\n} // namespace boost\n\n#endif // BOOST_SERIALIZATION_BASE_OBJECT_HPP\n"
  },
  {
    "path": "include/boost/serialization/binary_object.hpp",
    "content": "#ifndef BOOST_SERIALIZATION_BINARY_OBJECT_HPP\n#define BOOST_SERIALIZATION_BINARY_OBJECT_HPP\n\n// MS compatible compilers support #pragma once\n#if defined(_MSC_VER)\n# pragma once\n#endif\n\n/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// nvp.hpp: interface for serialization system.\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for updates, documentation, and revision history.\n\n#include <boost/assert.hpp>\n\n#include <cstddef> // std::size_t\n#include <boost/config.hpp>\n#if defined(BOOST_NO_STDC_NAMESPACE)\nnamespace std{\n    using ::size_t;\n} // namespace std\n#endif\n\n#include <boost/preprocessor/stringize.hpp>\n#include <boost/serialization/tracking.hpp>\n#include <boost/serialization/level.hpp>\n#include <boost/serialization/split_member.hpp>\n#include <boost/serialization/nvp.hpp>\n#include <boost/serialization/wrapper.hpp>\n\nnamespace boost {\nnamespace serialization {\n\nstruct binary_object :\n    public wrapper_traits<nvp<const binary_object> >\n{\n    void const * m_t;\n    std::size_t m_size;\n    template<class Archive>\n    void save(Archive & ar, const unsigned int /* file_version */) const {\n        ar.save_binary(m_t, m_size);\n    }\n    template<class Archive>\n    void load(Archive & ar, const unsigned int /* file_version */) const {\n        ar.load_binary(const_cast<void *>(m_t), m_size);\n    }\n    BOOST_SERIALIZATION_SPLIT_MEMBER()\n    binary_object & operator=(const binary_object & rhs) {\n        m_t = rhs.m_t;\n        m_size = rhs.m_size;\n        return *this;\n    }\n    binary_object(const void * const t, std::size_t size) :\n        m_t(t),\n        m_size(size)\n    {}\n    binary_object(const binary_object & rhs) :\n        m_t(rhs.m_t),\n        m_size(rhs.m_size)\n    {}\n};\n\n// just a little helper to support the convention that all serialization\n// wrappers follow the naming convention make_xxxxx\ninline\nconst binary_object\nmake_binary_object(const void * t, std::size_t size){\n    return binary_object(t, size);\n}\n\n} // namespace serialization\n} // boost\n\n#endif // BOOST_SERIALIZATION_BINARY_OBJECT_HPP\n"
  },
  {
    "path": "include/boost/serialization/bitset.hpp",
    "content": "/*!\n * \\file      bitset.hpp\n * \\brief     Provides Boost.Serialization support for std::bitset\n * \\author    Brian Ravnsgaard Riis\n * \\author    Kenneth Riddile\n * \\date      16.09.2004, updated 04.03.2009\n * \\copyright 2004 Brian Ravnsgaard Riis\n * \\license   Boost Software License 1.0\n */\n#ifndef BOOST_SERIALIZATION_BITSET_HPP\n#define BOOST_SERIALIZATION_BITSET_HPP\n\n// MS compatible compilers support #pragma once\n#if defined(_MSC_VER)\n# pragma once\n#endif\n\n#include <bitset>\n#include <cstddef> // size_t\n\n#include <boost/config.hpp>\n#include <boost/serialization/split_free.hpp>\n#include <boost/serialization/string.hpp>\n#include <boost/serialization/nvp.hpp>\n\nnamespace boost{\nnamespace serialization{\n\ntemplate <class Archive, std::size_t size>\ninline void save(\n    Archive & ar,\n    std::bitset<size> const & t,\n    const unsigned int /* version */\n){\n    const std::string bits = t.template to_string<\n        std::string::value_type,\n        std::string::traits_type,\n        std::string::allocator_type\n    >();\n    ar << BOOST_SERIALIZATION_NVP( bits );\n}\n\ntemplate <class Archive, std::size_t size>\ninline void load(\n    Archive & ar,\n    std::bitset<size> & t,\n    const unsigned int /* version */\n){\n    std::string bits;\n    ar >> BOOST_SERIALIZATION_NVP( bits );\n    t = std::bitset<size>(bits);\n}\n\ntemplate <class Archive, std::size_t size>\ninline void serialize(\n    Archive & ar,\n    std::bitset<size> & t,\n    const unsigned int version\n){\n    boost::serialization::split_free( ar, t, version );\n}\n\n// don't track bitsets since that would trigger tracking\n// all over the program - which probably would be a surprise.\n// also, tracking would be hard to implement since, we're\n// serialization a representation of the data rather than\n// the data itself.\ntemplate <std::size_t size>\nstruct tracking_level<std::bitset<size> >\n    : mpl::int_<track_never> {} ;\n\n} //serialization\n} //boost\n\n#endif // BOOST_SERIALIZATION_BITSET_HPP\n"
  },
  {
    "path": "include/boost/serialization/boost_array.hpp",
    "content": "#ifndef BOOST_SERIALIZATION_BOOST_ARRAY_HPP\n#define BOOST_SERIALIZATION_BOOST_ARRAY_HPP\n\n// (C) Copyright 2005 Matthias Troyer and Dave Abrahams\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n#include <boost/config.hpp> // msvc 6.0 needs this for warning suppression\n\n#if defined(BOOST_NO_STDC_NAMESPACE)\nnamespace std{\n    using ::size_t;\n} // namespace std\n#endif\n\n#include <boost/serialization/nvp.hpp>\n#include <boost/array.hpp>\n\nnamespace boost { namespace serialization {\n// implement serialization for boost::array\ntemplate <class Archive, class T, std::size_t N>\nvoid serialize(Archive& ar, boost::array<T,N>& a, const unsigned int /* version */)\n{\n    ar & boost::serialization::make_nvp(\"elems\", a.elems);\n}\n\n} } // end namespace boost::serialization\n\n\n#endif //BOOST_SERIALIZATION_BOOST_ARRAY_HPP\n"
  },
  {
    "path": "include/boost/serialization/boost_unordered_map.hpp",
    "content": "#ifndef  BOOST_SERIALIZATION_BOOST_SERIALIZATION_UNORDERED_MAP_HPP\n#define BOOST_SERIALIZATION_BOOST_SERIALIZATION_UNORDERED_MAP_HPP\n\n// MS compatible compilers support #pragma once\n#if defined(_MSC_VER) && (_MSC_VER >= 1020)\n# pragma once\n#endif\n\n/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// serialization/unordered_map.hpp:\n// serialization for stl unordered_map templates\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .\n// (C) Copyright 2014 Jim Bell\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for updates, documentation, and revision history.\n\n#include <boost/static_assert.hpp>\nBOOST_STATIC_ASSERT_MSG(\n    false,\n    \"Boost.Unordered now provides its own Serialization support. \"\n    \"This header is no longer necessary and is now deprecated.\"\n)\n\n#endif // BOOST_SERIALIZATION_BOOST_SERIALIZATION_UNORDERED_MAP_HPP\n"
  },
  {
    "path": "include/boost/serialization/boost_unordered_set.hpp",
    "content": "#ifndef  BOOST_SERIALIZATION_BOOST_UNORDERED_SET_HPP\n#define BOOST_SERIALIZATION_BOOST_UNORDERED_SET_HPP\n\n// MS compatible compilers support #pragma once\n#if defined(_MSC_VER) && (_MSC_VER >= 1020)\n# pragma once\n#endif\n\n/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// unordered_set.hpp: serialization for boost unordered_set templates\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .\n// (C) Copyright 2014 Jim Bell\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for updates, documentation, and revision history.\n\n#include <boost/static_assert.hpp>\nBOOST_STATIC_ASSERT_MSG(\n    false,\n    \"Boost.Unordered now provides its own Serialization support. \"\n    \"This header is no longer necessary and is now deprecated.\"\n)\n\n#endif // BOOST_SERIALIZATION_BOOST_UNORDERED_SET_HPP\n"
  },
  {
    "path": "include/boost/serialization/collection_size_type.hpp",
    "content": "#ifndef BOOST_SERIALIZATION_COLLECTION_SIZE_TYPE_HPP\n#define BOOST_SERIALIZATION_COLLECTION_SIZE_TYPE_HPP\n\n// (C) Copyright 2005 Matthias Troyer\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n#include <cstddef> // size_t\n#include <boost/serialization/strong_typedef.hpp>\n#include <boost/serialization/level.hpp>\n#include <boost/serialization/split_free.hpp>\n#include <boost/serialization/is_bitwise_serializable.hpp>\n\nnamespace boost {\nnamespace serialization {\n\n//BOOST_STRONG_TYPEDEF(std::size_t, collection_size_type)\n\nclass collection_size_type {\nprivate:\n    typedef std::size_t base_type;\n    base_type t;\npublic:\n    collection_size_type(): t(0) {}\n    explicit collection_size_type(const std::size_t & t_) :\n        t(t_)\n    {}\n    collection_size_type(const collection_size_type & t_) :\n        t(t_.t)\n    {}\n    collection_size_type & operator=(const collection_size_type & rhs){\n        t = rhs.t;\n        return *this;\n    }\n    collection_size_type & operator=(const unsigned int & rhs){\n        t = rhs;\n        return *this;\n    }\n    // used for text output\n    operator base_type () const {\n        return t;\n    }\n    // used for text input\n    operator base_type & () {\n        return t;\n    }\n    bool operator==(const collection_size_type & rhs) const {\n        return t == rhs.t;\n    }\n    bool operator<(const collection_size_type & rhs) const {\n        return t < rhs.t;\n    }\n};\n\n\n} } // end namespace boost::serialization\n\nBOOST_CLASS_IMPLEMENTATION(collection_size_type, primitive_type)\nBOOST_IS_BITWISE_SERIALIZABLE(collection_size_type)\n\n#endif //BOOST_SERIALIZATION_COLLECTION_SIZE_TYPE_HPP\n"
  },
  {
    "path": "include/boost/serialization/collection_traits.hpp",
    "content": "#ifndef BOOST_SERIALIZATION_COLLECTION_TRAITS_HPP\n#define BOOST_SERIALIZATION_COLLECTION_TRAITS_HPP\n\n// MS compatible compilers support #pragma once\n#if defined(_MSC_VER)\n# pragma once\n#endif\n\n/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// collection_traits.hpp:\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for updates, documentation, and revision history.\n\n// This header assigns a level implementation trait to a collection type\n// for all primitives.  It is needed so that archives which are meant to be\n// portable don't write class information in the archive.  Since, not all\n// compiles recognize the same set of primitive types, the possibility\n// exists for archives to be non-portable if class information for primitive\n// types is included.  This is addressed by the following macros.\n#include <boost/config.hpp>\n#include <boost/mpl/integral_c_tag.hpp>\n\n#include <boost/cstdint.hpp>\n#include <boost/integer_traits.hpp>\n#include <climits> // ULONG_MAX\n#include <boost/serialization/level.hpp>\n\n#define BOOST_SERIALIZATION_COLLECTION_TRAITS_HELPER(T, C)          \\\ntemplate<>                                                          \\\nstruct implementation_level< C < T > > {                            \\\n    typedef mpl::integral_c_tag tag;                                \\\n    typedef mpl::int_<object_serializable> type;                    \\\n    BOOST_STATIC_CONSTANT(int, value = object_serializable);        \\\n};                                                                  \\\n/**/\n\n#if defined(BOOST_NO_CWCHAR) || defined(BOOST_NO_INTRINSIC_WCHAR_T)\n    #define BOOST_SERIALIZATION_COLLECTION_TRAITS_HELPER_WCHAR(C)\n#else\n    #define BOOST_SERIALIZATION_COLLECTION_TRAITS_HELPER_WCHAR(C)   \\\n    BOOST_SERIALIZATION_COLLECTION_TRAITS_HELPER(wchar_t, C)        \\\n    /**/\n#endif\n\n#if defined(BOOST_HAS_LONG_LONG)\n    #define BOOST_SERIALIZATION_COLLECTION_TRAITS_HELPER_INT64(C)    \\\n    BOOST_SERIALIZATION_COLLECTION_TRAITS_HELPER(boost::long_long_type, C)  \\\n    BOOST_SERIALIZATION_COLLECTION_TRAITS_HELPER(boost::ulong_long_type, C) \\\n    /**/\n#else\n    #define BOOST_SERIALIZATION_COLLECTION_TRAITS_HELPER_INT64(C)\n#endif\n\n#define BOOST_SERIALIZATION_COLLECTION_TRAITS(C)                     \\\n    namespace boost { namespace serialization {                      \\\n    BOOST_SERIALIZATION_COLLECTION_TRAITS_HELPER(bool, C)            \\\n    BOOST_SERIALIZATION_COLLECTION_TRAITS_HELPER(char, C)            \\\n    BOOST_SERIALIZATION_COLLECTION_TRAITS_HELPER(signed char, C)     \\\n    BOOST_SERIALIZATION_COLLECTION_TRAITS_HELPER(unsigned char, C)   \\\n    BOOST_SERIALIZATION_COLLECTION_TRAITS_HELPER(signed int, C)      \\\n    BOOST_SERIALIZATION_COLLECTION_TRAITS_HELPER(unsigned int, C)    \\\n    BOOST_SERIALIZATION_COLLECTION_TRAITS_HELPER(signed long, C)     \\\n    BOOST_SERIALIZATION_COLLECTION_TRAITS_HELPER(unsigned long, C)   \\\n    BOOST_SERIALIZATION_COLLECTION_TRAITS_HELPER(float, C)           \\\n    BOOST_SERIALIZATION_COLLECTION_TRAITS_HELPER(double, C)          \\\n    BOOST_SERIALIZATION_COLLECTION_TRAITS_HELPER(unsigned short, C)  \\\n    BOOST_SERIALIZATION_COLLECTION_TRAITS_HELPER(signed short, C)    \\\n    BOOST_SERIALIZATION_COLLECTION_TRAITS_HELPER_INT64(C)            \\\n    BOOST_SERIALIZATION_COLLECTION_TRAITS_HELPER_WCHAR(C)            \\\n    } }                                                              \\\n    /**/\n\n#endif // BOOST_SERIALIZATION_COLLECTION_TRAITS\n"
  },
  {
    "path": "include/boost/serialization/collections_load_imp.hpp",
    "content": "#ifndef  BOOST_SERIALIZATION_COLLECTIONS_LOAD_IMP_HPP\n#define BOOST_SERIALIZATION_COLLECTIONS_LOAD_IMP_HPP\n\n// MS compatible compilers support #pragma once\n#if defined(_MSC_VER)\n# pragma once\n#endif\n\n#if defined(_MSC_VER) && (_MSC_VER <= 1020)\n#  pragma warning (disable : 4786) // too long name, harmless warning\n#endif\n\n/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// collections_load_imp.hpp: serialization for loading stl collections\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for updates, documentation, and revision history.\n\n// helper function templates for serialization of collections\n\n#include <boost/assert.hpp>\n#include <cstddef> // size_t\n#include <boost/config.hpp> // msvc 6.0 needs this for warning suppression\n#if defined(BOOST_NO_STDC_NAMESPACE)\nnamespace std{\n    using ::size_t;\n} // namespace std\n#endif\n#include <boost/detail/workaround.hpp>\n\n#include <boost/serialization/access.hpp>\n#include <boost/serialization/nvp.hpp>\n#include <boost/serialization/detail/stack_constructor.hpp>\n#include <boost/serialization/collection_size_type.hpp>\n#include <boost/serialization/item_version_type.hpp>\n#include <boost/serialization/detail/is_default_constructible.hpp>\n#include <boost/utility/enable_if.hpp>\n#include <boost/move/utility_core.hpp>\n\nnamespace boost{\nnamespace serialization {\nnamespace stl {\n\n//////////////////////////////////////////////////////////////////////\n// implementation of serialization for STL containers\n//\n\ntemplate<\n    class Archive,\n    class T\n>\ntypename boost::enable_if<\n    typename detail::is_default_constructible<\n        typename T::value_type\n    >,\n    void\n>::type\ncollection_load_impl(\n    Archive & ar,\n    T & t,\n    collection_size_type count,\n    item_version_type /*item_version*/\n){\n    t.resize(count);\n    typename T::iterator hint;\n    hint = t.begin();\n    while(count-- > 0){\n        ar >> boost::serialization::make_nvp(\"item\", *hint++);\n    }\n}\n\ntemplate<\n    class Archive,\n    class T\n>\ntypename boost::disable_if<\n    typename detail::is_default_constructible<\n        typename T::value_type\n    >,\n    void\n>::type\ncollection_load_impl(\n    Archive & ar,\n    T & t,\n    collection_size_type count,\n    item_version_type item_version\n){\n    t.clear();\n    while(count-- > 0){\n        detail::stack_construct<Archive, typename T::value_type> u(ar, item_version);\n        ar >> boost::serialization::make_nvp(\"item\", u.reference());\n        t.push_back(boost::move(u.reference()));\n        ar.reset_object_address(& t.back() , u.address());\n     }\n}\n\n} // namespace stl\n} // namespace serialization\n} // namespace boost\n\n#endif //BOOST_SERIALIZATION_COLLECTIONS_LOAD_IMP_HPP\n"
  },
  {
    "path": "include/boost/serialization/collections_save_imp.hpp",
    "content": "#ifndef BOOST_SERIALIZATION_COLLECTIONS_SAVE_IMP_HPP\n#define BOOST_SERIALIZATION_COLLECTIONS_SAVE_IMP_HPP\n\n// MS compatible compilers support #pragma once\n#if defined(_MSC_VER)\n# pragma once\n#endif\n\n/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// collections_save_imp.hpp: serialization for stl collections\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for updates, documentation, and revision history.\n\n// helper function templates for serialization of collections\n\n#include <boost/config.hpp>\n#include <boost/core/addressof.hpp>\n#include <boost/serialization/nvp.hpp>\n#include <boost/serialization/serialization.hpp>\n#include <boost/serialization/version.hpp>\n#include <boost/serialization/collection_size_type.hpp>\n#include <boost/serialization/item_version_type.hpp>\n\nnamespace boost{\nnamespace serialization {\nnamespace stl {\n\n//////////////////////////////////////////////////////////////////////\n// implementation of serialization for STL containers\n//\n\ntemplate<class Archive, class Container>\ninline void save_collection(\n    Archive & ar,\n    const Container &s,\n    collection_size_type count)\n{\n    ar << BOOST_SERIALIZATION_NVP(count);\n    // record number of elements\n    const item_version_type item_version(\n        version<typename Container::value_type>::value\n    );\n\n    ar << BOOST_SERIALIZATION_NVP(item_version);\n\n    typename Container::const_iterator it = s.begin();\n    while(count-- > 0){\n        // note borland emits a no-op without the explicit namespace\n        boost::serialization::save_construct_data_adl(\n            ar,\n            boost::addressof(*it),\n            item_version\n        );\n        ar << boost::serialization::make_nvp(\"item\", *it++);\n    }\n}\n\ntemplate<class Archive, class Container>\ninline void save_collection(Archive & ar, const Container &s)\n{\n    // record number of elements\n    collection_size_type count(s.size());\n    save_collection(ar, s, count);\n}\n\n} // namespace stl\n} // namespace serialization\n} // namespace boost\n\n#endif //BOOST_SERIALIZATION_COLLECTIONS_SAVE_IMP_HPP\n"
  },
  {
    "path": "include/boost/serialization/complex.hpp",
    "content": "#ifndef  BOOST_SERIALIZATION_COMPLEX_HPP\n#define BOOST_SERIALIZATION_COMPLEX_HPP\n\n// MS compatible compilers support #pragma once\n#if defined(_MSC_VER)\n# pragma once\n#endif\n\n/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// serialization/utility.hpp:\n// serialization for stl utility templates\n\n// (C) Copyright 2007 Matthias Troyer .\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for updates, documentation, and revision history.\n\n#include <complex>\n#include <boost/config.hpp>\n\n#include <boost/serialization/nvp.hpp>\n#include <boost/serialization/is_bitwise_serializable.hpp>\n#include <boost/serialization/split_free.hpp>\n\nnamespace boost {\nnamespace serialization {\n\ntemplate<class Archive, class T>\ninline void serialize(\n    Archive & ar,\n    std::complex< T > & t,\n    const unsigned int file_version\n){\n    boost::serialization::split_free(ar, t, file_version);\n}\n\ntemplate<class Archive, class T>\ninline void save(\n    Archive & ar,\n    std::complex< T > const & t,\n    const unsigned int /* file_version */\n){\n    const T re = t.real();\n    const T im = t.imag();\n    ar << boost::serialization::make_nvp(\"real\", re);\n    ar << boost::serialization::make_nvp(\"imag\", im);\n}\n\ntemplate<class Archive, class T>\ninline void load(\n    Archive & ar,\n    std::complex< T >& t,\n    const unsigned int /* file_version */\n){\n    T re;\n    T im;\n    ar >> boost::serialization::make_nvp(\"real\", re);\n    ar >> boost::serialization::make_nvp(\"imag\", im);\n    t = std::complex< T >(re,im);\n}\n\n// specialization of serialization traits for complex\ntemplate <class T>\nstruct is_bitwise_serializable<std::complex< T > >\n    : public is_bitwise_serializable< T > {};\n\ntemplate <class T>\nstruct implementation_level<std::complex< T > >\n    : mpl::int_<object_serializable> {} ;\n\n// treat complex just like builtin arithmetic types for tracking\ntemplate <class T>\nstruct tracking_level<std::complex< T > >\n    : mpl::int_<track_never> {} ;\n\n} // serialization\n} // namespace boost\n\n#endif // BOOST_SERIALIZATION_COMPLEX_HPP\n"
  },
  {
    "path": "include/boost/serialization/config.hpp",
    "content": "#ifndef BOOST_SERIALIZATION_CONFIG_HPP\n#define BOOST_SERIALIZATION_CONFIG_HPP\n\n//  config.hpp  ---------------------------------------------//\n\n//  (c) Copyright Robert Ramey 2004\n//  Use, modification, and distribution is subject to the Boost Software\n//  License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n//  http://www.boost.org/LICENSE_1_0.txt)\n\n//  See library home page at http://www.boost.org/libs/serialization\n\n//----------------------------------------------------------------------------//\n\n// This header implements separate compilation features as described in\n// http://www.boost.org/more/separate_compilation.html\n\n#include <boost/config.hpp>\n#include <boost/detail/workaround.hpp>\n\n// note: this version incorporates the related code into the the\n// the same library as BOOST_ARCHIVE.  This could change some day in the\n// future\n\n// if BOOST_SERIALIZATION_DECL is defined undefine it now:\n#ifdef BOOST_SERIALIZATION_DECL\n    #undef BOOST_SERIALIZATION_DECL\n#endif\n\n// we need to import/export our code only if the user has specifically\n// asked for it by defining either BOOST_ALL_DYN_LINK if they want all boost\n// libraries to be dynamically linked, or BOOST_SERIALIZATION_DYN_LINK\n// if they want just this one to be dynamically liked:\n#if defined(BOOST_ALL_DYN_LINK) || defined(BOOST_SERIALIZATION_DYN_LINK)\n    #if !defined(BOOST_DYN_LINK)\n        #define BOOST_DYN_LINK\n    #endif\n    // export if this is our own source, otherwise import:\n    #if defined(BOOST_SERIALIZATION_SOURCE)\n        #define BOOST_SERIALIZATION_DECL BOOST_SYMBOL_EXPORT\n    #else\n        #define BOOST_SERIALIZATION_DECL BOOST_SYMBOL_IMPORT\n    #endif // defined(BOOST_SERIALIZATION_SOURCE)\n#endif // defined(BOOST_ALL_DYN_LINK) || defined(BOOST_SERIALIZATION_DYN_LINK)\n\n// if BOOST_SERIALIZATION_DECL isn't defined yet define it now:\n#ifndef BOOST_SERIALIZATION_DECL\n    #define BOOST_SERIALIZATION_DECL\n#endif\n\n//  enable automatic library variant selection  ------------------------------//\n\n#if !defined(BOOST_ALL_NO_LIB) && !defined(BOOST_SERIALIZATION_NO_LIB) \\\n&&  !defined(BOOST_ARCHIVE_SOURCE) && !defined(BOOST_WARCHIVE_SOURCE)  \\\n&&  !defined(BOOST_SERIALIZATION_SOURCE)\n    //\n    // Set the name of our library, this will get undef'ed by auto_link.hpp\n    // once it's done with it:\n    //\n    #define BOOST_LIB_NAME boost_serialization\n    //\n    // If we're importing code from a dll, then tell auto_link.hpp about it:\n    //\n    #if defined(BOOST_ALL_DYN_LINK) || defined(BOOST_SERIALIZATION_DYN_LINK)\n    #  define BOOST_DYN_LINK\n    #endif\n    //\n    // And include the header that does the work:\n    //\n    #include <boost/config/auto_link.hpp>\n\n#endif\n\n#endif // BOOST_SERIALIZATION_CONFIG_HPP\n"
  },
  {
    "path": "include/boost/serialization/deque.hpp",
    "content": "#ifndef  BOOST_SERIALIZATION_DEQUE_HPP\n#define BOOST_SERIALIZATION_DEQUE_HPP\n\n// MS compatible compilers support #pragma once\n#if defined(_MSC_VER)\n# pragma once\n#endif\n\n/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// deque.hpp\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for updates, documentation, and revision history.\n\n#include <deque>\n\n#include <boost/config.hpp>\n\n#include <boost/serialization/library_version_type.hpp>\n#include <boost/serialization/collections_save_imp.hpp>\n#include <boost/serialization/collections_load_imp.hpp>\n#include <boost/serialization/split_free.hpp>\n\nnamespace boost {\nnamespace serialization {\n\ntemplate<class Archive, class U, class Allocator>\ninline void save(\n    Archive & ar,\n    const std::deque<U, Allocator> &t,\n    const unsigned int /* file_version */\n){\n    boost::serialization::stl::save_collection<\n        Archive, std::deque<U, Allocator>\n    >(ar, t);\n}\n\ntemplate<class Archive, class U, class Allocator>\ninline void load(\n    Archive & ar,\n    std::deque<U, Allocator> &t,\n    const unsigned int /* file_version */\n){\n    const boost::serialization::library_version_type library_version(\n        ar.get_library_version()\n    );\n    // retrieve number of elements\n    item_version_type item_version(0);\n    collection_size_type count;\n    ar >> BOOST_SERIALIZATION_NVP(count);\n    if(boost::serialization::library_version_type(3) < library_version){\n        ar >> BOOST_SERIALIZATION_NVP(item_version);\n    }\n    stl::collection_load_impl(ar, t, count, item_version);\n}\n\n// split non-intrusive serialization function member into separate\n// non intrusive save/load member functions\ntemplate<class Archive, class U, class Allocator>\ninline void serialize(\n    Archive & ar,\n    std::deque<U, Allocator> &t,\n    const unsigned int file_version\n){\n    boost::serialization::split_free(ar, t, file_version);\n}\n\n} // namespace serialization\n} // namespace boost\n\n#include <boost/serialization/collection_traits.hpp>\n\nBOOST_SERIALIZATION_COLLECTION_TRAITS(std::deque)\n\n#endif // BOOST_SERIALIZATION_DEQUE_HPP\n"
  },
  {
    "path": "include/boost/serialization/detail/is_default_constructible.hpp",
    "content": "#ifndef  BOOST_SERIALIZATION_DETAIL_IS_DEFAULT_CONSTRUCTIBLE_HPP\n#define BOOST_SERIALIZATION_DETAIL_IS_DEFAULT_CONSTRUCTIBLE_HPP\n\n// MS compatible compilers support #pragma once\n#if defined(_MSC_VER)\n# pragma once\n#endif\n\n/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// is_default_constructible.hpp: serialization for loading stl collections\n//\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for updates, documentation, and revision history.\n\n#include <boost/config.hpp>\n\n#if ! defined(BOOST_NO_CXX11_HDR_TYPE_TRAITS)\n    #include <type_traits>\n    namespace boost{\n    namespace serialization {\n    namespace detail {\n\n    template<typename T>\n    struct is_default_constructible : public std::is_default_constructible<T> {};\n\n    } // detail\n    } // serialization\n    } // boost\n#else\n    // we don't have standard library support for is_default_constructible\n    // so we fake it by using boost::has_trivial_construtor.  But this is not\n    // actually correct because it's possible that a default constructor\n    // to be non trivial. So when using this, make sure you're not using your\n    // own definition of of T() but are using the actual default one!\n    #include <boost/type_traits/has_trivial_constructor.hpp>\n    namespace boost{\n    namespace serialization {\n    namespace detail {\n\n    template<typename T>\n    struct is_default_constructible : public boost::has_trivial_constructor<T> {};\n\n    } // detail\n    } // serialization\n    } // boost\n\n#endif\n\n\n#endif //  BOOST_SERIALIZATION_DETAIL_IS_DEFAULT_CONSTRUCTIBLE_HPP\n"
  },
  {
    "path": "include/boost/serialization/detail/shared_count_132.hpp",
    "content": "#ifndef BOOST_DETAIL_SHARED_COUNT_132_HPP_INCLUDED\n#define BOOST_DETAIL_SHARED_COUNT_132_HPP_INCLUDED\n\n// MS compatible compilers support #pragma once\n\n#if defined(_MSC_VER)\n# pragma once\n#endif\n\n//\n//  detail/shared_count.hpp\n//\n//  Copyright (c) 2001, 2002, 2003 Peter Dimov and Multi Media Ltd.\n//\n// Distributed under the Boost Software License, Version 1.0. (See\n// accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n#include <boost/config.hpp>\n\n#if defined(BOOST_SP_USE_STD_ALLOCATOR) && defined(BOOST_SP_USE_QUICK_ALLOCATOR)\n# error BOOST_SP_USE_STD_ALLOCATOR and BOOST_SP_USE_QUICK_ALLOCATOR are incompatible.\n#endif\n\n#include <boost/checked_delete.hpp>\n#include <boost/serialization/throw_exception.hpp>\n#include <boost/detail/lightweight_mutex.hpp>\n\n#if defined(BOOST_SP_USE_QUICK_ALLOCATOR)\n#include <boost/detail/quick_allocator.hpp>\n#endif\n\n#include <memory>           // std::auto_ptr, std::allocator\n#include <functional>       // std::less\n#include <exception>        // std::exception\n#include <new>              // std::bad_alloc\n#include <typeinfo>         // std::type_info in get_deleter\n#include <cstddef>          // std::size_t\n\n#include <boost/config.hpp> // msvc 6.0 needs this for warning suppression\n#if defined(BOOST_NO_STDC_NAMESPACE)\nnamespace std{\n    using ::size_t;\n} // namespace std\n#endif\n\nnamespace boost_132 {\n\n// Debug hooks\n\n#if defined(BOOST_SP_ENABLE_DEBUG_HOOKS)\n\nvoid sp_scalar_constructor_hook(void * px, std::size_t size, void * pn);\nvoid sp_array_constructor_hook(void * px);\nvoid sp_scalar_destructor_hook(void * px, std::size_t size, void * pn);\nvoid sp_array_destructor_hook(void * px);\n\n#endif\n\n\n// The standard library that comes with Borland C++ 5.5.1\n// defines std::exception and its members as having C calling\n// convention (-pc). When the definition of bad_weak_ptr\n// is compiled with -ps, the compiler issues an error.\n// Hence, the temporary #pragma option -pc below. The version\n// check is deliberately conservative.\n\nclass bad_weak_ptr: public std::exception\n{\npublic:\n\n    virtual char const * what() const BOOST_NOEXCEPT_OR_NOTHROW\n    {\n        return \"boost::bad_weak_ptr\";\n    }\n};\n\nnamespace detail{\n\nclass sp_counted_base\n{\n//private:\n\n    typedef boost::detail::lightweight_mutex mutex_type;\n\npublic:\n\n    sp_counted_base(): use_count_(1), weak_count_(1)\n    {\n    }\n\n    virtual ~sp_counted_base() // nothrow\n    {\n    }\n\n    // dispose() is called when use_count_ drops to zero, to release\n    // the resources managed by *this.\n\n    virtual void dispose() = 0; // nothrow\n\n    // destruct() is called when weak_count_ drops to zero.\n\n    virtual void destruct() // nothrow\n    {\n        delete this;\n    }\n\n    virtual void * get_deleter(std::type_info const & ti) = 0;\n\n    void add_ref_copy()\n    {\n#if defined(BOOST_HAS_THREADS)\n        mutex_type::scoped_lock lock(mtx_);\n#endif\n        ++use_count_;\n    }\n\n    void add_ref_lock()\n    {\n#if defined(BOOST_HAS_THREADS)\n        mutex_type::scoped_lock lock(mtx_);\n#endif\n        if(use_count_ == 0) boost::serialization::throw_exception(bad_weak_ptr());\n        ++use_count_;\n    }\n\n    void release() // nothrow\n    {\n        {\n#if defined(BOOST_HAS_THREADS)\n            mutex_type::scoped_lock lock(mtx_);\n#endif\n            long new_use_count = --use_count_;\n\n            if(new_use_count != 0) return;\n        }\n\n        dispose();\n        weak_release();\n    }\n\n    void weak_add_ref() // nothrow\n    {\n#if defined(BOOST_HAS_THREADS)\n        mutex_type::scoped_lock lock(mtx_);\n#endif\n        ++weak_count_;\n    }\n\n    void weak_release() // nothrow\n    {\n        long new_weak_count;\n\n        {\n#if defined(BOOST_HAS_THREADS)\n            mutex_type::scoped_lock lock(mtx_);\n#endif\n            new_weak_count = --weak_count_;\n        }\n\n        if(new_weak_count == 0)\n        {\n            destruct();\n        }\n    }\n\n    long use_count() const // nothrow\n    {\n#if defined(BOOST_HAS_THREADS)\n        mutex_type::scoped_lock lock(mtx_);\n#endif\n        return use_count_;\n    }\n\n//private:\npublic:\n    sp_counted_base(sp_counted_base const &);\n    sp_counted_base & operator= (sp_counted_base const &);\n\n    long use_count_;        // #shared\n    long weak_count_;       // #weak + (#shared != 0)\n\n#if defined(BOOST_HAS_THREADS) || defined(BOOST_LWM_WIN32)\n    mutable mutex_type mtx_;\n#endif\n};\n\n#if defined(BOOST_SP_ENABLE_DEBUG_HOOKS)\n\ntemplate<class T> void cbi_call_constructor_hook(sp_counted_base * pn, T * px, boost::checked_deleter< T > const &)\n{\n    boost::sp_scalar_constructor_hook(px, sizeof(T), pn);\n}\n\ntemplate<class T> void cbi_call_constructor_hook(sp_counted_base *, T * px, boost::checked_array_deleter< T > const &)\n{\n    boost::sp_array_constructor_hook(px);\n}\n\ntemplate<class P, class D> void cbi_call_constructor_hook(sp_counted_base *, P const &, D const &, long)\n{\n}\n\ntemplate<class T> void cbi_call_destructor_hook(sp_counted_base * pn, T * px, boost::checked_deleter< T > const &)\n{\n    boost::sp_scalar_destructor_hook(px, sizeof(T), pn);\n}\n\ntemplate<class T> void cbi_call_destructor_hook(sp_counted_base *, T * px, boost::checked_array_deleter< T > const &)\n{\n    boost::sp_array_destructor_hook(px);\n}\n\ntemplate<class P, class D> void cbi_call_destructor_hook(sp_counted_base *, P const &, D const &, long)\n{\n}\n\n#endif\n\n//\n// Borland's Codeguard trips up over the -Vx- option here:\n//\n#ifdef __CODEGUARD__\n# pragma option push -Vx-\n#endif\n\ntemplate<class P, class D> class sp_counted_base_impl: public sp_counted_base\n{\n//private:\npublic:\n    P ptr; // copy constructor must not throw\n    D del; // copy constructor must not throw\n\n    sp_counted_base_impl(sp_counted_base_impl const &);\n    sp_counted_base_impl & operator= (sp_counted_base_impl const &);\n\n    typedef sp_counted_base_impl<P, D> this_type;\n\npublic:\n\n    // pre: initial_use_count <= initial_weak_count, d(p) must not throw\n\n    sp_counted_base_impl(P p, D d): ptr(p), del(d)\n    {\n#if defined(BOOST_SP_ENABLE_DEBUG_HOOKS)\n        detail::cbi_call_constructor_hook(this, p, d, 0);\n#endif\n    }\n\n    virtual void dispose() // nothrow\n    {\n#if defined(BOOST_SP_ENABLE_DEBUG_HOOKS)\n        detail::cbi_call_destructor_hook(this, ptr, del, 0);\n#endif\n        del(ptr);\n    }\n\n    virtual void * get_deleter(std::type_info const & ti)\n    {\n        return ti == typeid(D)? &del: 0;\n    }\n\n#if defined(BOOST_SP_USE_STD_ALLOCATOR)\n\n    void * operator new(std::size_t)\n    {\n        return std::allocator<this_type>().allocate(1, static_cast<this_type *>(0));\n    }\n\n    void operator delete(void * p)\n    {\n        std::allocator<this_type>().deallocate(static_cast<this_type *>(p), 1);\n    }\n\n#endif\n\n#if defined(BOOST_SP_USE_QUICK_ALLOCATOR)\n\n    void * operator new(std::size_t)\n    {\n        return boost::detail::quick_allocator<this_type>::alloc();\n    }\n\n    void operator delete(void * p)\n    {\n        boost::detail::quick_allocator<this_type>::dealloc(p);\n    }\n\n#endif\n};\n\n#if defined(BOOST_SP_ENABLE_DEBUG_HOOKS)\n\nint const shared_count_id = 0x2C35F101;\nint const   weak_count_id = 0x298C38A4;\n\n#endif\n\nclass weak_count;\n\nclass shared_count\n{\n//private:\npublic:\n    sp_counted_base * pi_;\n\n#if defined(BOOST_SP_ENABLE_DEBUG_HOOKS)\n    int id_;\n#endif\n\n    friend class weak_count;\n\npublic:\n\n    shared_count(): pi_(0) // nothrow\n#if defined(BOOST_SP_ENABLE_DEBUG_HOOKS)\n        , id_(shared_count_id)\n#endif\n    {\n    }\n\n    template<class P, class D> shared_count(P p, D d): pi_(0)\n#if defined(BOOST_SP_ENABLE_DEBUG_HOOKS)\n        , id_(shared_count_id)\n#endif\n    {\n#ifndef BOOST_NO_EXCEPTIONS\n\n        try\n        {\n            pi_ = new sp_counted_base_impl<P, D>(p, d);\n        }\n        catch(...)\n        {\n            d(p); // delete p\n            throw;\n        }\n\n#else\n\n        pi_ = new sp_counted_base_impl<P, D>(p, d);\n\n        if(pi_ == 0)\n        {\n            d(p); // delete p\n            boost::serialization::throw_exception(std::bad_alloc());\n        }\n\n#endif\n    }\n\n#ifndef BOOST_NO_AUTO_PTR\n\n    // auto_ptr<Y> is special cased to provide the strong guarantee\n\n    template<class Y>\n    explicit shared_count(std::auto_ptr<Y> & r): pi_(\n        new sp_counted_base_impl<\n            Y *,\n            boost::checked_deleter<Y>\n        >(r.get(), boost::checked_deleter<Y>()))\n#if defined(BOOST_SP_ENABLE_DEBUG_HOOKS)\n        , id_(shared_count_id)\n#endif\n    {\n        r.release();\n    }\n\n#endif\n\n    ~shared_count() // nothrow\n    {\n        if(pi_ != 0) pi_->release();\n#if defined(BOOST_SP_ENABLE_DEBUG_HOOKS)\n        id_ = 0;\n#endif\n    }\n\n    shared_count(shared_count const & r): pi_(r.pi_) // nothrow\n#if defined(BOOST_SP_ENABLE_DEBUG_HOOKS)\n        , id_(shared_count_id)\n#endif\n    {\n        if(pi_ != 0) pi_->add_ref_copy();\n    }\n\n    explicit shared_count(weak_count const & r); // throws bad_weak_ptr when r.use_count() == 0\n\n    shared_count & operator= (shared_count const & r) // nothrow\n    {\n        sp_counted_base * tmp = r.pi_;\n\n        if(tmp != pi_)\n        {\n            if(tmp != 0) tmp->add_ref_copy();\n            if(pi_ != 0) pi_->release();\n            pi_ = tmp;\n        }\n\n        return *this;\n    }\n\n    void swap(shared_count & r) // nothrow\n    {\n        sp_counted_base * tmp = r.pi_;\n        r.pi_ = pi_;\n        pi_ = tmp;\n    }\n\n    long use_count() const // nothrow\n    {\n        return pi_ != 0? pi_->use_count(): 0;\n    }\n\n    bool unique() const // nothrow\n    {\n        return use_count() == 1;\n    }\n\n    friend inline bool operator==(shared_count const & a, shared_count const & b)\n    {\n        return a.pi_ == b.pi_;\n    }\n\n    friend inline bool operator<(shared_count const & a, shared_count const & b)\n    {\n        return std::less<sp_counted_base *>()(a.pi_, b.pi_);\n    }\n\n    void * get_deleter(std::type_info const & ti) const\n    {\n        return pi_? pi_->get_deleter(ti): 0;\n    }\n};\n\n#ifdef __CODEGUARD__\n# pragma option pop\n#endif\n\n\nclass weak_count\n{\nprivate:\n\n    sp_counted_base * pi_;\n\n#if defined(BOOST_SP_ENABLE_DEBUG_HOOKS)\n    int id_;\n#endif\n\n    friend class shared_count;\n\npublic:\n\n    weak_count(): pi_(0) // nothrow\n#if defined(BOOST_SP_ENABLE_DEBUG_HOOKS)\n        , id_(weak_count_id)\n#endif\n    {\n    }\n\n    weak_count(shared_count const & r): pi_(r.pi_) // nothrow\n#if defined(BOOST_SP_ENABLE_DEBUG_HOOKS)\n        , id_(shared_count_id)\n#endif\n    {\n        if(pi_ != 0) pi_->weak_add_ref();\n    }\n\n    weak_count(weak_count const & r): pi_(r.pi_) // nothrow\n#if defined(BOOST_SP_ENABLE_DEBUG_HOOKS)\n        , id_(shared_count_id)\n#endif\n    {\n        if(pi_ != 0) pi_->weak_add_ref();\n    }\n\n    ~weak_count() // nothrow\n    {\n        if(pi_ != 0) pi_->weak_release();\n#if defined(BOOST_SP_ENABLE_DEBUG_HOOKS)\n        id_ = 0;\n#endif\n    }\n\n    weak_count & operator= (shared_count const & r) // nothrow\n    {\n        sp_counted_base * tmp = r.pi_;\n        if(tmp != 0) tmp->weak_add_ref();\n        if(pi_ != 0) pi_->weak_release();\n        pi_ = tmp;\n\n        return *this;\n    }\n\n    weak_count & operator= (weak_count const & r) // nothrow\n    {\n        sp_counted_base * tmp = r.pi_;\n        if(tmp != 0) tmp->weak_add_ref();\n        if(pi_ != 0) pi_->weak_release();\n        pi_ = tmp;\n\n        return *this;\n    }\n\n    void swap(weak_count & r) // nothrow\n    {\n        sp_counted_base * tmp = r.pi_;\n        r.pi_ = pi_;\n        pi_ = tmp;\n    }\n\n    long use_count() const // nothrow\n    {\n        return pi_ != 0? pi_->use_count(): 0;\n    }\n\n    friend inline bool operator==(weak_count const & a, weak_count const & b)\n    {\n        return a.pi_ == b.pi_;\n    }\n\n    friend inline bool operator<(weak_count const & a, weak_count const & b)\n    {\n        return std::less<sp_counted_base *>()(a.pi_, b.pi_);\n    }\n};\n\ninline shared_count::shared_count(weak_count const & r): pi_(r.pi_)\n#if defined(BOOST_SP_ENABLE_DEBUG_HOOKS)\n        , id_(shared_count_id)\n#endif\n{\n    if(pi_ != 0)\n    {\n        pi_->add_ref_lock();\n    }\n    else\n    {\n        boost::serialization::throw_exception(bad_weak_ptr());\n    }\n}\n\n} // namespace detail\n\n} // namespace boost\n\nBOOST_SERIALIZATION_ASSUME_ABSTRACT(boost_132::detail::sp_counted_base)\n\n#endif  // #ifndef BOOST_DETAIL_SHARED_COUNT_HPP_INCLUDED\n"
  },
  {
    "path": "include/boost/serialization/detail/shared_ptr_132.hpp",
    "content": "#ifndef BOOST_SHARED_PTR_132_HPP_INCLUDED\n#define BOOST_SHARED_PTR_132_HPP_INCLUDED\n\n//\n//  shared_ptr.hpp\n//\n//  (C) Copyright Greg Colvin and Beman Dawes 1998, 1999.\n//  Copyright (c) 2001, 2002, 2003 Peter Dimov\n//\n//  Distributed under the Boost Software License, Version 1.0. (See\n//  accompanying file LICENSE_1_0.txt or copy at\n//  http://www.boost.org/LICENSE_1_0.txt)\n//\n//  See http://www.boost.org/libs/smart_ptr/shared_ptr.htm for documentation.\n//\n\n#include <boost/config.hpp>   // for broken compiler workarounds\n\n#if defined(BOOST_NO_MEMBER_TEMPLATES) && !defined(BOOST_MSVC6_MEMBER_TEMPLATES)\n#include <boost/serialization/detail/shared_ptr_nmt_132.hpp>\n#else\n\n#include <boost/assert.hpp>\n#include <boost/checked_delete.hpp>\n#include <boost/serialization/throw_exception.hpp>\n#include <boost/detail/workaround.hpp>\n\n#include <boost/serialization/access.hpp>\n#include <boost/serialization/detail/shared_count_132.hpp>\n\n#include <memory>               // for std::auto_ptr\n#include <algorithm>            // for std::swap\n#include <functional>           // for std::less\n#include <typeinfo>             // for std::bad_cast\n#include <iosfwd>               // for std::basic_ostream\n\n#ifdef BOOST_MSVC  // moved here to work around VC++ compiler crash\n# pragma warning(push)\n# pragma warning(disable:4284) // odd return type for operator->\n#endif\n\nnamespace boost_132 {\n\ntemplate<class T> class weak_ptr;\ntemplate<class T> class enable_shared_from_this;\n\nnamespace detail\n{\n\nstruct static_cast_tag {};\nstruct const_cast_tag {};\nstruct dynamic_cast_tag {};\nstruct polymorphic_cast_tag {};\n\ntemplate<class T> struct shared_ptr_traits\n{\n    typedef T & reference;\n};\n\ntemplate<> struct shared_ptr_traits<void>\n{\n    typedef void reference;\n};\n\n#if !defined(BOOST_NO_CV_VOID_SPECIALIZATIONS)\n\ntemplate<> struct shared_ptr_traits<void const>\n{\n    typedef void reference;\n};\n\ntemplate<> struct shared_ptr_traits<void volatile>\n{\n    typedef void reference;\n};\n\ntemplate<> struct shared_ptr_traits<void const volatile>\n{\n    typedef void reference;\n};\n\n#endif\n\n// enable_shared_from_this support\n\ntemplate<class T, class Y> void sp_enable_shared_from_this( shared_count const & pn, enable_shared_from_this< T > const * pe, Y const * px )\n{\n    if(pe != 0) pe->_internal_weak_this._internal_assign(const_cast<Y*>(px), pn);\n}\n\ninline void sp_enable_shared_from_this( shared_count const & /*pn*/, ... )\n{\n}\n\n} // namespace detail\n\n\n//\n//  shared_ptr\n//\n//  An enhanced relative of scoped_ptr with reference counted copy semantics.\n//  The object pointed to is deleted when the last shared_ptr pointing to it\n//  is destroyed or reset.\n//\n\ntemplate<class T> class shared_ptr\n{\nprivate:\n    // Borland 5.5.1 specific workaround\n    typedef shared_ptr< T > this_type;\n\npublic:\n\n    typedef T element_type;\n    typedef T value_type;\n    typedef T * pointer;\n    typedef typename detail::shared_ptr_traits< T >::reference reference;\n\n    shared_ptr(): px(0), pn() // never throws in 1.30+\n    {\n    }\n\n    template<class Y>\n    explicit shared_ptr(Y * p): px(p), pn(p, boost::checked_deleter<Y>()) // Y must be complete\n    {\n        detail::sp_enable_shared_from_this( pn, p, p );\n    }\n\n    //\n    // Requirements: D's copy constructor must not throw\n    //\n    // shared_ptr will release p by calling d(p)\n    //\n\n    template<class Y, class D> shared_ptr(Y * p, D d): px(p), pn(p, d)\n    {\n        detail::sp_enable_shared_from_this( pn, p, p );\n    }\n\n//  generated copy constructor, assignment, destructor are fine...\n\n//  except that Borland C++ has a bug, and g++ with -Wsynth warns\n#if defined(__GNUC__)\n    shared_ptr & operator=(shared_ptr const & r) // never throws\n    {\n        px = r.px;\n        pn = r.pn; // shared_count::op= doesn't throw\n        return *this;\n    }\n#endif\n\n    template<class Y>\n    explicit shared_ptr(weak_ptr<Y> const & r): pn(r.pn) // may throw\n    {\n        // it is now safe to copy r.px, as pn(r.pn) did not throw\n        px = r.px;\n    }\n\n    template<class Y>\n    shared_ptr(shared_ptr<Y> const & r): px(r.px), pn(r.pn) // never throws\n    {\n    }\n\n    template<class Y>\n    shared_ptr(shared_ptr<Y> const & r, detail::static_cast_tag): px(static_cast<element_type *>(r.px)), pn(r.pn)\n    {\n    }\n\n    template<class Y>\n    shared_ptr(shared_ptr<Y> const & r, detail::const_cast_tag): px(const_cast<element_type *>(r.px)), pn(r.pn)\n    {\n    }\n\n    template<class Y>\n    shared_ptr(shared_ptr<Y> const & r, detail::dynamic_cast_tag): px(dynamic_cast<element_type *>(r.px)), pn(r.pn)\n    {\n        if(px == 0) // need to allocate new counter -- the cast failed\n        {\n            pn = detail::shared_count();\n        }\n    }\n\n    template<class Y>\n    shared_ptr(shared_ptr<Y> const & r, detail::polymorphic_cast_tag): px(dynamic_cast<element_type *>(r.px)), pn(r.pn)\n    {\n        if(px == 0)\n        {\n            boost::serialization::throw_exception(std::bad_cast());\n        }\n    }\n\n#ifndef BOOST_NO_AUTO_PTR\n\n    template<class Y>\n    explicit shared_ptr(std::auto_ptr<Y> & r): px(r.get()), pn()\n    {\n        Y * tmp = r.get();\n        pn = detail::shared_count(r);\n        detail::sp_enable_shared_from_this( pn, tmp, tmp );\n    }\n\n#endif\n\n#if !defined(BOOST_MSVC) || (BOOST_MSVC > 1200)\n\n    template<class Y>\n    shared_ptr & operator=(shared_ptr<Y> const & r) // never throws\n    {\n        px = r.px;\n        pn = r.pn; // shared_count::op= doesn't throw\n        return *this;\n    }\n\n#endif\n\n#ifndef BOOST_NO_AUTO_PTR\n\n    template<class Y>\n    shared_ptr & operator=(std::auto_ptr<Y> & r)\n    {\n        this_type(r).swap(*this);\n        return *this;\n    }\n\n#endif\n\n    void reset() // never throws in 1.30+\n    {\n        this_type().swap(*this);\n    }\n\n    template<class Y> void reset(Y * p) // Y must be complete\n    {\n        BOOST_ASSERT(p == 0 || p != px); // catch self-reset errors\n        this_type(p).swap(*this);\n    }\n\n    template<class Y, class D> void reset(Y * p, D d)\n    {\n        this_type(p, d).swap(*this);\n    }\n\n    reference operator* () const // never throws\n    {\n        BOOST_ASSERT(px != 0);\n        return *px;\n    }\n\n    T * operator-> () const // never throws\n    {\n        BOOST_ASSERT(px != 0);\n        return px;\n    }\n\n    T * get() const // never throws\n    {\n        return px;\n    }\n\n    // implicit conversion to \"bool\"\n\n#if defined(__SUNPRO_CC) && BOOST_WORKAROUND(__SUNPRO_CC, <= 0x530)\n\n    operator bool () const\n    {\n        return px != 0;\n    }\n\n#elif defined(__MWERKS__) && BOOST_WORKAROUND(__MWERKS__, BOOST_TESTED_AT(0x3003))\n    typedef T * (this_type::*unspecified_bool_type)() const;\n\n    operator unspecified_bool_type() const // never throws\n    {\n        return px == 0? 0: &this_type::get;\n    }\n\n#else\n\n    typedef T * this_type::*unspecified_bool_type;\n\n    operator unspecified_bool_type() const // never throws\n    {\n        return px == 0? 0: &this_type::px;\n    }\n\n#endif\n\n    // operator! is redundant, but some compilers need it\n\n    bool operator! () const // never throws\n    {\n        return px == 0;\n    }\n\n    bool unique() const // never throws\n    {\n        return pn.unique();\n    }\n\n    long use_count() const // never throws\n    {\n        return pn.use_count();\n    }\n\n    void swap(shared_ptr< T > & other) // never throws\n    {\n        std::swap(px, other.px);\n        pn.swap(other.pn);\n    }\n\n    template<class Y> bool _internal_less(shared_ptr<Y> const & rhs) const\n    {\n        return pn < rhs.pn;\n    }\n\n    void * _internal_get_deleter(std::type_info const & ti) const\n    {\n        return pn.get_deleter(ti);\n    }\n\n// Tasteless as this may seem, making all members public allows member templates\n// to work in the absence of member template friends. (Matthew Langston)\n\n#ifndef BOOST_NO_MEMBER_TEMPLATE_FRIENDS\n\nprivate:\n\n    template<class Y> friend class shared_ptr;\n    template<class Y> friend class weak_ptr;\n\n\n#endif\npublic: // for serialization\n    T * px;                     // contained pointer\n    detail::shared_count pn;    // reference counter\n\n};  // shared_ptr\n\ntemplate<class T, class U> inline bool operator==(shared_ptr< T > const & a, shared_ptr<U> const & b)\n{\n    return a.get() == b.get();\n}\n\ntemplate<class T, class U> inline bool operator!=(shared_ptr< T > const & a, shared_ptr<U> const & b)\n{\n    return a.get() != b.get();\n}\n\ntemplate<class T, class U> inline bool operator<(shared_ptr< T > const & a, shared_ptr<U> const & b)\n{\n    return a._internal_less(b);\n}\n\ntemplate<class T> inline void swap(shared_ptr< T > & a, shared_ptr< T > & b)\n{\n    a.swap(b);\n}\n\ntemplate<class T, class U> shared_ptr< T > static_pointer_cast(shared_ptr<U> const & r)\n{\n    return shared_ptr< T >(r, detail::static_cast_tag());\n}\n\ntemplate<class T, class U> shared_ptr< T > const_pointer_cast(shared_ptr<U> const & r)\n{\n    return shared_ptr< T >(r, detail::const_cast_tag());\n}\n\ntemplate<class T, class U> shared_ptr< T > dynamic_pointer_cast(shared_ptr<U> const & r)\n{\n    return shared_ptr< T >(r, detail::dynamic_cast_tag());\n}\n\n// shared_*_cast names are deprecated. Use *_pointer_cast instead.\n\ntemplate<class T, class U> shared_ptr< T > shared_static_cast(shared_ptr<U> const & r)\n{\n    return shared_ptr< T >(r, detail::static_cast_tag());\n}\n\ntemplate<class T, class U> shared_ptr< T > shared_dynamic_cast(shared_ptr<U> const & r)\n{\n    return shared_ptr< T >(r, detail::dynamic_cast_tag());\n}\n\ntemplate<class T, class U> shared_ptr< T > shared_polymorphic_cast(shared_ptr<U> const & r)\n{\n    return shared_ptr< T >(r, detail::polymorphic_cast_tag());\n}\n\ntemplate<class T, class U> shared_ptr< T > shared_polymorphic_downcast(shared_ptr<U> const & r)\n{\n    BOOST_ASSERT(dynamic_cast<T *>(r.get()) == r.get());\n    return shared_static_cast< T >(r);\n}\n\n// get_pointer() enables boost::mem_fn to recognize shared_ptr\n\ntemplate<class T> inline T * get_pointer(shared_ptr< T > const & p)\n{\n    return p.get();\n}\n\n// operator<<\n\n\ntemplate<class E, class T, class Y> std::basic_ostream<E, T> & operator<< (std::basic_ostream<E, T> & os, shared_ptr<Y> const & p)\n{\n    os << p.get();\n    return os;\n}\n\n// get_deleter (experimental)\n\n#if defined(__EDG_VERSION__) && (__EDG_VERSION__ <= 238)\n\n// g++ 2.9x doesn't allow static_cast<X const *>(void *)\n// apparently EDG 2.38 also doesn't accept it\n\ntemplate<class D, class T> D * get_deleter(shared_ptr< T > const & p)\n{\n    void const * q = p._internal_get_deleter(typeid(D));\n    return const_cast<D *>(static_cast<D const *>(q));\n}\n\n#else\n\ntemplate<class D, class T> D * get_deleter(shared_ptr< T > const & p)\n{\n    return static_cast<D *>(p._internal_get_deleter(typeid(D)));\n}\n\n#endif\n\n} // namespace boost\n\n#ifdef BOOST_MSVC\n# pragma warning(pop)\n#endif\n\n#endif  // #if defined(BOOST_NO_MEMBER_TEMPLATES) && !defined(BOOST_MSVC6_MEMBER_TEMPLATES)\n\n#endif  // #ifndef BOOST_SHARED_PTR_132_HPP_INCLUDED\n"
  },
  {
    "path": "include/boost/serialization/detail/shared_ptr_nmt_132.hpp",
    "content": "#ifndef BOOST_DETAIL_SHARED_PTR_NMT_132_HPP_INCLUDED\n#define BOOST_DETAIL_SHARED_PTR_NMT_132_HPP_INCLUDED\n\n//\n//  detail/shared_ptr_nmt.hpp - shared_ptr.hpp without member templates\n//\n//  (C) Copyright Greg Colvin and Beman Dawes 1998, 1999.\n//  Copyright (c) 2001, 2002 Peter Dimov\n//\n//  Distributed under the Boost Software License, Version 1.0. (See\n//  accompanying file LICENSE_1_0.txt or copy at\n//  http://www.boost.org/LICENSE_1_0.txt)\n//\n//  See http://www.boost.org/libs/smart_ptr/shared_ptr.htm for documentation.\n//\n\n#include <boost/assert.hpp>\n#include <boost/checked_delete.hpp>\n#include <boost/serialization/throw_exception.hpp>\n#include <boost/detail/atomic_count.hpp>\n\n#ifndef BOOST_NO_AUTO_PTR\n# include <memory>          // for std::auto_ptr\n#endif\n\n#include <algorithm>        // for std::swap\n#include <functional>       // for std::less\n#include <new>              // for std::bad_alloc\n\nnamespace boost\n{\n\ntemplate<class T> class shared_ptr\n{\nprivate:\n\n    typedef detail::atomic_count count_type;\n\npublic:\n\n    typedef T element_type;\n    typedef T value_type;\n\n    explicit shared_ptr(T * p = 0): px(p)\n    {\n#ifndef BOOST_NO_EXCEPTIONS\n\n        try  // prevent leak if new throws\n        {\n            pn = new count_type(1);\n        }\n        catch(...)\n        {\n            boost::checked_delete(p);\n            throw;\n        }\n\n#else\n\n        pn = new count_type(1);\n\n        if(pn == 0)\n        {\n            boost::checked_delete(p);\n            boost::serialization::throw_exception(std::bad_alloc());\n        }\n\n#endif\n    }\n\n    ~shared_ptr()\n    {\n        if(--*pn == 0)\n        {\n            boost::checked_delete(px);\n            delete pn;\n        }\n    }\n\n    shared_ptr(shared_ptr const & r): px(r.px)  // never throws\n    {\n        pn = r.pn;\n        ++*pn;\n    }\n\n    shared_ptr & operator=(shared_ptr const & r)\n    {\n        shared_ptr(r).swap(*this);\n        return *this;\n    }\n\n#ifndef BOOST_NO_AUTO_PTR\n\n    explicit shared_ptr(std::auto_ptr< T > & r)\n    {\n        pn = new count_type(1); // may throw\n        px = r.release(); // fix: moved here to stop leak if new throws\n    }\n\n    shared_ptr & operator=(std::auto_ptr< T > & r)\n    {\n        shared_ptr(r).swap(*this);\n        return *this;\n    }\n\n#endif\n\n    void reset(T * p = 0)\n    {\n        BOOST_ASSERT(p == 0 || p != px);\n        shared_ptr(p).swap(*this);\n    }\n\n    T & operator*() const  // never throws\n    {\n        BOOST_ASSERT(px != 0);\n        return *px;\n    }\n\n    T * operator->() const  // never throws\n    {\n        BOOST_ASSERT(px != 0);\n        return px;\n    }\n\n    T * get() const  // never throws\n    {\n        return px;\n    }\n\n    long use_count() const  // never throws\n    {\n        return *pn;\n    }\n\n    bool unique() const  // never throws\n    {\n        return *pn == 1;\n    }\n\n    void swap(shared_ptr< T > & other)  // never throws\n    {\n        std::swap(px, other.px);\n        std::swap(pn, other.pn);\n    }\n\nprivate:\n\n    T * px;            // contained pointer\n    count_type * pn;   // ptr to reference counter\n};\n\ntemplate<class T, class U> inline bool operator==(shared_ptr< T > const & a, shared_ptr<U> const & b)\n{\n    return a.get() == b.get();\n}\n\ntemplate<class T, class U> inline bool operator!=(shared_ptr< T > const & a, shared_ptr<U> const & b)\n{\n    return a.get() != b.get();\n}\n\ntemplate<class T> inline bool operator<(shared_ptr< T > const & a, shared_ptr< T > const & b)\n{\n    return std::less<T*>()(a.get(), b.get());\n}\n\ntemplate<class T> void swap(shared_ptr< T > & a, shared_ptr< T > & b)\n{\n    a.swap(b);\n}\n\n// get_pointer() enables boost::mem_fn to recognize shared_ptr\n\ntemplate<class T> inline T * get_pointer(shared_ptr< T > const & p)\n{\n    return p.get();\n}\n\n} // namespace boost\n\n#endif  // #ifndef BOOST_DETAIL_SHARED_PTR_NMT_132_HPP_INCLUDED\n"
  },
  {
    "path": "include/boost/serialization/detail/stack_constructor.hpp",
    "content": "#ifndef  BOOST_SERIALIZATION_DETAIL_STACK_CONSTRUCTOR_HPP\n#define BOOST_SERIALIZATION_DETAIL_STACK_CONSTRUCTOR_HPP\n\n// MS compatible compilers support #pragma once\n#if defined(_MSC_VER)\n# pragma once\n#endif\n\n/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// stack_constructor.hpp: serialization for loading stl collections\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for updates, documentation, and revision history.\n\n#include <boost/aligned_storage.hpp>\n#include <boost/serialization/serialization.hpp>\n\nnamespace boost{\nnamespace serialization {\nnamespace detail {\n\n// reserve space on stack for an object of type T without actually\n// construction such an object\ntemplate<typename T >\nstruct stack_allocate\n{\n    T * address() {\n        return static_cast<T*>(storage_.address());\n    }\n    T & reference() {\n        return * address();\n    }\nprivate:\n    typedef typename boost::aligned_storage<\n        sizeof(T),\n        boost::alignment_of<T>::value\n    > type;\n    type storage_;\n};\n\n// construct element on the stack\ntemplate<class Archive, class T>\nstruct stack_construct : public stack_allocate<T>\n{\n    stack_construct(Archive & ar, const unsigned int version){\n        // note borland emits a no-op without the explicit namespace\n        boost::serialization::load_construct_data_adl(\n            ar,\n            this->address(),\n            version\n        );\n    }\n    ~stack_construct(){\n        this->address()->~T(); // undo load_construct_data above\n    }\n};\n\n} // detail\n} // serialization\n} // boost\n\n#endif //  BOOST_SERIALIZATION_DETAIL_STACH_CONSTRUCTOR_HPP\n"
  },
  {
    "path": "include/boost/serialization/export.hpp",
    "content": "#ifndef BOOST_SERIALIZATION_EXPORT_HPP\n#define BOOST_SERIALIZATION_EXPORT_HPP\n\n// MS compatible compilers support #pragma once\n#if defined(_MSC_VER)\n# pragma once\n#endif\n\n/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// export.hpp: set traits of classes to be serialized\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for updates, documentation, and revision history.\n\n// (C) Copyright 2006 David Abrahams - http://www.boost.org.\n// implementation of class export functionality.  This is an alternative to\n// \"forward declaration\" method to provoke instantiation of derived classes\n// that are to be serialized through pointers.\n\n#include <utility>\n#include <cstddef> // NULL\n\n#include <boost/config.hpp>\n#include <boost/static_assert.hpp>\n#include <boost/preprocessor/stringize.hpp>\n#include <boost/type_traits/is_polymorphic.hpp>\n\n#include <boost/mpl/assert.hpp>\n#include <boost/mpl/and.hpp>\n#include <boost/mpl/not.hpp>\n#include <boost/mpl/bool_fwd.hpp>\n\n#include <boost/serialization/extended_type_info.hpp> // for guid_defined only\n#include <boost/serialization/static_warning.hpp>\n#include <boost/serialization/assume_abstract.hpp>\n#include <boost/serialization/force_include.hpp>\n#include <boost/serialization/singleton.hpp>\n\n#include <boost/archive/detail/register_archive.hpp>\n\nnamespace boost {\nnamespace archive {\nnamespace detail {\n\nclass basic_pointer_iserializer;\nclass basic_pointer_oserializer;\n\ntemplate<class Archive, class T>\nclass pointer_iserializer;\ntemplate<class Archive, class T>\nclass pointer_oserializer;\n\ntemplate <class Archive, class Serializable>\nstruct export_impl\n{\n    static const basic_pointer_iserializer &\n    enable_load(mpl::true_){\n        return boost::serialization::singleton<\n            pointer_iserializer<Archive, Serializable>\n        >::get_const_instance();\n    }\n\n    static const basic_pointer_oserializer &\n    enable_save(mpl::true_){\n        return boost::serialization::singleton<\n            pointer_oserializer<Archive, Serializable>\n        >::get_const_instance();\n    }\n    inline static void enable_load(mpl::false_) {}\n    inline static void enable_save(mpl::false_) {}\n};\n\n// On many platforms, naming a specialization of this template is\n// enough to cause its argument to be instantiated.\ntemplate <void(*)()>\nstruct instantiate_function {};\n\ntemplate <class Archive, class Serializable>\nstruct ptr_serialization_support\n{\n# if defined(BOOST_MSVC) || defined(__SUNPRO_CC)\n    virtual BOOST_DLLEXPORT void instantiate() BOOST_USED;\n# else\n    static BOOST_DLLEXPORT void instantiate() BOOST_USED;\n    typedef instantiate_function<\n        &ptr_serialization_support::instantiate\n    > x;\n# endif\n};\n\ntemplate <class Archive, class Serializable>\nBOOST_DLLEXPORT void\nptr_serialization_support<Archive,Serializable>::instantiate()\n{\n    export_impl<Archive,Serializable>::enable_save(\n        typename Archive::is_saving()\n    );\n\n    export_impl<Archive,Serializable>::enable_load(\n        typename Archive::is_loading()\n    );\n}\n\n// Note INTENTIONAL usage of anonymous namespace in header.\n// This was made this way so that export.hpp could be included\n// in other headers.  This is still under study.\n\nnamespace extra_detail {\n\ntemplate<class T>\nstruct guid_initializer\n{\n    void export_guid(mpl::false_) const {\n        // generates the statically-initialized objects whose constructors\n        // register the information allowing serialization of T objects\n        // through pointers to their base classes.\n        instantiate_ptr_serialization((T*)0, 0, adl_tag());\n    }\n    void export_guid(mpl::true_) const {\n    }\n    guid_initializer const & export_guid() const {\n        BOOST_STATIC_WARNING(boost::is_polymorphic< T >::value);\n        // note: exporting an abstract base class will have no effect\n        // and cannot be used to instantiate serialization code\n        // (one might be using this in a DLL to instantiate code)\n        //BOOST_STATIC_WARNING(! boost::serialization::is_abstract< T >::value);\n        export_guid(boost::serialization::is_abstract< T >());\n        return *this;\n    }\n};\n\ntemplate<typename T>\nstruct init_guid;\n\n} // anonymous\n} // namespace detail\n} // namespace archive\n} // namespace boost\n\n#define BOOST_CLASS_EXPORT_IMPLEMENT(T)                      \\\n    namespace boost {                                        \\\n    namespace archive {                                      \\\n    namespace detail {                                       \\\n    namespace extra_detail {                                 \\\n    template<>                                               \\\n    struct init_guid< T > {                                  \\\n        static guid_initializer< T > const & g;              \\\n    };                                                       \\\n    guid_initializer< T > const & init_guid< T >::g =        \\\n        ::boost::serialization::singleton<                   \\\n            guid_initializer< T >                            \\\n        >::get_mutable_instance().export_guid();             \\\n    }}}}                                                     \\\n/**/\n\n#define BOOST_CLASS_EXPORT_KEY2(T, K)          \\\nnamespace boost {                              \\\nnamespace serialization {                      \\\ntemplate<>                                     \\\nstruct guid_defined< T > : boost::mpl::true_ {}; \\\ntemplate<>                                     \\\ninline const char * guid< T >(){                 \\\n    return K;                                  \\\n}                                              \\\n} /* serialization */                          \\\n} /* boost */                                  \\\n/**/\n\n#define BOOST_CLASS_EXPORT_KEY(T)                                      \\\n    BOOST_CLASS_EXPORT_KEY2(T, BOOST_PP_STRINGIZE(T))                                                                  \\\n/**/\n\n#define BOOST_CLASS_EXPORT_GUID(T, K)                                  \\\nBOOST_CLASS_EXPORT_KEY2(T, K)                                          \\\nBOOST_CLASS_EXPORT_IMPLEMENT(T)                                        \\\n/**/\n\n#if BOOST_WORKAROUND(__MWERKS__, BOOST_TESTED_AT(0x3205))\n\n// CodeWarrior fails to construct static members of class templates\n// when they are instantiated from within templates, so on that\n// compiler we ask users to specifically register base/derived class\n// relationships for exported classes.  On all other compilers, use of\n// this macro is entirely optional.\n# define BOOST_SERIALIZATION_MWERKS_BASE_AND_DERIVED(Base,Derived)             \\\nnamespace {                                                                    \\\n  static int BOOST_PP_CAT(boost_serialization_mwerks_init_, __LINE__) =        \\\n  (::boost::archive::detail::instantiate_ptr_serialization((Derived*)0,0), 3); \\\n  static int BOOST_PP_CAT(boost_serialization_mwerks_init2_, __LINE__) = (     \\\n      ::boost::serialization::void_cast_register((Derived*)0,(Base*)0)         \\\n    , 3);                                                                      \\\n}\n\n#else\n\n# define BOOST_SERIALIZATION_MWERKS_BASE_AND_DERIVED(Base,Derived)\n\n#endif\n\n// check for unnecessary export.  T isn't polymorphic so there is no\n// need to export it.\n#define BOOST_CLASS_EXPORT_CHECK(T)                              \\\n    BOOST_STATIC_WARNING(                                        \\\n        boost::is_polymorphic<U>::value                          \\\n    );                                                           \\\n    /**/\n\n// the default exportable class identifier is the class name\n// the default list of archives types for which code id generated\n// are the originally included with this serialization system\n#define BOOST_CLASS_EXPORT(T)                   \\\n    BOOST_CLASS_EXPORT_GUID(                    \\\n        T,                                      \\\n        BOOST_PP_STRINGIZE(T)                   \\\n    )                                           \\\n    /**/\n\n#endif // BOOST_SERIALIZATION_EXPORT_HPP\n\n"
  },
  {
    "path": "include/boost/serialization/extended_type_info.hpp",
    "content": "#ifndef BOOST_SERIALIZATION_EXTENDED_TYPE_INFO_HPP\n#define BOOST_SERIALIZATION_EXTENDED_TYPE_INFO_HPP\n\n// MS compatible compilers support #pragma once\n#if defined(_MSC_VER)\n# pragma once\n#endif\n\n/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// extended_type_info.hpp: interface for portable version of type_info\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for updates, documentation, and revision history.\n\n// for now, extended type info is part of the serialization libraries\n// this could change in the future.\n#include <cstdarg>\n#include <boost/assert.hpp>\n#include <cstddef> // NULL\n#include <boost/config.hpp>\n#include <boost/noncopyable.hpp>\n#include <boost/mpl/bool.hpp>\n\n#include <boost/serialization/config.hpp>\n#include <boost/config/abi_prefix.hpp> // must be the last header\n#ifdef BOOST_MSVC\n#  pragma warning(push)\n#  pragma warning(disable : 4251 4231 4660 4275)\n#endif\n\n#define BOOST_SERIALIZATION_MAX_KEY_SIZE 128\n\nnamespace boost {\nnamespace serialization {\n\nnamespace void_cast_detail{\n    class void_caster;\n}\n\nclass BOOST_SYMBOL_VISIBLE extended_type_info :\n    private boost::noncopyable\n{\nprivate:\n    friend class boost::serialization::void_cast_detail::void_caster;\n\n    // used to uniquely identify the type of class derived from this one\n    // so that different derivations of this class can be simultaneously\n    // included in implementation of sets and maps.\n    const unsigned int m_type_info_key;\n    virtual bool is_less_than(const extended_type_info & /*rhs*/) const = 0;\n    virtual bool is_equal(const extended_type_info & /*rhs*/) const = 0;\n    const char * m_key;\n\nprotected:\n    BOOST_SERIALIZATION_DECL void key_unregister() const;\n    BOOST_SERIALIZATION_DECL void key_register() const;\n    // this class can't be used as is. It's just the\n    // common functionality for all type_info replacement\n    // systems.  Hence, make these protected\n    BOOST_SERIALIZATION_DECL extended_type_info(\n        const unsigned int type_info_key,\n        const char * key\n    );\n    virtual BOOST_SERIALIZATION_DECL ~extended_type_info();\npublic:\n    const char * get_key() const {\n        return m_key;\n    }\n    virtual const char * get_debug_info() const = 0;\n    BOOST_SERIALIZATION_DECL bool operator<(const extended_type_info &rhs) const;\n    BOOST_SERIALIZATION_DECL bool operator==(const extended_type_info &rhs) const;\n    bool operator!=(const extended_type_info &rhs) const {\n        return !(operator==(rhs));\n    }\n    // note explicit \"export\" of static function to work around\n    // gcc 4.5 mingw error\n    static BOOST_SERIALIZATION_DECL const extended_type_info *\n    find(const char *key);\n    // for plugins\n    virtual void * construct(unsigned int /*count*/ = 0, ...) const = 0;\n    virtual void destroy(void const * const /*p*/) const = 0;\n};\n\ntemplate<class T>\nstruct guid_defined : boost::mpl::false_ {};\n\nnamespace ext {\n    template <typename T>\n    struct guid_impl\n    {\n        static inline const char * call()\n        {\n            return NULL;\n        }\n    };\n}\n\ntemplate<class T>\ninline const char * guid(){\n    return ext::guid_impl<T>::call();\n}\n\n} // namespace serialization\n} // namespace boost\n\n#ifdef BOOST_MSVC\n#pragma warning(pop)\n#endif\n\n#include <boost/config/abi_suffix.hpp> // pops abi_suffix.hpp pragmas\n\n#endif // BOOST_SERIALIZATION_EXTENDED_TYPE_INFO_HPP\n"
  },
  {
    "path": "include/boost/serialization/extended_type_info_no_rtti.hpp",
    "content": "#ifndef BOOST_EXTENDED_TYPE_INFO_NO_RTTI_HPP\n#define BOOST_EXTENDED_TYPE_INFO_NO_RTTI_HPP\n\n/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// MS compatible compilers support #pragma once\n#if defined(_MSC_VER)\n# pragma once\n#endif\n\n// extended_type_info_no_rtti.hpp: implementation for version that depends\n// on runtime typing (rtti - typeid) but uses a user specified string\n// as the portable class identifier.\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for updates, documentation, and revision history.\n#include <boost/assert.hpp>\n\n#include <boost/config.hpp>\n#include <boost/static_assert.hpp>\n\n#include <boost/mpl/if.hpp>\n#include <boost/type_traits/is_polymorphic.hpp>\n#include <boost/type_traits/remove_const.hpp>\n\n#include <boost/detail/workaround.hpp>\n\n#include <boost/serialization/static_warning.hpp>\n#include <boost/serialization/singleton.hpp>\n#include <boost/serialization/extended_type_info.hpp>\n#include <boost/serialization/factory.hpp>\n#include <boost/serialization/throw_exception.hpp>\n\n#include <boost/serialization/config.hpp>\n// hijack serialization access\n#include <boost/serialization/access.hpp>\n\n#include <boost/config/abi_prefix.hpp> // must be the last header\n#ifdef BOOST_MSVC\n#  pragma warning(push)\n#  pragma warning(disable : 4251 4231 4660 4275 4511 4512)\n#endif\n\nnamespace boost {\nnamespace serialization {\n///////////////////////////////////////////////////////////////////////\n// define a special type_info that doesn't depend on rtti which is not\n// available in all situations.\n\nnamespace no_rtti_system {\n\n// common base class to share type_info_key.  This is used to\n// identify the method used to keep track of the extended type\nclass BOOST_SYMBOL_VISIBLE extended_type_info_no_rtti_0 :\n    public extended_type_info\n{\nprotected:\n    BOOST_SERIALIZATION_DECL extended_type_info_no_rtti_0(const char * key);\n    BOOST_SERIALIZATION_DECL ~extended_type_info_no_rtti_0() BOOST_OVERRIDE;\npublic:\n    BOOST_SERIALIZATION_DECL bool\n    is_less_than(const boost::serialization::extended_type_info &rhs) const BOOST_OVERRIDE;\n    BOOST_SERIALIZATION_DECL bool\n    is_equal(const boost::serialization::extended_type_info &rhs) const BOOST_OVERRIDE;\n};\n\n} // no_rtti_system\n\ntemplate<class T>\nclass extended_type_info_no_rtti :\n    public no_rtti_system::extended_type_info_no_rtti_0,\n    public singleton<extended_type_info_no_rtti< T > >\n{\n    template<bool tf>\n    struct action {\n        struct defined {\n            static const char * invoke(){\n                return guid< T >();\n            }\n        };\n        struct undefined {\n            // if your program traps here - you failed to\n            // export a guid for this type.  the no_rtti\n            // system requires export for types serialized\n            // as pointers.\n            BOOST_STATIC_ASSERT(0 == sizeof(T));\n            static const char * invoke();\n        };\n        static const char * invoke(){\n            typedef\n                typename boost::mpl::if_c<\n                    tf,\n                    defined,\n                    undefined\n                >::type type;\n            return type::invoke();\n        }\n    };\npublic:\n    extended_type_info_no_rtti() :\n        no_rtti_system::extended_type_info_no_rtti_0(\n            action<guid_defined< T >::value >::invoke())\n    {\n        key_register();\n    }\n    ~extended_type_info_no_rtti() BOOST_OVERRIDE {\n        key_unregister();\n    }\n    const extended_type_info *\n    get_derived_extended_type_info(const T & t) const {\n        // find the type that corresponds to the most derived type.\n        // this implementation doesn't depend on typeid() but assumes\n        // that the specified type has a function of the following signature.\n        // A common implementation of such a function is to define as a virtual\n        // function. So if the type is not a polymorphic type it's likely an error\n        BOOST_STATIC_WARNING(boost::is_polymorphic< T >::value);\n        const char * derived_key = t.get_key();\n        BOOST_ASSERT(NULL != derived_key);\n        return boost::serialization::extended_type_info::find(derived_key);\n    }\n    const char * get_key() const{\n        return action<guid_defined< T >::value >::invoke();\n    }\n    const char * get_debug_info() const BOOST_OVERRIDE {\n        return action<guid_defined< T >::value >::invoke();\n    }\n    void * construct(unsigned int count, ...) const BOOST_OVERRIDE {\n        // count up the arguments\n        void * r = NULL;\n        std::va_list ap;\n        va_start(ap, count);\n        switch(count){\n        case 0:\n            r = factory<typename boost::remove_const< T >::type, 0>(ap); break;\n        case 1:\n            r = factory<typename boost::remove_const< T >::type, 1>(ap); break;\n        case 2:\n            r = factory<typename boost::remove_const< T >::type, 2>(ap); break;\n        case 3:\n            r = factory<typename boost::remove_const< T >::type, 3>(ap); break;\n        case 4:\n            r = factory<typename boost::remove_const< T >::type, 4>(ap); break;\n        default:\n            BOOST_ASSERT(false); // too many arguments\n            // throw exception here?\n        }\n        va_end(ap);\n        return r;\n    }\n    void destroy(void const * const p) const BOOST_OVERRIDE {\n        boost::serialization::access::destroy(\n            static_cast<T const *>(p)\n        );\n        //delete static_cast<T const * const>(p) ;\n    }\n};\n\n} // namespace serialization\n} // namespace boost\n\n///////////////////////////////////////////////////////////////////////////////\n// If no other implementation has been designated as default,\n// use this one.  To use this implementation as the default, specify it\n// before any of the other headers.\n\n#ifndef BOOST_SERIALIZATION_DEFAULT_TYPE_INFO\n    #define BOOST_SERIALIZATION_DEFAULT_TYPE_INFO\n    namespace boost {\n    namespace serialization {\n    template<class T>\n    struct extended_type_info_impl {\n        typedef typename\n            boost::serialization::extended_type_info_no_rtti< T > type;\n    };\n    } // namespace serialization\n    } // namespace boost\n#endif\n\n#ifdef BOOST_MSVC\n#  pragma warning(pop)\n#endif\n#include <boost/config/abi_suffix.hpp> // pops abi_suffix.hpp pragmas\n\n#endif // BOOST_EXTENDED_TYPE_INFO_NO_RTTI_HPP\n"
  },
  {
    "path": "include/boost/serialization/extended_type_info_typeid.hpp",
    "content": "#ifndef BOOST_SERIALIZATION_EXTENDED_TYPE_INFO_TYPEID_HPP\n#define BOOST_SERIALIZATION_EXTENDED_TYPE_INFO_TYPEID_HPP\n\n/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// MS compatible compilers support #pragma once\n#if defined(_MSC_VER)\n# pragma once\n#endif\n\n// extended_type_info_typeid.hpp: implementation for version that depends\n// on runtime typing (rtti - typeid) but uses a user specified string\n// as the portable class identifier.\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for updates, documentation, and revision history.\n\n#include <typeinfo>\n#include <cstdarg>\n#include <boost/assert.hpp>\n#include <boost/config.hpp>\n\n#include <boost/static_assert.hpp>\n#include <boost/serialization/static_warning.hpp>\n#include <boost/type_traits/is_polymorphic.hpp>\n#include <boost/type_traits/remove_const.hpp>\n\n#include <boost/serialization/config.hpp>\n#include <boost/serialization/singleton.hpp>\n#include <boost/serialization/extended_type_info.hpp>\n#include <boost/serialization/factory.hpp>\n\n// hijack serialization access\n#include <boost/serialization/access.hpp>\n\n#include <boost/mpl/if.hpp>\n\n#include <boost/config/abi_prefix.hpp> // must be the last header\n\n#ifdef BOOST_MSVC\n#  pragma warning(push)\n#  pragma warning(disable : 4251 4231 4660 4275 4511 4512)\n#endif\n\nnamespace boost {\nnamespace serialization {\nnamespace typeid_system {\n\nclass BOOST_SYMBOL_VISIBLE extended_type_info_typeid_0 :\n    public extended_type_info\n{\n    const char * get_debug_info() const BOOST_OVERRIDE {\n        if(static_cast<const std::type_info *>(0) == m_ti)\n            return static_cast<const char *>(0);\n        return m_ti->name();\n    }\nprotected:\n    const std::type_info * m_ti;\n    BOOST_SERIALIZATION_DECL extended_type_info_typeid_0(const char * key);\n    BOOST_SERIALIZATION_DECL ~extended_type_info_typeid_0() BOOST_OVERRIDE;\n    BOOST_SERIALIZATION_DECL void type_register(const std::type_info & ti);\n    BOOST_SERIALIZATION_DECL void type_unregister();\n    BOOST_SERIALIZATION_DECL const extended_type_info *\n    get_extended_type_info(const std::type_info & ti) const;\npublic:\n    BOOST_SERIALIZATION_DECL bool\n    is_less_than(const extended_type_info &rhs) const BOOST_OVERRIDE;\n    BOOST_SERIALIZATION_DECL bool\n    is_equal(const extended_type_info &rhs) const BOOST_OVERRIDE;\n    const std::type_info & get_typeid() const {\n        return *m_ti;\n    }\n};\n\n} // typeid_system\n\ntemplate<class T>\nclass extended_type_info_typeid :\n    public typeid_system::extended_type_info_typeid_0,\n    public singleton<extended_type_info_typeid< T > >\n{\npublic:\n    extended_type_info_typeid() :\n        typeid_system::extended_type_info_typeid_0(\n            boost::serialization::guid< T >()\n        )\n    {\n        type_register(typeid(T));\n        key_register();\n    }\n    ~extended_type_info_typeid() BOOST_OVERRIDE {\n        key_unregister();\n        type_unregister();\n    }\n    // get the eti record for the true type of this record\n    // relying upon standard type info implementation (rtti)\n    const extended_type_info *\n    get_derived_extended_type_info(const T & t) const {\n        // note: this implementation - based on usage of typeid (rtti)\n        // only does something if the class has at least one virtual function.\n        BOOST_STATIC_WARNING(boost::is_polymorphic< T >::value);\n        return\n            typeid_system::extended_type_info_typeid_0::get_extended_type_info(\n                typeid(t)\n            );\n    }\n    const char * get_key() const {\n        return boost::serialization::guid< T >();\n    }\n    void * construct(unsigned int count, ...) const BOOST_OVERRIDE {\n        // count up the arguments\n        void * r = NULL;\n        std::va_list ap;\n        va_start(ap, count);\n        switch(count){\n        case 0:\n            r = factory<typename boost::remove_const< T >::type, 0>(ap); break;\n        case 1:\n            r = factory<typename boost::remove_const< T >::type, 1>(ap); break;\n        case 2:\n            r = factory<typename boost::remove_const< T >::type, 2>(ap); break;\n        case 3:\n            r = factory<typename boost::remove_const< T >::type, 3>(ap); break;\n        case 4:\n            r = factory<typename boost::remove_const< T >::type, 4>(ap); break;\n        default:\n            BOOST_ASSERT(false); // too many arguments\n            // throw exception here?\n        }\n        va_end(ap);\n        return r;\n    }\n    void destroy(void const * const p) const BOOST_OVERRIDE {\n        boost::serialization::access::destroy(\n            static_cast<T const *>(p)\n        );\n        //delete static_cast<T const * const>(p);\n    }\n};\n\n} // namespace serialization\n} // namespace boost\n\n///////////////////////////////////////////////////////////////////////////////\n// If no other implementation has been designated as default,\n// use this one.  To use this implementation as the default, specify it\n// before any of the other headers.\n#ifndef BOOST_SERIALIZATION_DEFAULT_TYPE_INFO\n    #define BOOST_SERIALIZATION_DEFAULT_TYPE_INFO\n    namespace boost {\n    namespace serialization {\n    template<class T>\n    struct extended_type_info_impl {\n        typedef typename\n            boost::serialization::extended_type_info_typeid< T > type;\n    };\n    } // namespace serialization\n    } // namespace boost\n#endif\n\n#ifdef BOOST_MSVC\n#pragma warning(pop)\n#endif\n#include <boost/config/abi_suffix.hpp> // pops abi_suffix.hpp pragmas\n\n#endif // BOOST_SERIALIZATION_EXTENDED_TYPE_INFO_TYPEID_HPP\n"
  },
  {
    "path": "include/boost/serialization/factory.hpp",
    "content": "#ifndef BOOST_SERIALIZATION_FACTORY_HPP\n#define BOOST_SERIALIZATION_FACTORY_HPP\n\n/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// MS compatible compilers support #pragma once\n#if defined(_MSC_VER)\n# pragma once\n#endif\n\n// factory.hpp: create an instance from an extended_type_info instance.\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for updates, documentation, and revision history.\n\n#include <cstdarg> // valist\n#include <cstddef> // NULL\n\n#include <boost/preprocessor/control/if.hpp>\n#include <boost/preprocessor/comparison/greater.hpp>\n#include <boost/assert.hpp>\n\nnamespace std{\n    #if defined(__LIBCOMO__)\n        using ::va_list;\n    #endif\n} // namespace std\n\nnamespace boost {\nnamespace serialization {\n\n// default implementation does nothing.\ntemplate<class T, int N>\nT * factory(std::va_list){\n    BOOST_ASSERT(false);\n    // throw exception here?\n    return NULL;\n}\n\n} // namespace serialization\n} // namespace boost\n\n#define BOOST_SERIALIZATION_FACTORY(N, T, A0, A1, A2, A3) \\\nnamespace boost {                                         \\\nnamespace serialization {                                 \\\n    template<>                                            \\\n    T * factory<T, N>(std::va_list ap){                   \\\n        BOOST_PP_IF(BOOST_PP_GREATER(N, 0)                \\\n            , A0 a0 = va_arg(ap, A0);, BOOST_PP_EMPTY())  \\\n        BOOST_PP_IF(BOOST_PP_GREATER(N, 1)                \\\n            , A1 a1 = va_arg(ap, A1);, BOOST_PP_EMPTY())  \\\n        BOOST_PP_IF(BOOST_PP_GREATER(N, 2)                \\\n            , A2 a2 = va_arg(ap, A2);, BOOST_PP_EMPTY())  \\\n        BOOST_PP_IF(BOOST_PP_GREATER(N, 3)                \\\n            , A3 a3 = va_arg(ap, A3);, BOOST_PP_EMPTY())  \\\n        return new T(                                     \\\n            BOOST_PP_IF(BOOST_PP_GREATER(N, 0)            \\\n                , a0, BOOST_PP_EMPTY())                   \\\n            BOOST_PP_IF(BOOST_PP_GREATER(N, 1))           \\\n                , BOOST_PP_COMMA, BOOST_PP_EMPTY)()       \\\n            BOOST_PP_IF(BOOST_PP_GREATER(N, 1)            \\\n                , a1, BOOST_PP_EMPTY())                   \\\n            BOOST_PP_IF(BOOST_PP_GREATER(N, 2))           \\\n                , BOOST_PP_COMMA, BOOST_PP_EMPTY)()       \\\n            BOOST_PP_IF(BOOST_PP_GREATER(N, 2)            \\\n                , a2, BOOST_PP_EMPTY())                   \\\n            BOOST_PP_IF(BOOST_PP_GREATER(N, 3))           \\\n                , BOOST_PP_COMMA, BOOST_PP_EMPTY)()       \\\n            BOOST_PP_IF(BOOST_PP_GREATER(N, 3)            \\\n                , a3, BOOST_PP_EMPTY())                   \\\n        );                                                \\\n    }                                                     \\\n}                                                         \\\n}   /**/\n\n#define BOOST_SERIALIZATION_FACTORY_4(T, A0, A1, A2, A3) \\\n    BOOST_SERIALIZATION_FACTORY(4, T, A0, A1, A2, A3)\n\n#define BOOST_SERIALIZATION_FACTORY_3(T, A0, A1, A2)     \\\n    BOOST_SERIALIZATION_FACTORY(3, T, A0, A1, A2, 0)\n\n#define BOOST_SERIALIZATION_FACTORY_2(T, A0, A1)         \\\n    BOOST_SERIALIZATION_FACTORY(2, T, A0, A1, 0, 0)\n\n#define BOOST_SERIALIZATION_FACTORY_1(T, A0)             \\\n    BOOST_SERIALIZATION_FACTORY(1, T, A0, 0, 0, 0)\n\n#define BOOST_SERIALIZATION_FACTORY_0(T)                 \\\nnamespace boost {                                        \\\nnamespace serialization {                                \\\n    template<>                                           \\\n    T * factory<T, 0>(std::va_list){                     \\\n        return new T();                                  \\\n    }                                                    \\\n}                                                        \\\n}                                                        \\\n/**/\n\n#endif // BOOST_SERIALIZATION_FACTORY_HPP\n"
  },
  {
    "path": "include/boost/serialization/force_include.hpp",
    "content": "#ifndef BOOST_SERIALIZATION_FORCE_INCLUDE_HPP\n#define BOOST_SERIALIZATION_FORCE_INCLUDE_HPP\n\n// MS compatible compilers support #pragma once\n#if defined(_MSC_VER)\n# pragma once\n#endif\n\n/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// force_include.hpp:\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for updates, documentation, and revision history.\n\n#include <boost/config.hpp>\n\n// the following help macro is to guarantee that certain coded\n// is not removed by over-eager linker optimiser.  In certain cases\n// we create static objects must be created but are actually never\n// referenced - creation has a side-effect such as global registration\n// which is important to us. We make an effort to refer these objects\n// so that a smart linker won't remove them as being unreferenced.\n// In microsoft compilers, inlining the code that does the referring\n// means the code gets lost and the static object is not included\n// in the library and hence never registered.  This manifests itself\n// in an ungraceful crash at runtime when (and only when) built in\n// release mode.\n\n#if defined(BOOST_HAS_DECLSPEC) && !defined(__COMO__)\n#   define BOOST_DLLEXPORT __declspec(dllexport)\n#elif ! defined(_WIN32) && ! defined(_WIN64)\n#   if defined(__MWERKS__)\n#       define BOOST_DLLEXPORT __declspec(dllexport)\n#   elif defined(__GNUC__) && (__GNUC__ >= 3)\n#       define BOOST_USED __attribute__ ((__used__))\n#   elif defined(__IBMCPP__) && (__IBMCPP__ >= 1110)\n#       define BOOST_USED __attribute__ ((__used__))\n#   elif defined(__INTEL_COMPILER) && (BOOST_INTEL_CXX_VERSION >= 800)\n#       define BOOST_USED __attribute__ ((__used__))\n#   endif\n#endif\n\n#ifndef BOOST_USED\n#    define BOOST_USED\n#endif\n\n#ifndef BOOST_DLLEXPORT\n#    define BOOST_DLLEXPORT\n#endif\n\n#endif // BOOST_SERIALIZATION_FORCE_INCLUDE_HPP\n"
  },
  {
    "path": "include/boost/serialization/forward_list.hpp",
    "content": "#ifndef BOOST_SERIALIZATION_FORWARD_LIST_HPP\n#define BOOST_SERIALIZATION_FORWARD_LIST_HPP\n\n// MS compatible compilers support #pragma once\n#if defined(_MSC_VER)\n# pragma once\n#endif\n\n/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// forward_list.hpp\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for updates, documentation, and revision history.\n\n#include <boost/config.hpp>\n\n#include <forward_list>\n#include <iterator>  // distance\n\n#include <boost/serialization/collections_save_imp.hpp>\n#include <boost/serialization/collections_load_imp.hpp>\n#include <boost/serialization/nvp.hpp>\n#include <boost/serialization/collection_size_type.hpp>\n#include <boost/serialization/item_version_type.hpp>\n#include <boost/serialization/library_version_type.hpp>\n#include <boost/serialization/split_free.hpp>\n#include <boost/serialization/detail/stack_constructor.hpp>\n#include <boost/serialization/detail/is_default_constructible.hpp>\n#include <boost/move/utility_core.hpp>\n\nnamespace boost {\nnamespace serialization {\n\ntemplate<class Archive, class U, class Allocator>\ninline void save(\n    Archive & ar,\n    const std::forward_list<U, Allocator> &t,\n    const unsigned int /*file_version*/\n){\n    const collection_size_type count(std::distance(t.cbegin(), t.cend()));\n    boost::serialization::stl::save_collection<\n        Archive,\n        std::forward_list<U, Allocator>\n    >(ar, t, count);\n}\n\nnamespace stl {\n\ntemplate<\n    class Archive,\n    class T,\n    class Allocator\n>\ntypename boost::disable_if<\n    typename detail::is_default_constructible<\n        typename std::forward_list<T, Allocator>::value_type\n    >,\n    void\n>::type\ncollection_load_impl(\n    Archive & ar,\n    std::forward_list<T, Allocator> &t,\n    collection_size_type count,\n    item_version_type item_version\n){\n    t.clear();\n    boost::serialization::detail::stack_construct<Archive, T> u(ar, item_version);\n    ar >> boost::serialization::make_nvp(\"item\", u.reference());\n    t.push_front(boost::move(u.reference()));\n    typename std::forward_list<T, Allocator>::iterator last;\n    last = t.begin();\n    ar.reset_object_address(&(*t.begin()) , & u.reference());\n    while(--count > 0){\n        detail::stack_construct<Archive, T> u(ar, item_version);\n        ar >> boost::serialization::make_nvp(\"item\", u.reference());\n        last = t.insert_after(last, boost::move(u.reference()));\n        ar.reset_object_address(&(*last) , & u.reference());\n    }\n}\n\n} // stl\n\ntemplate<class Archive, class U, class Allocator>\ninline void load(\n    Archive & ar,\n    std::forward_list<U, Allocator> &t,\n    const unsigned int /*file_version*/\n){\n    const boost::serialization::library_version_type library_version(\n        ar.get_library_version()\n    );\n    // retrieve number of elements\n    item_version_type item_version(0);\n    collection_size_type count;\n    ar >> BOOST_SERIALIZATION_NVP(count);\n    if(boost::serialization::library_version_type(3) < library_version){\n        ar >> BOOST_SERIALIZATION_NVP(item_version);\n    }\n    stl::collection_load_impl(ar, t, count, item_version);\n}\n\n// split non-intrusive serialization function member into separate\n// non intrusive save/load member functions\ntemplate<class Archive, class U, class Allocator>\ninline void serialize(\n    Archive & ar,\n    std::forward_list<U, Allocator> &t,\n    const unsigned int file_version\n){\n    boost::serialization::split_free(ar, t, file_version);\n}\n\n} // serialization\n} // namespace boost\n\n#include <boost/serialization/collection_traits.hpp>\n\nBOOST_SERIALIZATION_COLLECTION_TRAITS(std::forward_list)\n\n#endif  // BOOST_SERIALIZATION_FORWARD_LIST_HPP\n"
  },
  {
    "path": "include/boost/serialization/hash_collections_load_imp.hpp",
    "content": "#ifndef BOOST_SERIALIZATION_HASH_COLLECTIONS_LOAD_IMP_HPP\n#define BOOST_SERIALIZATION_HASH_COLLECTIONS_LOAD_IMP_HPP\n\n// MS compatible compilers support #pragma once\n#if defined(_MSC_VER)\n# pragma once\n# pragma warning (disable : 4786) // too long name, harmless warning\n#endif\n\n/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// hash_collections_load_imp.hpp: serialization for loading stl collections\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for updates, documentation, and revision history.\n\n// helper function templates for serialization of hashed collections\n#include <boost/config.hpp>\n#include <boost/serialization/nvp.hpp>\n#include <boost/serialization/library_version_type.hpp>\n\nnamespace boost{\nnamespace serialization {\nnamespace stl {\n\n//////////////////////////////////////////////////////////////////////\n// implementation of serialization for STL containers\n//\ntemplate<class Archive, class Container, class InputFunction>\ninline void load_hash_collection(Archive & ar, Container &s)\n{\n    collection_size_type count;\n    collection_size_type bucket_count;\n    boost::serialization::item_version_type item_version(0);\n    boost::serialization::library_version_type library_version(\n        ar.get_library_version()\n    );\n    // retrieve number of elements\n    if(boost::serialization::library_version_type(6) != library_version){\n        ar >> BOOST_SERIALIZATION_NVP(count);\n        ar >> BOOST_SERIALIZATION_NVP(bucket_count);\n    }\n    else{\n        // note: fixup for error in version 6.  collection size was\n        // changed to size_t BUT for hashed collections it was implemented\n        // as an unsigned int.  This should be a problem only on win64 machines\n        // but I'll leave it for everyone just in case.\n        unsigned int c;\n        unsigned int bc;\n        ar >> BOOST_SERIALIZATION_NVP(c);\n        count = c;\n        ar >> BOOST_SERIALIZATION_NVP(bc);\n        bucket_count = bc;\n    }\n    if(boost::serialization::library_version_type(3) < library_version){\n        ar >> BOOST_SERIALIZATION_NVP(item_version);\n    }\n    s.clear();\n    #if ! defined(__MWERKS__)\n    s.resize(bucket_count);\n    #endif\n    InputFunction ifunc;\n    while(count-- > 0){\n        ifunc(ar, s, item_version);\n    }\n}\n\n} // namespace stl\n} // namespace serialization\n} // namespace boost\n\n#endif //BOOST_SERIALIZATION_HASH_COLLECTIONS_LOAD_IMP_HPP\n"
  },
  {
    "path": "include/boost/serialization/hash_collections_save_imp.hpp",
    "content": "#ifndef BOOST_SERIALIZATION_HASH_COLLECTIONS_SAVE_IMP_HPP\n#define BOOST_SERIALIZATION_HASH_COLLECTIONS_SAVE_IMP_HPP\n\n// MS compatible compilers support #pragma once\n#if defined(_MSC_VER)\n# pragma once\n#endif\n\n/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// hash_collections_save_imp.hpp: serialization for stl collections\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for updates, documentation, and revision history.\n\n// helper function templates for serialization of collections\n\n#include <boost/config.hpp>\n#include <boost/serialization/nvp.hpp>\n#include <boost/serialization/serialization.hpp>\n#include <boost/serialization/collection_size_type.hpp>\n#include <boost/serialization/item_version_type.hpp>\n#include <boost/serialization/library_version_type.hpp>\n\nnamespace boost{\nnamespace serialization {\nnamespace stl {\n\n//////////////////////////////////////////////////////////////////////\n// implementation of serialization for STL containers\n//\n\ntemplate<class Archive, class Container>\ninline void save_hash_collection(Archive & ar, const Container &s)\n{\n    collection_size_type count(s.size());\n    const collection_size_type bucket_count(s.bucket_count());\n    const item_version_type item_version(\n        version<typename Container::value_type>::value\n    );\n\n    #if 0\n    /* should only be necessary to create archives of previous versions\n     * which is not currently supported.  So for now comment this out\n     */\n    boost::serialization::library_version_type library_version(\n        ar.get_library_version()\n    );\n    // retrieve number of elements\n    if(boost::serialization::library_version_type(6) != library_version){\n        ar << BOOST_SERIALIZATION_NVP(count);\n        ar << BOOST_SERIALIZATION_NVP(bucket_count);\n    }\n    else{\n        // note: fixup for error in version 6.  collection size was\n        // changed to size_t BUT for hashed collections it was implemented\n        // as an unsigned int.  This should be a problem only on win64 machines\n        // but I'll leave it for everyone just in case.\n        const unsigned int c = count;\n        const unsigned int bc = bucket_count;\n        ar << BOOST_SERIALIZATION_NVP(c);\n        ar << BOOST_SERIALIZATION_NVP(bc);\n    }\n    if(boost::serialization::library_version_type(3) < library_version){\n        // record number of elements\n        // make sure the target type is registered so we can retrieve\n        // the version when we load\n        ar << BOOST_SERIALIZATION_NVP(item_version);\n    }\n    #else\n        ar << BOOST_SERIALIZATION_NVP(count);\n        ar << BOOST_SERIALIZATION_NVP(bucket_count);\n        ar << BOOST_SERIALIZATION_NVP(item_version);\n    #endif\n\n    typename Container::const_iterator it = s.begin();\n    while(count-- > 0){\n        // note borland emits a no-op without the explicit namespace\n        boost::serialization::save_construct_data_adl(\n            ar,\n            &(*it),\n            boost::serialization::version<\n                typename Container::value_type\n            >::value\n        );\n        ar << boost::serialization::make_nvp(\"item\", *it++);\n    }\n}\n\n} // namespace stl\n} // namespace serialization\n} // namespace boost\n\n#endif //BOOST_SERIALIZATION_HASH_COLLECTIONS_SAVE_IMP_HPP\n"
  },
  {
    "path": "include/boost/serialization/hash_map.hpp",
    "content": "#ifndef  BOOST_SERIALIZATION_HASH_MAP_HPP\n#define BOOST_SERIALIZATION_HASH_MAP_HPP\n\n// MS compatible compilers support #pragma once\n#if defined(_MSC_VER)\n# pragma once\n#endif\n\n/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// hash_map.hpp: serialization for stl hash_map templates\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for updates, documentation, and revision history.\n\n#include <boost/config.hpp>\n#ifdef BOOST_HAS_HASH\n#include BOOST_HASH_MAP_HEADER\n\n#include <boost/serialization/utility.hpp> // pair\n#include <boost/serialization/hash_collections_save_imp.hpp>\n#include <boost/serialization/hash_collections_load_imp.hpp>\n#include <boost/serialization/split_free.hpp>\n#include <boost/serialization/detail/stack_constructor.hpp>\n#include <boost/move/utility_core.hpp>\n\nnamespace boost {\nnamespace serialization {\n\nnamespace stl {\n\n// hash_map input\ntemplate<class Archive, class Container>\nstruct archive_input_hash_map\n{\n    inline void operator()(\n        Archive &ar,\n        Container &s,\n        const unsigned int v\n    ){\n        typedef typename Container::value_type type;\n        detail::stack_construct<Archive, type> t(ar, v);\n        // borland fails silently w/o full namespace\n        ar >> boost::serialization::make_nvp(\"item\", t.reference());\n        std::pair<typename Container::const_iterator, bool> result =\n            s.insert(boost::move(t.reference()));\n        // note: the following presumes that the map::value_type was NOT tracked\n        // in the archive.  This is the usual case, but here there is no way\n        // to determine that.\n        if(result.second){\n            ar.reset_object_address(\n                & (result.first->second),\n                & t.reference().second\n            );\n        }\n    }\n};\n\n// hash_multimap input\ntemplate<class Archive, class Container>\nstruct archive_input_hash_multimap\n{\n    inline void operator()(\n        Archive &ar,\n        Container &s,\n        const unsigned int v\n    ){\n        typedef typename Container::value_type type;\n        detail::stack_construct<Archive, type> t(ar, v);\n        // borland fails silently w/o full namespace\n        ar >> boost::serialization::make_nvp(\"item\", t.reference());\n        typename Container::const_iterator result\n            = s.insert(boost::move(t.reference()));\n        // note: the following presumes that the map::value_type was NOT tracked\n        // in the archive.  This is the usual case, but here there is no way\n        // to determine that.\n        ar.reset_object_address(\n            & result->second,\n            & t.reference()\n        );\n    }\n};\n\n} // stl\n\ntemplate<\n    class Archive,\n    class Key,\n    class T,\n    class HashFcn,\n    class EqualKey,\n    class Allocator\n>\ninline void save(\n    Archive & ar,\n    const BOOST_STD_EXTENSION_NAMESPACE::hash_map<\n        Key, T, HashFcn, EqualKey, Allocator\n    > &t,\n    const unsigned int file_version\n){\n    boost::serialization::stl::save_hash_collection<\n        Archive,\n        BOOST_STD_EXTENSION_NAMESPACE::hash_map<\n            Key, T, HashFcn, EqualKey, Allocator\n        >\n    >(ar, t);\n}\n\ntemplate<\n    class Archive,\n    class Key,\n    class T,\n    class HashFcn,\n    class EqualKey,\n    class Allocator\n>\ninline void load(\n    Archive & ar,\n    BOOST_STD_EXTENSION_NAMESPACE::hash_map<\n        Key, T, HashFcn, EqualKey, Allocator\n    > &t,\n    const unsigned int file_version\n){\n    boost::serialization::stl::load_hash_collection<\n        Archive,\n        BOOST_STD_EXTENSION_NAMESPACE::hash_map<\n            Key, T, HashFcn, EqualKey, Allocator\n        >,\n        boost::serialization::stl::archive_input_hash_map<\n            Archive,\n            BOOST_STD_EXTENSION_NAMESPACE::hash_map<\n                Key, T, HashFcn, EqualKey, Allocator\n            >\n        >\n    >(ar, t);\n}\n\n// split non-intrusive serialization function member into separate\n// non intrusive save/load member functions\ntemplate<\n    class Archive,\n    class Key,\n    class T,\n    class HashFcn,\n    class EqualKey,\n    class Allocator\n>\ninline void serialize(\n    Archive & ar,\n    BOOST_STD_EXTENSION_NAMESPACE::hash_map<\n        Key, T, HashFcn, EqualKey, Allocator\n    > &t,\n    const unsigned int file_version\n){\n    boost::serialization::split_free(ar, t, file_version);\n}\n\n// hash_multimap\ntemplate<\n    class Archive,\n    class Key,\n    class T,\n    class HashFcn,\n    class EqualKey,\n    class Allocator\n>\ninline void save(\n    Archive & ar,\n    const BOOST_STD_EXTENSION_NAMESPACE::hash_multimap<\n        Key, T, HashFcn, EqualKey, Allocator\n    > &t,\n    const unsigned int file_version\n){\n    boost::serialization::stl::save_hash_collection<\n        Archive,\n        BOOST_STD_EXTENSION_NAMESPACE::hash_multimap<\n            Key, T, HashFcn, EqualKey, Allocator\n        >\n    >(ar, t);\n}\n\ntemplate<\n    class Archive,\n    class Key,\n    class T,\n    class HashFcn,\n    class EqualKey,\n    class Allocator\n>\ninline void load(\n    Archive & ar,\n    BOOST_STD_EXTENSION_NAMESPACE::hash_multimap<\n        Key, T, HashFcn, EqualKey, Allocator\n    > &t,\n    const unsigned int file_version\n){\n    boost::serialization::stl::load_hash_collection<\n        Archive,\n        BOOST_STD_EXTENSION_NAMESPACE::hash_multimap<\n            Key, T, HashFcn, EqualKey, Allocator\n        >,\n        boost::serialization::stl::archive_input_hash_multimap<\n            Archive,\n            BOOST_STD_EXTENSION_NAMESPACE::hash_multimap<\n                Key, T, HashFcn, EqualKey, Allocator\n            >\n        >\n    >(ar, t);\n}\n\n// split non-intrusive serialization function member into separate\n// non intrusive save/load member functions\ntemplate<\n    class Archive,\n    class Key,\n    class T,\n    class HashFcn,\n    class EqualKey,\n    class Allocator\n>\ninline void serialize(\n    Archive & ar,\n    BOOST_STD_EXTENSION_NAMESPACE::hash_multimap<\n        Key, T, HashFcn, EqualKey, Allocator\n    > &t,\n    const unsigned int file_version\n){\n    boost::serialization::split_free(ar, t, file_version);\n}\n\n} // namespace serialization\n} // namespace boost\n\n#endif // BOOST_HAS_HASH\n#endif // BOOST_SERIALIZATION_HASH_MAP_HPP\n"
  },
  {
    "path": "include/boost/serialization/hash_set.hpp",
    "content": "#ifndef  BOOST_SERIALIZATION_HASH_SET_HPP\n#define BOOST_SERIALIZATION_HASH_SET_HPP\n\n// MS compatible compilers support #pragma once\n#if defined(_MSC_VER)\n# pragma once\n#endif\n\n/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// hash_set.hpp: serialization for stl hash_set templates\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for updates, documentation, and revision history.\n\n#include <boost/config.hpp>\n#ifdef BOOST_HAS_HASH\n#include BOOST_HASH_SET_HEADER\n\n#include <boost/serialization/hash_collections_save_imp.hpp>\n#include <boost/serialization/hash_collections_load_imp.hpp>\n#include <boost/serialization/split_free.hpp>\n#include <boost/serialization/detail/stack_constructor.hpp>\n#include <boost/move/utility_core.hpp>\n\nnamespace boost {\nnamespace serialization {\n\nnamespace stl {\n\n// hash_set input\ntemplate<class Archive, class Container>\nstruct archive_input_hash_set\n{\n    inline void operator()(\n        Archive &ar,\n        Container &s,\n        const unsigned int v\n    ){\n        typedef typename Container::value_type type;\n        detail::stack_construct<Archive, type> t(ar, v);\n        // borland fails silently w/o full namespace\n        ar >> boost::serialization::make_nvp(\"item\", t.reference());\n        std::pair<typename Container::const_iterator, bool> result =\n            s.insert(boost::move(t.reference()));\n        if(result.second)\n            ar.reset_object_address(& (* result.first), & t.reference());\n    }\n};\n\n// hash_multiset input\ntemplate<class Archive, class Container>\nstruct archive_input_hash_multiset\n{\n    inline void operator()(\n        Archive &ar,\n        Container &s,\n        const unsigned int v\n    ){\n        typedef typename Container::value_type type;\n        detail::stack_construct<Archive, type> t(ar, v);\n        // borland fails silently w/o full namespace\n        ar >> boost::serialization::make_nvp(\"item\", t.reference());\n        typename Container::const_iterator result\n            = s.insert(boost::move(t.reference()));\n        ar.reset_object_address(& (* result), & t.reference());\n    }\n};\n\n} // stl\n\ntemplate<\n    class Archive,\n    class Key,\n    class HashFcn,\n    class EqualKey,\n    class Allocator\n>\ninline void save(\n    Archive & ar,\n    const BOOST_STD_EXTENSION_NAMESPACE::hash_set<\n        Key, HashFcn, EqualKey, Allocator\n    > &t,\n    const unsigned int file_version\n){\n    boost::serialization::stl::save_hash_collection<\n        Archive,\n        BOOST_STD_EXTENSION_NAMESPACE::hash_set<\n            Key, HashFcn, EqualKey, Allocator\n        >\n    >(ar, t);\n}\n\ntemplate<\n    class Archive,\n    class Key,\n    class HashFcn,\n    class EqualKey,\n    class Allocator\n>\ninline void load(\n    Archive & ar,\n    BOOST_STD_EXTENSION_NAMESPACE::hash_set<\n        Key, HashFcn, EqualKey, Allocator\n    > &t,\n    const unsigned int file_version\n){\n    boost::serialization::stl::load_hash_collection<\n        Archive,\n        BOOST_STD_EXTENSION_NAMESPACE::hash_set<\n            Key, HashFcn, EqualKey, Allocator\n        >,\n        boost::serialization::stl::archive_input_hash_set<\n            Archive,\n            BOOST_STD_EXTENSION_NAMESPACE::hash_set<\n                Key, HashFcn, EqualKey, Allocator\n            >\n        >\n    >(ar, t);\n}\n\n// split non-intrusive serialization function member into separate\n// non intrusive save/load member functions\ntemplate<\n    class Archive,\n    class Key,\n    class HashFcn,\n    class EqualKey,\n    class Allocator\n>\ninline void serialize(\n    Archive & ar,\n    BOOST_STD_EXTENSION_NAMESPACE::hash_set<\n        Key, HashFcn, EqualKey, Allocator\n    > &t,\n    const unsigned int file_version\n){\n    boost::serialization::split_free(ar, t, file_version);\n}\n\n// hash_multiset\ntemplate<\n    class Archive,\n    class Key,\n    class HashFcn,\n    class EqualKey,\n    class Allocator\n>\ninline void save(\n    Archive & ar,\n    const BOOST_STD_EXTENSION_NAMESPACE::hash_multiset<\n        Key, HashFcn, EqualKey, Allocator\n    > &t,\n    const unsigned int file_version\n){\n    boost::serialization::stl::save_hash_collection<\n        Archive,\n        BOOST_STD_EXTENSION_NAMESPACE::hash_multiset<\n            Key, HashFcn, EqualKey, Allocator\n        >\n    >(ar, t);\n}\n\ntemplate<\n    class Archive,\n    class Key,\n    class HashFcn,\n    class EqualKey,\n    class Allocator\n>\ninline void load(\n    Archive & ar,\n    BOOST_STD_EXTENSION_NAMESPACE::hash_multiset<\n        Key, HashFcn, EqualKey, Allocator\n    > &t,\n    const unsigned int file_version\n){\n    boost::serialization::stl::load_hash_collection<\n        Archive,\n        BOOST_STD_EXTENSION_NAMESPACE::hash_multiset<\n            Key, HashFcn, EqualKey, Allocator\n        >,\n        boost::serialization::stl::archive_input_hash_multiset<\n            Archive,\n            BOOST_STD_EXTENSION_NAMESPACE::hash_multiset<\n                Key, HashFcn, EqualKey, Allocator\n            >\n        >\n    >(ar, t);\n}\n\n// split non-intrusive serialization function member into separate\n// non intrusive save/load member functions\ntemplate<\n    class Archive,\n    class Key,\n    class HashFcn,\n    class EqualKey,\n    class Allocator\n>\ninline void serialize(\n    Archive & ar,\n    BOOST_STD_EXTENSION_NAMESPACE::hash_multiset<\n        Key, HashFcn, EqualKey, Allocator\n    > & t,\n    const unsigned int file_version\n){\n    boost::serialization::split_free(ar, t, file_version);\n}\n\n} // namespace serialization\n} // namespace boost\n\n#include <boost/serialization/collection_traits.hpp>\n\nBOOST_SERIALIZATION_COLLECTION_TRAITS(BOOST_STD_EXTENSION_NAMESPACE::hash_set)\nBOOST_SERIALIZATION_COLLECTION_TRAITS(BOOST_STD_EXTENSION_NAMESPACE::hash_multiset)\n\n#endif // BOOST_HAS_HASH\n#endif // BOOST_SERIALIZATION_HASH_SET_HPP\n"
  },
  {
    "path": "include/boost/serialization/is_bitwise_serializable.hpp",
    "content": "// (C) Copyright 2007 Matthias Troyer\n\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n//  Authors: Matthias Troyer\n\n/** @file is_bitwise_serializable.hpp\n *\n *  This header provides a traits class for determining whether a class\n * can be serialized (in a non-portable way) just by copying the bits.\n */\n\n\n#ifndef BOOST_SERIALIZATION_IS_BITWISE_SERIALIZABLE_HPP\n#define BOOST_SERIALIZATION_IS_BITWISE_SERIALIZABLE_HPP\n\n// MS compatible compilers support #pragma once\n#if defined(_MSC_VER)\n# pragma once\n#endif\n\n#include <boost/mpl/bool_fwd.hpp>\n#include <boost/type_traits/is_arithmetic.hpp>\n\nnamespace boost {\nnamespace serialization {\n    template<class T>\n    struct is_bitwise_serializable\n     : public is_arithmetic< T >\n    {};\n} // namespace serialization\n} // namespace boost\n\n\n// define a macro to make explicit designation of this more transparent\n#define BOOST_IS_BITWISE_SERIALIZABLE(T)              \\\nnamespace boost {                                     \\\nnamespace serialization {                             \\\ntemplate<>                                            \\\nstruct is_bitwise_serializable< T > : mpl::true_ {};  \\\n}}                                                    \\\n/**/\n\n#endif //BOOST_SERIALIZATION_IS_BITWISE_SERIALIZABLE_HPP\n"
  },
  {
    "path": "include/boost/serialization/item_version_type.hpp",
    "content": "#ifndef BOOST_SERIALIZATION_ITEM_VERSION_TYPE_HPP\n#define BOOST_SERIALIZATION_ITEM_VERSION_TYPE_HPP\n\n// (C) Copyright 2010 Robert Ramey\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n#include <boost/cstdint.hpp> // uint_least8_t\n#include <boost/integer_traits.hpp>\n#include <boost/serialization/level.hpp>\n#include <boost/serialization/is_bitwise_serializable.hpp>\n\n// fixes broken example build on x86_64-linux-gnu-gcc-4.6.0\n#include <boost/assert.hpp>\n\nnamespace boost {\nnamespace serialization {\n\n#if defined(_MSC_VER)\n#pragma warning( push )\n#pragma warning( disable : 4244 4267 )\n#endif\n\nclass item_version_type {\nprivate:\n    typedef unsigned int base_type;\n    base_type t;\npublic:\n    // should be private - but MPI fails if it's not!!!\n    item_version_type(): t(0) {}\n    explicit item_version_type(const unsigned int t_) : t(t_){\n        BOOST_ASSERT(t_ <= boost::integer_traits<base_type>::const_max);\n    }\n    item_version_type(const item_version_type & t_) :\n        t(t_.t)\n    {}\n    item_version_type & operator=(item_version_type rhs){\n        t = rhs.t;\n        return *this;\n    }\n    // used for text output\n    operator base_type () const {\n        return t;\n    }\n    // used for text input\n    operator base_type & () {\n        return t;\n    }\n    bool operator==(const item_version_type & rhs) const {\n        return t == rhs.t;\n    }\n    bool operator<(const item_version_type & rhs) const {\n        return t < rhs.t;\n    }\n};\n\n#if defined(_MSC_VER)\n#pragma warning( pop )\n#endif\n\n} } // end namespace boost::serialization\n\nBOOST_IS_BITWISE_SERIALIZABLE(item_version_type)\n\nBOOST_CLASS_IMPLEMENTATION(item_version_type, primitive_type)\n\n#endif //BOOST_SERIALIZATION_ITEM_VERSION_TYPE_HPP\n"
  },
  {
    "path": "include/boost/serialization/level.hpp",
    "content": "#ifndef BOOST_SERIALIZATION_LEVEL_HPP\n#define BOOST_SERIALIZATION_LEVEL_HPP\n\n// MS compatible compilers support #pragma once\n#if defined(_MSC_VER)\n# pragma once\n#endif\n\n/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// level.hpp:\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for updates, documentation, and revision history.\n\n#include <boost/config.hpp>\n#include <boost/detail/workaround.hpp>\n\n#include <boost/type_traits/is_fundamental.hpp>\n#include <boost/type_traits/is_enum.hpp>\n#include <boost/type_traits/is_array.hpp>\n#include <boost/type_traits/is_class.hpp>\n#include <boost/type_traits/is_base_and_derived.hpp>\n\n#include <boost/mpl/eval_if.hpp>\n#include <boost/mpl/int.hpp>\n#include <boost/mpl/integral_c.hpp>\n#include <boost/mpl/integral_c_tag.hpp>\n\n#include <boost/serialization/level_enum.hpp>\n\nnamespace boost {\nnamespace serialization {\n\nstruct basic_traits;\n\n// default serialization implementation level\ntemplate<class T>\nstruct implementation_level_impl {\n    template<class U>\n    struct traits_class_level {\n        typedef typename U::level type;\n    };\n\n    typedef mpl::integral_c_tag tag;\n    // note: at least one compiler complained w/o the full qualification\n    // on basic traits below\n    typedef\n        typename mpl::eval_if<\n            is_base_and_derived<boost::serialization::basic_traits, T>,\n            traits_class_level< T >,\n        //else\n        typename mpl::eval_if<\n            is_fundamental< T >,\n            mpl::int_<primitive_type>,\n        //else\n        typename mpl::eval_if<\n            is_class< T >,\n            mpl::int_<object_class_info>,\n        //else\n        typename mpl::eval_if<\n            is_array< T >,\n                mpl::int_<object_serializable>,\n        //else\n        typename mpl::eval_if<\n            is_enum< T >,\n                mpl::int_<primitive_type>,\n        //else\n            mpl::int_<not_serializable>\n        >\n        >\n        >\n        >\n        >::type type;\n        // vc 7.1 doesn't like enums here\n    BOOST_STATIC_CONSTANT(int, value = type::value);\n};\n\ntemplate<class T>\nstruct implementation_level :\n    public implementation_level_impl<const T>\n{\n};\n\ntemplate<class T, int L>\ninline bool operator>=(implementation_level< T > t, enum level_type l)\n{\n    return t.value >= (int)l;\n}\n\n} // namespace serialization\n} // namespace boost\n\n// specify the level of serialization implementation for the class\n// require that class info saved when versioning is used\n#define BOOST_CLASS_IMPLEMENTATION(T, E)                 \\\n    namespace boost {                                    \\\n    namespace serialization {                            \\\n    template <>                                          \\\n    struct implementation_level_impl< const T >                     \\\n    {                                                    \\\n        typedef mpl::integral_c_tag tag;                 \\\n        typedef mpl::int_< E > type;                     \\\n        BOOST_STATIC_CONSTANT(                           \\\n            int,                                         \\\n            value = implementation_level_impl::type::value    \\\n        );                                               \\\n    };                                                   \\\n    }                                                    \\\n    }\n    /**/\n\n#endif // BOOST_SERIALIZATION_LEVEL_HPP\n"
  },
  {
    "path": "include/boost/serialization/level_enum.hpp",
    "content": "#ifndef BOOST_SERIALIZATION_LEVEL_ENUM_HPP\n#define BOOST_SERIALIZATION_LEVEL_ENUM_HPP\n\n// MS compatible compilers support #pragma once\n#if defined(_MSC_VER)\n# pragma once\n#endif\n\n/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// level_enum.hpp:\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for updates, documentation, and revision history.\n\nnamespace boost {\nnamespace serialization {\n\n// for each class used in the program, specify which level\n// of serialization should be implemented\n\n// names for each level\nenum level_type\n{\n    // Don't serialize this type. An attempt to do so should\n    // invoke a compile time assertion.\n    not_serializable = 0,\n    // write/read this type directly to the archive. In this case\n    // serialization code won't be called.  This is the default\n    // case for fundamental types.  It presumes a member function or\n    // template in the archive class that can handle this type.\n    // there is no runtime overhead associated reading/writing\n    // instances of this level\n    primitive_type = 1,\n    // Serialize the objects of this type using the objects \"serialize\"\n    // function or template. This permits values to be written/read\n    // to/from archives but includes no class or version information.\n    object_serializable = 2,\n    ///////////////////////////////////////////////////////////////////\n    // once an object is serialized at one of the above levels, the\n    // corresponding archives cannot be read if the implementation level\n    // for the archive object is changed.\n    ///////////////////////////////////////////////////////////////////\n    // Add class information to the archive.  Class information includes\n    // implementation level, class version and class name if available\n    object_class_info = 3\n};\n\n} // namespace serialization\n} // namespace boost\n\n#endif // BOOST_SERIALIZATION_LEVEL_ENUM_HPP\n"
  },
  {
    "path": "include/boost/serialization/library_version_type.hpp",
    "content": "#ifndef BOOST_SERIALIZATION_LIBRARY_VERSION_TYPE_HPP\n#define BOOST_SERIALIZATION_LIBRARY_VERSION_TYPE_HPP\n\n// MS compatible compilers support #pragma once\n#if defined(_MSC_VER)\n# pragma once\n#endif\n\n/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// library_version_type.hpp:\n\n// (C) Copyright 2002-2020 Robert Ramey - http://www.rrsd.com .\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for updates, documentation, and revision history.\n#include <cstring> // count\n#include <boost/cstdint.hpp> // uint_least16_t\n#include <boost/assert.hpp>\n#include <boost/config.hpp>\n#include <boost/integer_traits.hpp>\n\nnamespace boost {\nnamespace serialization {\n\n#if defined(_MSC_VER)\n#pragma warning( push )\n#pragma warning( disable : 4244 4267 )\n#endif\n\n/* NOTE : Warning  : Warning : Warning : Warning : Warning\n * Don't ever changes this.  If you do, they previously created\n * binary archives won't be readable !!!\n */\nclass library_version_type {\nprivate:\n    typedef uint_least16_t base_type;\n    base_type t;\npublic:\n    library_version_type(): t(0) {}\n    explicit library_version_type(const unsigned int & t_) : t(t_){\n        BOOST_ASSERT(t_ <= boost::integer_traits<base_type>::const_max);\n    }\n    library_version_type(const library_version_type & t_) :\n        t(t_.t)\n    {}\n    library_version_type & operator=(const library_version_type & rhs){\n        t = rhs.t;\n        return *this;\n    }\n    // used for text output\n    operator base_type () const {\n        return t;\n    }\n    // used for text input\n    operator base_type & (){\n        return t;\n    }\n    bool operator==(const library_version_type & rhs) const {\n        return t == rhs.t;\n    }\n    bool operator<(const library_version_type & rhs) const {\n        return t < rhs.t;\n    }\n};\n\n#if defined(_MSC_VER)\n#pragma warning( pop )\n#endif\n\n} // serialization\n} // boost\n\n#endif // BOOST_SERIALIZATION_LIBRARY_VERSION_TYPE_HPP\n"
  },
  {
    "path": "include/boost/serialization/list.hpp",
    "content": "#ifndef BOOST_SERIALIZATION_LIST_HPP\n#define BOOST_SERIALIZATION_LIST_HPP\n\n// MS compatible compilers support #pragma once\n#if defined(_MSC_VER)\n# pragma once\n#endif\n\n/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// list.hpp: serialization for stl list templates\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for updates, documentation, and revision history.\n\n#include <list>\n\n#include <boost/config.hpp>\n\n#include <boost/serialization/collections_save_imp.hpp>\n#include <boost/serialization/collections_load_imp.hpp>\n\n#include <boost/serialization/access.hpp>\n#include <boost/serialization/nvp.hpp>\n#include <boost/serialization/collection_size_type.hpp>\n#include <boost/serialization/item_version_type.hpp>\n#include <boost/serialization/library_version_type.hpp>\n#include <boost/serialization/split_free.hpp>\n\nnamespace boost {\nnamespace serialization {\n\ntemplate<class Archive, class U, class Allocator>\ninline void save(\n    Archive & ar,\n    const std::list<U, Allocator> &t,\n    const unsigned int /* file_version */\n){\n    boost::serialization::stl::save_collection<\n        Archive,\n        std::list<U, Allocator>\n    >(ar, t);\n}\n\ntemplate<class Archive, class U, class Allocator>\ninline void load(\n    Archive & ar,\n    std::list<U, Allocator> &t,\n    const unsigned int /* file_version */\n){\n    const boost::serialization::library_version_type library_version(\n        ar.get_library_version()\n    );\n    // retrieve number of elements\n    item_version_type item_version(0);\n    collection_size_type count;\n    ar >> BOOST_SERIALIZATION_NVP(count);\n    if(boost::serialization::library_version_type(3) < library_version){\n        ar >> BOOST_SERIALIZATION_NVP(item_version);\n    }\n    stl::collection_load_impl(ar, t, count, item_version);\n}\n\n// split non-intrusive serialization function member into separate\n// non intrusive save/load member functions\ntemplate<class Archive, class U, class Allocator>\ninline void serialize(\n    Archive & ar,\n    std::list<U, Allocator> & t,\n    const unsigned int file_version\n){\n    boost::serialization::split_free(ar, t, file_version);\n}\n\n} // serialization\n} // namespace boost\n\n#include <boost/serialization/collection_traits.hpp>\n\nBOOST_SERIALIZATION_COLLECTION_TRAITS(std::list)\n\n#endif // BOOST_SERIALIZATION_LIST_HPP\n"
  },
  {
    "path": "include/boost/serialization/map.hpp",
    "content": "#ifndef  BOOST_SERIALIZATION_MAP_HPP\n#define BOOST_SERIALIZATION_MAP_HPP\n\n// MS compatible compilers support #pragma once\n#if defined(_MSC_VER)\n# pragma once\n#endif\n\n/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// serialization/map.hpp:\n// serialization for stl map templates\n\n// (C) Copyright 2002-2014 Robert Ramey - http://www.rrsd.com .\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for updates, documentation, and revision history.\n\n#include <map>\n\n#include <boost/config.hpp>\n\n#include <boost/serialization/access.hpp>\n#include <boost/serialization/nvp.hpp>\n#include <boost/serialization/collection_size_type.hpp>\n#include <boost/serialization/item_version_type.hpp>\n#include <boost/serialization/library_version_type.hpp>\n#include <boost/serialization/detail/stack_constructor.hpp>\n\n#include <boost/serialization/utility.hpp>\n#include <boost/serialization/collections_save_imp.hpp>\n#include <boost/serialization/split_free.hpp>\n#include <boost/move/utility_core.hpp>\n\nnamespace boost {\nnamespace serialization {\n\n////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// implementation of serialization for map and mult-map STL containers\n\ntemplate<class Archive, class Container>\ninline void load_map_collection(Archive & ar, Container &s)\n{\n    s.clear();\n    const boost::serialization::library_version_type library_version(\n        ar.get_library_version()\n    );\n    // retrieve number of elements\n    item_version_type item_version(0);\n    collection_size_type count;\n    ar >> BOOST_SERIALIZATION_NVP(count);\n    if(boost::serialization::library_version_type(3) < library_version){\n        ar >> BOOST_SERIALIZATION_NVP(item_version);\n    }\n    typename Container::iterator hint;\n    hint = s.begin();\n    while(count-- > 0){\n        typedef typename Container::value_type type;\n        detail::stack_construct<Archive, type> t(ar, item_version);\n        ar >> boost::serialization::make_nvp(\"item\", t.reference());\n        typename Container::iterator result =\n            s.insert(hint, boost::move(t.reference()));\n        ar.reset_object_address(& (result->second), & t.reference().second);\n        hint = result;\n        ++hint;\n    }\n}\n\n// map\ntemplate<class Archive, class Type, class Key, class Compare, class Allocator >\ninline void save(\n    Archive & ar,\n    const std::map<Key, Type, Compare, Allocator> &t,\n    const unsigned int /* file_version */\n){\n    boost::serialization::stl::save_collection<\n        Archive,\n        std::map<Key, Type, Compare, Allocator>\n    >(ar, t);\n}\n\ntemplate<class Archive, class Type, class Key, class Compare, class Allocator >\ninline void load(\n    Archive & ar,\n    std::map<Key, Type, Compare, Allocator> &t,\n    const unsigned int /* file_version */\n){\n    load_map_collection(ar, t);\n}\n\n// split non-intrusive serialization function member into separate\n// non intrusive save/load member functions\ntemplate<class Archive, class Type, class Key, class Compare, class Allocator >\ninline void serialize(\n    Archive & ar,\n    std::map<Key, Type, Compare, Allocator> &t,\n    const unsigned int file_version\n){\n    boost::serialization::split_free(ar, t, file_version);\n}\n\n// multimap\ntemplate<class Archive, class Type, class Key, class Compare, class Allocator >\ninline void save(\n    Archive & ar,\n    const std::multimap<Key, Type, Compare, Allocator> &t,\n    const unsigned int /* file_version */\n){\n    boost::serialization::stl::save_collection<\n        Archive,\n        std::multimap<Key, Type, Compare, Allocator>\n    >(ar, t);\n}\n\ntemplate<class Archive, class Type, class Key, class Compare, class Allocator >\ninline void load(\n    Archive & ar,\n    std::multimap<Key, Type, Compare, Allocator> &t,\n    const unsigned int /* file_version */\n){\n    load_map_collection(ar, t);\n}\n\n// split non-intrusive serialization function member into separate\n// non intrusive save/load member functions\ntemplate<class Archive, class Type, class Key, class Compare, class Allocator >\ninline void serialize(\n    Archive & ar,\n    std::multimap<Key, Type, Compare, Allocator> &t,\n    const unsigned int file_version\n){\n    boost::serialization::split_free(ar, t, file_version);\n}\n\n} // serialization\n} // namespace boost\n\n#endif // BOOST_SERIALIZATION_MAP_HPP\n"
  },
  {
    "path": "include/boost/serialization/nvp.hpp",
    "content": "#ifndef BOOST_SERIALIZATION_NVP_HPP\n#define BOOST_SERIALIZATION_NVP_HPP\n\n// MS compatible compilers support #pragma once\n#if defined(_MSC_VER)\n# pragma once\n#endif\n\n/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// nvp.hpp: interface for serialization system.\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for updates, documentation, and revision history.\n\n#include <boost/core/nvp.hpp>\n#include <boost/preprocessor/stringize.hpp>\n\n#define BOOST_SERIALIZATION_NVP(name)                       \\\n    boost::serialization::make_nvp(BOOST_PP_STRINGIZE(name), name)\n/**/\n\n#define BOOST_SERIALIZATION_BASE_OBJECT_NVP(name)           \\\n    boost::serialization::make_nvp(                         \\\n        BOOST_PP_STRINGIZE(name),                           \\\n        boost::serialization::base_object<name >(*this)     \\\n    )\n/**/\n\n#include <boost/serialization/level.hpp>\n#include <boost/serialization/tracking.hpp>\n#include <boost/serialization/split_free.hpp>\n#include <boost/serialization/wrapper.hpp>\n#include <boost/serialization/base_object.hpp>\n\nnamespace boost {\nnamespace serialization {\n\ntemplate<class Archive, class T>\nvoid save(\n    Archive & ar,\n    const nvp<T> & t,\n    const unsigned int /* file_version */\n){\n    ar << t.const_value();\n}\ntemplate<class Archive, class T>\nvoid load(\n    Archive & ar,\n    nvp<T> & t ,\n    const unsigned int /* file_version */\n){\n    ar >> t.value();\n}\n\ntemplate<class Archive, class T>\ninline void serialize(\n    Archive & ar,\n    nvp<T> & t,\n    const unsigned int file_version\n){\n    split_free(ar, t, file_version);\n}\n\ntemplate <class T>\nstruct implementation_level<nvp< T > >\n{\n    typedef mpl::integral_c_tag tag;\n    typedef mpl::int_<object_serializable> type;\n    BOOST_STATIC_CONSTANT(int, value = implementation_level::type::value);\n};\ntemplate <class T>\nstruct implementation_level<const nvp< T > >\n{\n    typedef mpl::integral_c_tag tag;\n    typedef mpl::int_<object_serializable> type;\n    BOOST_STATIC_CONSTANT(int, value = implementation_level::type::value);\n};\n\n// nvp objects are generally created on the stack and are never tracked\ntemplate<class T>\nstruct tracking_level<nvp< T > >\n{\n    typedef mpl::integral_c_tag tag;\n    typedef mpl::int_<track_never> type;\n    BOOST_STATIC_CONSTANT(int, value = tracking_level::type::value);\n};\ntemplate<class T>\nstruct tracking_level<const nvp< T > >\n{\n    typedef mpl::integral_c_tag tag;\n    typedef mpl::int_<track_never> type;\n    BOOST_STATIC_CONSTANT(int, value = tracking_level::type::value);\n};\n\n// these traits aren't used by nvp so they don't need to be defined\n#if 0\ntemplate<class T>\nstruct version<const nvp< T > > {\n    typedef mpl::integral_c_tag tag;\n    typedef mpl::int_<0> type;\n    BOOST_STATIC_CONSTANT(int, value = 0);\n};\nstruct version<const nvp< T > > {\n    typedef mpl::integral_c_tag tag;\n    typedef mpl::int_<0> type;\n    BOOST_STATIC_CONSTANT(int, value = 0);\n};\n\ntemplate<class T>\nstruct extended_type_info_impl<const nvp< T > > {\n    typedef extended_type_info_impl< T > type;\n};\n#endif\n\ntemplate<class T>\nstruct is_wrapper<const nvp<T> > {\n    typedef boost::mpl::true_ type;\n};\ntemplate<class T>\nstruct is_wrapper<nvp<T> > {\n    typedef boost::mpl::true_ type;\n};\n\n\n} // serialization\n} // boost\n\n\n#endif // BOOST_SERIALIZATION_NVP_HPP\n"
  },
  {
    "path": "include/boost/serialization/optional.hpp",
    "content": "/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n\n// (C) Copyright 2002-4 Pavel Vozenilek .\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n// Provides non-intrusive serialization for boost::optional.\n\n#ifndef BOOST_SERIALIZATION_OPTIONAL_HPP\n#define BOOST_SERIALIZATION_OPTIONAL_HPP\n\n#if defined(_MSC_VER)\n# pragma once\n#endif\n\n#include <boost/config.hpp>\n#include <boost/optional.hpp>\n#ifndef BOOST_NO_CXX17_HDR_OPTIONAL\n#include <optional>\n#endif\n\n#include <boost/serialization/item_version_type.hpp>\n#include <boost/serialization/library_version_type.hpp>\n#include <boost/serialization/version.hpp>\n#include <boost/serialization/split_free.hpp>\n#include <boost/serialization/nvp.hpp>\n#include <boost/type_traits/is_pointer.hpp>\n#include <boost/serialization/detail/is_default_constructible.hpp>\n\n// function specializations must be defined in the appropriate\n// namespace - boost::serialization\nnamespace boost {\nnamespace serialization {\nnamespace detail {\n\n// OT is of the form optional<T>\ntemplate<class Archive, class OT>\nvoid save_impl(\n    Archive & ar,\n    const OT & ot\n){\n    // It is an inherent limitation to the serialization of optional.hpp\n    // that the underlying type must be either a pointer or must have a\n    // default constructor.  It's possible that this could change sometime\n    // in the future, but for now, one will have to work around it.  This can\n    // be done by serialization the optional<T> as optional<T *>\n    #ifndef BOOST_NO_CXX11_HDR_TYPE_TRAITS\n        BOOST_STATIC_ASSERT(\n            boost::serialization::detail::is_default_constructible<typename OT::value_type>::value\n            || boost::is_pointer<typename OT::value_type>::value\n        );\n    #endif\n    const bool tflag(ot);\n    ar << boost::serialization::make_nvp(\"initialized\", tflag);\n    if (tflag){\n        ar << boost::serialization::make_nvp(\"value\", *ot);\n    }\n}\n\n// OT is of the form optional<T>\ntemplate<class Archive, class OT>\nvoid load_impl(\n    Archive & ar,\n    OT & ot,\n    const unsigned int version\n){\n    bool tflag;\n    ar >> boost::serialization::make_nvp(\"initialized\", tflag);\n    if(! tflag){\n        ot.reset();\n        return;\n    }\n\n    if(0 == version){\n        boost::serialization::item_version_type item_version(0);\n        boost::serialization::library_version_type library_version(\n            ar.get_library_version()\n        );\n        if(boost::serialization::library_version_type(3) < library_version){\n            ar >> BOOST_SERIALIZATION_NVP(item_version);\n        }\n    }\n    typename OT::value_type t;\n    ar >> boost::serialization::make_nvp(\"value\",t);\n    ot = t;\n}\n\n} // detail\n\ntemplate<class Archive, class T>\nvoid save(\n    Archive & ar,\n    const boost::optional< T > & ot,\n    const unsigned int /*version*/\n){\n    detail::save_impl(ar, ot);\n}\n\n#ifndef BOOST_NO_CXX17_HDR_OPTIONAL\ntemplate<class Archive, class T>\nvoid save(\n    Archive & ar,\n    const std::optional< T > & ot,\n    const unsigned int /*version*/\n){\n    detail::save_impl(ar, ot);\n}\n#endif\n\ntemplate<class Archive, class T>\nvoid load(\n    Archive & ar,\n    boost::optional< T > & ot,\n    const unsigned int version\n){\n    detail::load_impl(ar, ot, version);\n}\n\n#ifndef BOOST_NO_CXX17_HDR_OPTIONAL\ntemplate<class Archive, class T>\nvoid load(\n    Archive & ar,\n    std::optional< T >  & ot,\n    const unsigned int version\n){\n    detail::load_impl(ar, ot, version);\n}\n#endif\n\ntemplate<class Archive, class T>\nvoid serialize(\n    Archive & ar,\n    boost::optional< T > & ot,\n    const unsigned int version\n){\n    boost::serialization::split_free(ar, ot, version);\n}\n\n#ifndef BOOST_NO_CXX17_HDR_OPTIONAL\ntemplate<class Archive, class T>\nvoid serialize(\n    Archive & ar,\n    std::optional< T > & ot,\n    const unsigned int version\n){\n    boost::serialization::split_free(ar, ot, version);\n}\n#endif\n\ntemplate<class T>\nstruct version<boost::optional<T> >{\n    BOOST_STATIC_CONSTANT(int, value = 1);\n};\n\n#ifndef BOOST_NO_CXX17_HDR_OPTIONAL\ntemplate<class T>\nstruct version<std::optional<T> >{\n    BOOST_STATIC_CONSTANT(int, value = 1);\n};\n#endif\n\n} // serialization\n} // boost\n\n#endif // BOOST_SERIALIZATION_OPTIONAL_HPP\n"
  },
  {
    "path": "include/boost/serialization/priority_queue.hpp",
    "content": "#ifndef  BOOST_SERIALIZATION_PRIORITY_QUEUE_HPP\n#define BOOST_SERIALIZATION_PRIORITY_QUEUE_HPP\n\n// MS compatible compilers support #pragma once\n#if defined(_MSC_VER) && (_MSC_VER >= 1020)\n# pragma once\n#endif\n\n/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// priority_queue.hpp\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for updates, documentation, and revision history.\n\n#include <queue>\n#include <boost/config.hpp>\n#include <boost/mpl/eval_if.hpp>\n#include <boost/mpl/identity.hpp>\n\n// function specializations must be defined in the appropriate\n// namespace - boost::serialization\n#if defined(__SGI_STL_PORT) || defined(_STLPORT_VERSION)\n#define STD _STLP_STD\n#else\n#define STD std\n#endif\n\nnamespace boost {\nnamespace serialization {\nnamespace detail{\n\ntemplate <typename U, typename Container, typename Compare>\nstruct priority_queue_save : public STD::priority_queue<U, Container, Compare> {\n    template<class Archive>\n    void operator()(Archive & ar, const unsigned int file_version) const {\n        save(ar, STD::priority_queue<U, Container, Compare>::c, file_version);\n    }\n};\ntemplate <typename U, typename Container, typename Compare>\nstruct priority_queue_load : public STD::priority_queue<U, Container, Compare> {\n    template<class Archive>\n    void operator()(Archive & ar, const unsigned int file_version) {\n        load(ar, STD::priority_queue<U, Container, Compare>::c, file_version);\n    }\n};\n\n} // detail\n\ntemplate<class Archive, class T, class Container, class Compare>\ninline void serialize(\n    Archive & ar,\n    std::priority_queue< T, Container, Compare> & t,\n    const unsigned int file_version\n){\n    typedef typename mpl::eval_if<\n        typename Archive::is_saving,\n        mpl::identity<detail::priority_queue_save<T, Container, Compare> >,\n        mpl::identity<detail::priority_queue_load<T, Container, Compare> >\n    >::type typex;\n    static_cast<typex &>(t)(ar, file_version);\n}\n\n} // namespace serialization\n} // namespace boost\n\n#include <boost/serialization/collection_traits.hpp>\n\nBOOST_SERIALIZATION_COLLECTION_TRAITS(STD::priority_queue)\n\n#undef STD\n\n#endif // BOOST_SERIALIZATION_PRIORITY_QUEUE_HPP\n"
  },
  {
    "path": "include/boost/serialization/queue.hpp",
    "content": "#ifndef  BOOST_SERIALIZATION_QUEUE_HPP\n#define BOOST_SERIALIZATION_QUEUE_HPP\n\n// MS compatible compilers support #pragma once\n#if defined(_MSC_VER) && (_MSC_VER >= 1020)\n# pragma once\n#endif\n\n/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// queue.hpp\n\n// (C) Copyright 2014 Robert Ramey - http://www.rrsd.com .\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for updates, documentation, and revision history.\n\n#include <queue>\n#include <boost/config.hpp>\n#include <boost/mpl/eval_if.hpp>\n#include <boost/mpl/identity.hpp>\n\n// function specializations must be defined in the appropriate\n// namespace - boost::serialization\n#if defined(__SGI_STL_PORT) || defined(_STLPORT_VERSION)\n#define STD _STLP_STD\n#else\n#define STD std\n#endif\n\nnamespace boost {\nnamespace serialization {\nnamespace detail {\n\ntemplate <typename U, typename C>\nstruct queue_save : public STD::queue<U, C> {\n    template<class Archive>\n    void operator()(Archive & ar, const unsigned int file_version) const {\n        save(ar, STD::queue<U, C>::c, file_version);\n    }\n};\ntemplate <typename U, typename C>\nstruct queue_load : public STD::queue<U, C> {\n    template<class Archive>\n    void operator()(Archive & ar, const unsigned int file_version) {\n        load(ar, STD::queue<U, C>::c, file_version);\n    }\n};\n\n} // detail\n\ntemplate<class Archive, class T, class C>\ninline void serialize(\n    Archive & ar,\n    std::queue< T, C> & t,\n    const unsigned int file_version\n){\n    typedef typename mpl::eval_if<\n        typename Archive::is_saving,\n        mpl::identity<detail::queue_save<T, C> >,\n        mpl::identity<detail::queue_load<T, C> >\n    >::type typex;\n    static_cast<typex &>(t)(ar, file_version);\n}\n\n} // namespace serialization\n} // namespace boost\n\n#include <boost/serialization/collection_traits.hpp>\n\nBOOST_SERIALIZATION_COLLECTION_TRAITS(STD::queue)\n\n#undef STD\n\n#endif // BOOST_SERIALIZATION_QUEUE_HPP\n"
  },
  {
    "path": "include/boost/serialization/scoped_ptr.hpp",
    "content": "#ifndef BOOST_SERIALIZATION_SCOPED_PTR_HPP_VP_2003_10_30\n#define BOOST_SERIALIZATION_SCOPED_PTR_HPP_VP_2003_10_30\n\n#if defined(_MSC_VER)\n# pragma once\n#endif\n\n//  Copyright (c) 2003 Vladimir Prus.\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n// Provides non-intrusive serialization for boost::scoped_ptr\n// Does not allow to serialize scoped_ptr's to builtin types.\n\n#include <boost/config.hpp>\n\n#include <boost/scoped_ptr.hpp>\n#include <boost/serialization/nvp.hpp>\n#include <boost/serialization/split_free.hpp>\n\nnamespace boost {\nnamespace serialization {\n\n    template<class Archive, class T>\n    void save(\n        Archive & ar,\n        const boost::scoped_ptr< T > & t,\n        const unsigned int /* version */\n    ){\n        T* r = t.get();\n        ar << boost::serialization::make_nvp(\"scoped_ptr\", r);\n    }\n\n    template<class Archive, class T>\n    void load(\n        Archive & ar,\n        boost::scoped_ptr< T > & t,\n        const unsigned int /* version */\n    ){\n        T* r;\n        ar >> boost::serialization::make_nvp(\"scoped_ptr\", r);\n        t.reset(r);\n    }\n\n    template<class Archive, class T>\n    void serialize(\n        Archive& ar,\n        boost::scoped_ptr< T >& t,\n        const unsigned int version\n    ){\n        boost::serialization::split_free(ar, t, version);\n    }\n\n} // namespace serialization\n} // namespace boost\n\n#endif // BOOST_SERIALIZATION_SCOPED_PTR_HPP_VP_2003_10_30\n"
  },
  {
    "path": "include/boost/serialization/serialization.hpp",
    "content": "#ifndef BOOST_SERIALIZATION_SERIALIZATION_HPP\n#define BOOST_SERIALIZATION_SERIALIZATION_HPP\n\n// MS compatible compilers support #pragma once\n#if defined(_MSC_VER)\n# pragma once\n#endif\n\n#if defined(_MSC_VER)\n#  pragma warning (disable : 4675) // suppress ADL warning\n#endif\n\n#include <boost/config.hpp>\n#include <boost/serialization/strong_typedef.hpp>\n\n/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// serialization.hpp: interface for serialization system.\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for updates, documentation, and revision history.\n\n//////////////////////////////////////////////////////////////////////\n// public interface to serialization.\n\n/////////////////////////////////////////////////////////////////////////////\n// layer 0 - intrusive version\n// declared and implemented for each user defined class to be serialized\n//\n//  template<Archive>\n//  serialize(Archive &ar, const unsigned int file_version){\n//      ar & base_object<base>(*this) & member1 & member2 ... ;\n//  }\n\n/////////////////////////////////////////////////////////////////////////////\n// layer 1 - layer that routes member access through the access class.\n// this is what permits us to grant access to private class member functions\n// by specifying friend class boost::serialization::access\n\n#include <boost/serialization/access.hpp>\n\n/////////////////////////////////////////////////////////////////////////////\n// layer 2 - default implementation of non-intrusive serialization.\n//\n\nnamespace boost {\nnamespace serialization {\n\nBOOST_STRONG_TYPEDEF(unsigned int, version_type)\n\n// default implementation - call the member function \"serialize\"\ntemplate<class Archive, class T>\ninline void serialize(\n    Archive & ar, T & t, const unsigned int file_version\n){\n    access::serialize(ar, t, static_cast<unsigned int>(file_version));\n}\n\n// save data required for construction\ntemplate<class Archive, class T>\ninline void save_construct_data(\n    Archive & /*ar*/,\n    const T * /*t*/,\n    const unsigned int /*file_version */\n){\n    // default is to save no data because default constructor\n    // requires no arguments.\n}\n\n// load data required for construction and invoke constructor in place\ntemplate<class Archive, class T>\ninline void load_construct_data(\n    Archive & /*ar*/,\n    T * t,\n    const unsigned int /*file_version*/\n){\n    // default just uses the default constructor.  going\n    // through access permits usage of otherwise private default\n    // constructor\n    access::construct(t);\n}\n\n/////////////////////////////////////////////////////////////////////////////\n// layer 3 - move call into serialization namespace so that ADL will function\n// in the manner we desire.\n//\n// on compilers which don't implement ADL. only the current namespace\n// i.e. boost::serialization will be searched.\n//\n// on compilers which DO implement ADL\n// serialize overrides can be in any of the following\n//\n// 1) same namepace as Archive\n// 2) same namespace as T\n// 3) boost::serialization\n//\n// Due to Martin Ecker\n\ntemplate<class Archive, class T>\ninline void serialize_adl(\n    Archive & ar,\n    T & t,\n    const unsigned int file_version\n){\n    const version_type v(file_version);\n    serialize(ar, t, v);\n}\n\ntemplate<class Archive, class T>\ninline void save_construct_data_adl(\n    Archive & ar,\n    const T * t,\n    const unsigned int file_version\n){\n\n    const version_type v(file_version);\n    save_construct_data(ar, t, v);\n}\n\ntemplate<class Archive, class T>\ninline void load_construct_data_adl(\n    Archive & ar,\n    T * t,\n    const unsigned int file_version\n){\n    // see above comment\n    const version_type v(file_version);\n    load_construct_data(ar, t, v);\n}\n\n} // namespace serialization\n} // namespace boost\n\n#endif //BOOST_SERIALIZATION_SERIALIZATION_HPP\n"
  },
  {
    "path": "include/boost/serialization/set.hpp",
    "content": "#ifndef  BOOST_SERIALIZATION_SET_HPP\n#define BOOST_SERIALIZATION_SET_HPP\n\n// MS compatible compilers support #pragma once\n#if defined(_MSC_VER)\n# pragma once\n#endif\n\n/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// set.hpp: serialization for stl set templates\n\n// (C) Copyright 2002-2014 Robert Ramey - http://www.rrsd.com .\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for updates, documentation, and revision history.\n\n#include <set>\n\n#include <boost/config.hpp>\n\n#include <boost/serialization/access.hpp>\n#include <boost/serialization/nvp.hpp>\n#include <boost/serialization/detail/stack_constructor.hpp>\n#include <boost/serialization/collection_size_type.hpp>\n#include <boost/serialization/item_version_type.hpp>\n#include <boost/serialization/library_version_type.hpp>\n\n#include <boost/serialization/collections_save_imp.hpp>\n#include <boost/serialization/split_free.hpp>\n#include <boost/move/utility_core.hpp>\n\nnamespace boost {\nnamespace serialization {\n\ntemplate<class Archive, class Container>\ninline void load_set_collection(Archive & ar, Container &s)\n{\n    s.clear();\n    const boost::serialization::library_version_type library_version(\n        ar.get_library_version()\n    );\n    // retrieve number of elements\n    item_version_type item_version(0);\n    collection_size_type count;\n    ar >> BOOST_SERIALIZATION_NVP(count);\n    if(boost::serialization::library_version_type(3) < library_version){\n        ar >> BOOST_SERIALIZATION_NVP(item_version);\n    }\n    typename Container::iterator hint;\n    hint = s.begin();\n    while(count-- > 0){\n        typedef typename Container::value_type type;\n        detail::stack_construct<Archive, type> t(ar, item_version);\n        // borland fails silently w/o full namespace\n        ar >> boost::serialization::make_nvp(\"item\", t.reference());\n        typename Container::iterator result =\n            s.insert(hint, boost::move(t.reference()));\n        const type * new_address = & (* result);\n        ar.reset_object_address(new_address, & t.reference());\n        hint = result;\n    }\n}\n\ntemplate<class Archive, class Key, class Compare, class Allocator >\ninline void save(\n    Archive & ar,\n    const std::set<Key, Compare, Allocator> &t,\n    const unsigned int /* file_version */\n){\n    boost::serialization::stl::save_collection<\n        Archive, std::set<Key, Compare, Allocator>\n    >(ar, t);\n}\n\ntemplate<class Archive, class Key, class Compare, class Allocator >\ninline void load(\n    Archive & ar,\n    std::set<Key, Compare, Allocator> &t,\n    const unsigned int /* file_version */\n){\n    load_set_collection(ar, t);\n}\n\n// split non-intrusive serialization function member into separate\n// non intrusive save/load member functions\ntemplate<class Archive, class Key, class Compare, class Allocator >\ninline void serialize(\n    Archive & ar,\n    std::set<Key, Compare, Allocator> & t,\n    const unsigned int file_version\n){\n    boost::serialization::split_free(ar, t, file_version);\n}\n\n// multiset\ntemplate<class Archive, class Key, class Compare, class Allocator >\ninline void save(\n    Archive & ar,\n    const std::multiset<Key, Compare, Allocator> &t,\n    const unsigned int /* file_version */\n){\n    boost::serialization::stl::save_collection<\n        Archive,\n        std::multiset<Key, Compare, Allocator>\n    >(ar, t);\n}\n\ntemplate<class Archive, class Key, class Compare, class Allocator >\ninline void load(\n    Archive & ar,\n    std::multiset<Key, Compare, Allocator> &t,\n    const unsigned int /* file_version */\n){\n    load_set_collection(ar, t);\n}\n\n// split non-intrusive serialization function member into separate\n// non intrusive save/load member functions\ntemplate<class Archive, class Key, class Compare, class Allocator >\ninline void serialize(\n    Archive & ar,\n    std::multiset<Key, Compare, Allocator> & t,\n    const unsigned int file_version\n){\n    boost::serialization::split_free(ar, t, file_version);\n}\n\n} // namespace serialization\n} // namespace boost\n\n#include <boost/serialization/collection_traits.hpp>\n\nBOOST_SERIALIZATION_COLLECTION_TRAITS(std::set)\nBOOST_SERIALIZATION_COLLECTION_TRAITS(std::multiset)\n\n#endif // BOOST_SERIALIZATION_SET_HPP\n"
  },
  {
    "path": "include/boost/serialization/shared_ptr.hpp",
    "content": "#ifndef BOOST_SERIALIZATION_SHARED_PTR_HPP\n#define BOOST_SERIALIZATION_SHARED_PTR_HPP\n\n// MS compatible compilers support #pragma once\n#if defined(_MSC_VER)\n# pragma once\n#endif\n\n/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// shared_ptr.hpp: serialization for boost shared pointer\n\n// (C) Copyright 2004 Robert Ramey and Martin Ecker\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for updates, documentation, and revision history.\n\n#include <cstddef> // NULL\n#include <memory>\n\n#include <boost/config.hpp>\n#include <boost/mpl/integral_c.hpp>\n#include <boost/mpl/integral_c_tag.hpp>\n\n#include <boost/detail/workaround.hpp>\n#include <boost/shared_ptr.hpp>\n\n#include <boost/serialization/shared_ptr_helper.hpp>\n#include <boost/serialization/split_free.hpp>\n#include <boost/serialization/nvp.hpp>\n#include <boost/serialization/version.hpp>\n#include <boost/serialization/tracking.hpp>\n\n/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// boost:: shared_ptr serialization traits\n// version 1 to distinguish from boost 1.32 version. Note: we can only do this\n// for a template when the compiler supports partial template specialization\n\n#ifndef BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION\n    namespace boost {\n    namespace serialization{\n        template<class T>\n        struct version< ::boost::shared_ptr< T > > {\n            typedef mpl::integral_c_tag tag;\n            #if BOOST_WORKAROUND(__MWERKS__, BOOST_TESTED_AT(0x3206))\n            typedef typename mpl::int_<1> type;\n            #else\n            typedef mpl::int_<1> type;\n            #endif\n            BOOST_STATIC_CONSTANT(int, value = type::value);\n        };\n        // don't track shared pointers\n        template<class T>\n        struct tracking_level< ::boost::shared_ptr< T > > {\n            typedef mpl::integral_c_tag tag;\n            #if BOOST_WORKAROUND(__MWERKS__, BOOST_TESTED_AT(0x3206))\n            typedef typename mpl::int_< ::boost::serialization::track_never> type;\n            #else\n            typedef mpl::int_< ::boost::serialization::track_never> type;\n            #endif\n            BOOST_STATIC_CONSTANT(int, value = type::value);\n        };\n    }}\n    #define BOOST_SERIALIZATION_SHARED_PTR(T)\n#else\n    // define macro to let users of these compilers do this\n    #define BOOST_SERIALIZATION_SHARED_PTR(T)                         \\\n    BOOST_CLASS_VERSION(                                              \\\n        ::boost::shared_ptr< T >,                                     \\\n        1                                                             \\\n    )                                                                 \\\n    BOOST_CLASS_TRACKING(                                             \\\n        ::boost::shared_ptr< T >,                                     \\\n        ::boost::serialization::track_never                           \\\n    )                                                                 \\\n    /**/\n#endif\n\nnamespace boost {\nnamespace serialization{\n\nstruct null_deleter {\n    void operator()(void const *) const {}\n};\n\n/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// serialization for boost::shared_ptr\n\n// Using a constant means that all shared pointers are held in the same set.\n// Thus we detect handle multiple pointers to the same value instances\n// in the archive.\nvoid * const shared_ptr_helper_id = 0;\n\ntemplate<class Archive, class T>\ninline void save(\n    Archive & ar,\n    const boost::shared_ptr< T > &t,\n    const unsigned int /* file_version */\n){\n    // The most common cause of trapping here would be serializing\n    // something like shared_ptr<int>.  This occurs because int\n    // is never tracked by default.  Wrap int in a trackable type\n    BOOST_STATIC_ASSERT((tracking_level< T >::value != track_never));\n    const T * t_ptr = t.get();\n    ar << boost::serialization::make_nvp(\"px\", t_ptr);\n}\n\n#ifdef BOOST_SERIALIZATION_SHARED_PTR_132_HPP\ntemplate<class Archive, class T>\ninline void load(\n    Archive & ar,\n    boost::shared_ptr< T > &t,\n    const unsigned int file_version\n){\n    // something like shared_ptr<int>.  This occurs because int\n    // is never tracked by default.  Wrap int in a trackable type\n    BOOST_STATIC_ASSERT((tracking_level< T >::value != track_never));\n    T* r;\n    if(file_version < 1){\n        ar.register_type(static_cast<\n            boost_132::detail::sp_counted_base_impl<T *, null_deleter > *\n        >(NULL));\n        boost_132::shared_ptr< T > sp;\n        ar >> boost::serialization::make_nvp(\"px\", sp.px);\n        ar >> boost::serialization::make_nvp(\"pn\", sp.pn);\n        // got to keep the sps around so the sp.pns don't disappear\n        boost::serialization::shared_ptr_helper<boost::shared_ptr> & h =\n            ar.template get_helper< shared_ptr_helper<boost::shared_ptr> >(\n                shared_ptr_helper_id\n            );\n        h.append(sp);\n        r = sp.get();\n    }\n    else{\n        ar >> boost::serialization::make_nvp(\"px\", r);\n    }\n    shared_ptr_helper<boost::shared_ptr> & h =\n        ar.template get_helper<shared_ptr_helper<boost::shared_ptr> >(\n            shared_ptr_helper_id\n        );\n    h.reset(t,r);\n}\n#else\n\ntemplate<class Archive, class T>\ninline void load(\n    Archive & ar,\n    boost::shared_ptr< T > &t,\n    const unsigned int /*file_version*/\n){\n    // The most common cause of trapping here would be serializing\n    // something like shared_ptr<int>.  This occurs because int\n    // is never tracked by default.  Wrap int in a trackable type\n    BOOST_STATIC_ASSERT((tracking_level< T >::value != track_never));\n    T* r;\n    ar >> boost::serialization::make_nvp(\"px\", r);\n\n    boost::serialization::shared_ptr_helper<boost::shared_ptr> & h =\n        ar.template get_helper<shared_ptr_helper<boost::shared_ptr> >(\n            shared_ptr_helper_id\n        );\n    h.reset(t,r);\n}\n#endif\n\ntemplate<class Archive, class T>\ninline void serialize(\n    Archive & ar,\n    boost::shared_ptr< T > &t,\n    const unsigned int file_version\n){\n    // correct shared_ptr serialization depends upon object tracking\n    // being used.\n    BOOST_STATIC_ASSERT(\n        boost::serialization::tracking_level< T >::value\n        != boost::serialization::track_never\n    );\n    boost::serialization::split_free(ar, t, file_version);\n}\n\n} // namespace serialization\n} // namespace boost\n\n/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// std::shared_ptr serialization traits\n// version 1 to distinguish from boost 1.32 version. Note: we can only do this\n// for a template when the compiler supports partial template specialization\n\n#ifndef BOOST_NO_CXX11_SMART_PTR\n#include <boost/static_assert.hpp>\n\n// note: we presume that any compiler/library which supports C++11\n// std::pointers also supports template partial specialization\n// trap here if such presumption were to turn out to wrong!!!\n#ifdef BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION\n    BOOST_STATIC_ASSERT(false);\n#endif\n\nnamespace boost {\nnamespace serialization{\n    template<class T>\n    struct version< ::std::shared_ptr< T > > {\n        typedef mpl::integral_c_tag tag;\n        typedef mpl::int_<1> type;\n        BOOST_STATIC_CONSTANT(int, value = type::value);\n    };\n    // don't track shared pointers\n    template<class T>\n    struct tracking_level< ::std::shared_ptr< T > > {\n        typedef mpl::integral_c_tag tag;\n        typedef mpl::int_< ::boost::serialization::track_never> type;\n        BOOST_STATIC_CONSTANT(int, value = type::value);\n    };\n}}\n// the following just keeps older programs from breaking\n#define BOOST_SERIALIZATION_SHARED_PTR(T)\n\nnamespace boost {\nnamespace serialization{\n\n/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// serialization for std::shared_ptr\n\ntemplate<class Archive, class T>\ninline void save(\n    Archive & ar,\n    const std::shared_ptr< T > &t,\n    const unsigned int /* file_version */\n){\n    // The most common cause of trapping here would be serializing\n    // something like shared_ptr<int>.  This occurs because int\n    // is never tracked by default.  Wrap int in a trackable type\n    BOOST_STATIC_ASSERT((tracking_level< T >::value != track_never));\n    const T * t_ptr = t.get();\n    ar << boost::serialization::make_nvp(\"px\", t_ptr);\n}\n\ntemplate<class Archive, class T>\ninline void load(\n    Archive & ar,\n    std::shared_ptr< T > &t,\n    const unsigned int /*file_version*/\n){\n    // The most common cause of trapping here would be serializing\n    // something like shared_ptr<int>.  This occurs because int\n    // is never tracked by default.  Wrap int in a trackable type\n    BOOST_STATIC_ASSERT((tracking_level< T >::value != track_never));\n    T* r;\n    ar >> boost::serialization::make_nvp(\"px\", r);\n    //void (* const id)(Archive &, std::shared_ptr< T > &, const unsigned int) = & load;\n    boost::serialization::shared_ptr_helper<std::shared_ptr> & h =\n        ar.template get_helper<\n            shared_ptr_helper<std::shared_ptr>\n        >(\n            shared_ptr_helper_id\n        );\n    h.reset(t,r);\n}\n\ntemplate<class Archive, class T>\ninline void serialize(\n    Archive & ar,\n    std::shared_ptr< T > &t,\n    const unsigned int file_version\n){\n    // correct shared_ptr serialization depends upon object tracking\n    // being used.\n    BOOST_STATIC_ASSERT(\n        boost::serialization::tracking_level< T >::value\n        != boost::serialization::track_never\n    );\n    boost::serialization::split_free(ar, t, file_version);\n}\n\n} // namespace serialization\n} // namespace boost\n\n#endif // BOOST_NO_CXX11_SMART_PTR\n\n#endif // BOOST_SERIALIZATION_SHARED_PTR_HPP\n"
  },
  {
    "path": "include/boost/serialization/shared_ptr_132.hpp",
    "content": "#ifndef BOOST_SERIALIZATION_SHARED_PTR_132_HPP\n#define BOOST_SERIALIZATION_SHARED_PTR_132_HPP\n\n// MS compatible compilers support #pragma once\n#if defined(_MSC_VER)\n# pragma once\n#endif\n\n/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// shared_ptr.hpp: serialization for boost shared pointer\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for updates, documentation, and revision history.\n\n// note: totally unadvised hack to gain access to private variables\n// in shared_ptr and shared_count. Unfortunately its the only way to\n// do this without changing shared_ptr and shared_count\n// the best we can do is to detect a conflict here\n#include <boost/config.hpp>\n\n#include <list>\n#include <cstddef> // NULL\n\n#include <boost/serialization/assume_abstract.hpp>\n#include <boost/serialization/split_free.hpp>\n#include <boost/serialization/nvp.hpp>\n#include <boost/serialization/tracking.hpp>\n#include <boost/serialization/void_cast.hpp>\n\n// mark base class as an (uncreatable) base class\n#include <boost/serialization/detail/shared_ptr_132.hpp>\n\n/////////////////////////////////////////////////////////////\n// Maintain a couple of lists of loaded shared pointers of the old previous\n// version (1.32)\n\nnamespace boost_132 {\nnamespace serialization {\nnamespace detail {\n\nstruct null_deleter {\n    void operator()(void const *) const {}\n};\n\n} // namespace detail\n} // namespace serialization\n} // namespace boost_132\n\n/////////////////////////////////////////////////////////////\n// sp_counted_base_impl serialization\n\nnamespace boost {\nnamespace serialization {\n\ntemplate<class Archive, class P, class D>\ninline void serialize(\n    Archive & /* ar */,\n    boost_132::detail::sp_counted_base_impl<P, D> & /* t */,\n    const unsigned int /*file_version*/\n){\n    // register the relationship between each derived class\n    // its polymorphic base\n    boost::serialization::void_cast_register<\n        boost_132::detail::sp_counted_base_impl<P, D>,\n        boost_132::detail::sp_counted_base\n    >(\n        static_cast<boost_132::detail::sp_counted_base_impl<P, D> *>(NULL),\n        static_cast<boost_132::detail::sp_counted_base *>(NULL)\n    );\n}\n\ntemplate<class Archive, class P, class D>\ninline void save_construct_data(\n    Archive & ar,\n    const\n    boost_132::detail::sp_counted_base_impl<P, D> *t,\n    const unsigned int /* file_version */\n){\n    // variables used for construction\n    ar << boost::serialization::make_nvp(\"ptr\", t->ptr);\n}\n\ntemplate<class Archive, class P, class D>\ninline void load_construct_data(\n    Archive & ar,\n    boost_132::detail::sp_counted_base_impl<P, D> * t,\n    const unsigned int /* file_version */\n){\n    P ptr_;\n    ar >> boost::serialization::make_nvp(\"ptr\", ptr_);\n    // ::new(t)boost_132::detail::sp_counted_base_impl<P, D>(ptr_,  D());\n    // placement\n    // note: the original ::new... above is replaced by the one here.  This one\n    // creates all new objects with a null_deleter so that after the archive\n    // is finished loading and the shared_ptrs are destroyed - the underlying\n    // raw pointers are NOT deleted.  This is necessary as they are used by the\n    // new system as well.\n    ::new(t)boost_132::detail::sp_counted_base_impl<\n        P,\n        boost_132::serialization::detail::null_deleter\n    >(\n        ptr_,  boost_132::serialization::detail::null_deleter()\n    ); // placement new\n    // compensate for that fact that a new shared count always is\n    // initialized with one. the add_ref_copy below will increment it\n    // every time its serialized so without this adjustment\n    // the use and weak counts will be off by one.\n    t->use_count_ = 0;\n}\n\n} // serialization\n} // namespace boost\n\n/////////////////////////////////////////////////////////////\n// shared_count serialization\n\nnamespace boost {\nnamespace serialization {\n\ntemplate<class Archive>\ninline void save(\n    Archive & ar,\n    const boost_132::detail::shared_count &t,\n    const unsigned int /* file_version */\n){\n    ar << boost::serialization::make_nvp(\"pi\", t.pi_);\n}\n\ntemplate<class Archive>\ninline void load(\n    Archive & ar,\n    boost_132::detail::shared_count &t,\n    const unsigned int /* file_version */\n){\n    ar >> boost::serialization::make_nvp(\"pi\", t.pi_);\n    if(NULL != t.pi_)\n        t.pi_->add_ref_copy();\n}\n\n} // serialization\n} // namespace boost\n\nBOOST_SERIALIZATION_SPLIT_FREE(boost_132::detail::shared_count)\n\n/////////////////////////////////////////////////////////////\n// implement serialization for shared_ptr< T >\n\nnamespace boost {\nnamespace serialization {\n\ntemplate<class Archive, class T>\ninline void save(\n    Archive & ar,\n    const boost_132::shared_ptr< T > &t,\n    const unsigned int /* file_version */\n){\n    // only the raw pointer has to be saved\n    // the ref count is maintained automatically as shared pointers are loaded\n    ar.register_type(static_cast<\n        boost_132::detail::sp_counted_base_impl<T *, boost::checked_deleter< T > > *\n    >(NULL));\n    ar << boost::serialization::make_nvp(\"px\", t.px);\n    ar << boost::serialization::make_nvp(\"pn\", t.pn);\n}\n\ntemplate<class Archive, class T>\ninline void load(\n    Archive & ar,\n    boost_132::shared_ptr< T > &t,\n    const unsigned int /* file_version */\n){\n    // only the raw pointer has to be saved\n    // the ref count is maintained automatically as shared pointers are loaded\n    ar.register_type(static_cast<\n        boost_132::detail::sp_counted_base_impl<T *, boost::checked_deleter< T > > *\n    >(NULL));\n    ar >> boost::serialization::make_nvp(\"px\", t.px);\n    ar >> boost::serialization::make_nvp(\"pn\", t.pn);\n}\n\ntemplate<class Archive, class T>\ninline void serialize(\n    Archive & ar,\n    boost_132::shared_ptr< T > &t,\n    const unsigned int file_version\n){\n    // correct shared_ptr serialization depends upon object tracking\n    // being used.\n    BOOST_STATIC_ASSERT(\n        boost::serialization::tracking_level< T >::value\n        != boost::serialization::track_never\n    );\n    boost::serialization::split_free(ar, t, file_version);\n}\n\n} // serialization\n} // namespace boost\n\n// note: change below uses null_deleter\n// This macro is used to export GUIDS for shared pointers to allow\n// the serialization system to export them properly. David Tonge\n#define BOOST_SHARED_POINTER_EXPORT_GUID(T, K)                     \\\n    typedef boost_132::detail::sp_counted_base_impl<               \\\n        T *,                                                       \\\n        boost::checked_deleter< T >                                \\\n    > __shared_ptr_ ## T;                                          \\\n    BOOST_CLASS_EXPORT_GUID(__shared_ptr_ ## T, \"__shared_ptr_\" K) \\\n    BOOST_CLASS_EXPORT_GUID(T, K)                                  \\\n    /**/\n\n#define BOOST_SHARED_POINTER_EXPORT(T)                             \\\n    BOOST_SHARED_POINTER_EXPORT_GUID(                              \\\n        T,                                                         \\\n        BOOST_PP_STRINGIZE(T)                                      \\\n    )                                                              \\\n    /**/\n\n#endif // BOOST_SERIALIZATION_SHARED_PTR_132_HPP\n"
  },
  {
    "path": "include/boost/serialization/shared_ptr_helper.hpp",
    "content": "#ifndef BOOST_SERIALIZATION_SHARED_PTR_HELPER_HPP\n#define BOOST_SERIALIZATION_SHARED_PTR_HELPER_HPP\n\n// MS compatible compilers support #pragma once\n#if defined(_MSC_VER)\n# pragma once\n#endif\n\n/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// shared_ptr_helper.hpp: serialization for boost shared pointer\n\n// (C) Copyright 2004-2009 Robert Ramey, Martin Ecker and Takatoshi Kondo\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for updates, documentation, and revision history.\n\n#include <map>\n#include <list>\n#include <utility>\n#include <cstddef> // NULL\n\n#include <boost/config.hpp>\n#include <boost/shared_ptr.hpp>\n#include <boost/type_traits/is_polymorphic.hpp>\n#include <boost/mpl/if.hpp>\n\n#include <boost/serialization/singleton.hpp>\n#include <boost/serialization/extended_type_info.hpp>\n#include <boost/serialization/throw_exception.hpp>\n#include <boost/serialization/type_info_implementation.hpp>\n#include <boost/archive/archive_exception.hpp>\n\nnamespace boost_132 {\n    template<class T> class shared_ptr;\n}\nnamespace boost {\nnamespace serialization {\n\n#ifndef BOOST_NO_MEMBER_TEMPLATE_FRIENDS\ntemplate<class Archive, template<class U> class SPT >\nvoid load(\n    Archive & ar,\n    SPT< class U > &t,\n    const unsigned int file_version\n);\n#endif\n\n/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// a common class for holding various types of shared pointers\n\ntemplate<template<class T> class SPT>\nclass shared_ptr_helper {\n    typedef std::map<\n        const void *, // address of object\n        SPT<const void> // address shared ptr to single instance\n    > object_shared_pointer_map;\n\n    // list of shared_pointers create accessible by raw pointer. This\n    // is used to \"match up\" shared pointers loaded at different\n    // points in the archive. Note, we delay construction until\n    // it is actually used since this is by default included as\n    // a \"mix-in\" even if shared_ptr isn't used.\n    object_shared_pointer_map * m_o_sp;\n\n    struct null_deleter {\n        void operator()(void const *) const {}\n    };\n\n#if defined(BOOST_NO_MEMBER_TEMPLATE_FRIENDS) \\\n|| defined(BOOST_MSVC) \\\n|| defined(__SUNPRO_CC)\npublic:\n#else\n    template<class Archive, class U>\n    friend void boost::serialization::load(\n        Archive & ar,\n        SPT< U > &t,\n        const unsigned int file_version\n    );\n#endif\n\n    #ifdef BOOST_SERIALIZATION_SHARED_PTR_132_HPP\n    // list of loaded pointers.  This is used to be sure that the pointers\n    // stay around long enough to be \"matched\" with other pointers loaded\n    // by the same archive.  These are created with a \"null_deleter\" so that\n    // when this list is destroyed - the underlying raw pointers are not\n    // destroyed.  This has to be done because the pointers are also held by\n    // new system which is disjoint from this set.  This is implemented\n    // by a change in load_construct_data below.  It makes this file suitable\n    // only for loading pointers into a 1.33 or later boost system.\n    std::list<boost_132::shared_ptr<const void> > * m_pointers_132;\n    void\n    append(const boost_132::shared_ptr<const void> & t){\n        if(NULL == m_pointers_132)\n            m_pointers_132 = new std::list<boost_132::shared_ptr<const void> >;\n        m_pointers_132->push_back(t);\n    }\n    #endif\n\n    struct non_polymorphic {\n        template<class U>\n        static const boost::serialization::extended_type_info *\n        get_object_type(U & ){\n            return & boost::serialization::singleton<\n                typename\n                boost::serialization::type_info_implementation< U >::type\n            >::get_const_instance();\n        }\n    };\n    struct polymorphic {\n        template<class U>\n        static const boost::serialization::extended_type_info *\n        get_object_type(U & u){\n            return boost::serialization::singleton<\n                typename\n                boost::serialization::type_info_implementation< U >::type\n            >::get_const_instance().get_derived_extended_type_info(u);\n        }\n    };\n\npublic:\n    template<class T>\n    void reset(SPT< T > & s, T * t){\n        if(NULL == t){\n            s.reset();\n            return;\n        }\n        const boost::serialization::extended_type_info * this_type\n            = & boost::serialization::type_info_implementation< T >::type\n                    ::get_const_instance();\n\n        // get pointer to the most derived object's eti.  This is effectively\n        // the object type identifier\n        typedef typename mpl::if_<\n            is_polymorphic< T >,\n            polymorphic,\n            non_polymorphic\n        >::type type;\n\n        const boost::serialization::extended_type_info * true_type\n            = type::get_object_type(*t);\n\n        // note:if this exception is thrown, be sure that derived pointer\n        // is either registered or exported.\n        if(NULL == true_type)\n            boost::serialization::throw_exception(\n                boost::archive::archive_exception(\n                    boost::archive::archive_exception::unregistered_class,\n                    this_type->get_debug_info()\n                )\n            );\n        // get void pointer to the most derived type\n        // this uniquely identifies the object referred to\n        // oid = \"object identifier\"\n        const void * oid = void_downcast(\n            *true_type,\n            *this_type,\n            t\n        );\n        if(NULL == oid)\n            boost::serialization::throw_exception(\n                boost::archive::archive_exception(\n                    boost::archive::archive_exception::unregistered_cast,\n                    true_type->get_debug_info(),\n                    this_type->get_debug_info()\n                )\n            );\n\n        // make tracking array if necessary\n        if(NULL == m_o_sp)\n            m_o_sp = new object_shared_pointer_map;\n\n        typename object_shared_pointer_map::iterator i = m_o_sp->find(oid);\n\n        // if it's a new object\n        if(i == m_o_sp->end()){\n            s.reset(t);\n            std::pair<typename object_shared_pointer_map::iterator, bool> result;\n            result = m_o_sp->insert(std::make_pair(oid, s));\n            BOOST_ASSERT(result.second);\n        }\n        // if the object has already been seen\n        else{\n            s = SPT<T>(i->second, t);\n        }\n    }\n\n    shared_ptr_helper() :\n        m_o_sp(NULL)\n        #ifdef BOOST_SERIALIZATION_SHARED_PTR_132_HPP\n            , m_pointers_132(NULL)\n        #endif\n    {}\n    virtual ~shared_ptr_helper(){\n        if(NULL != m_o_sp)\n            delete m_o_sp;\n        #ifdef BOOST_SERIALIZATION_SHARED_PTR_132_HPP\n        if(NULL != m_pointers_132)\n            delete m_pointers_132;\n        #endif\n    }\n};\n\n} // namespace serialization\n} // namespace boost\n\n#endif // BOOST_SERIALIZATION_SHARED_PTR_HELPER_HPP\n"
  },
  {
    "path": "include/boost/serialization/singleton.hpp",
    "content": "#ifndef BOOST_SERIALIZATION_SINGLETON_HPP\n#define BOOST_SERIALIZATION_SINGLETON_HPP\n\n/////////1/////////2///////// 3/////////4/////////5/////////6/////////7/////////8\n//  singleton.hpp\n//\n// Copyright David Abrahams 2006. Original version\n//\n// Copyright Robert Ramey 2007.  Changes made to permit\n// application throughout the serialization library.\n//\n// Copyright Alexander Grund 2018. Corrections to singleton lifetime\n//\n// Distributed under the Boost\n// Software License, Version 1.0. (See accompanying\n// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n//\n// The intention here is to define a template which will convert\n// any class into a singleton with the following features:\n//\n// a) initialized before first use.\n// b) thread-safe for const access to the class\n// c) non-locking\n//\n// In order to do this,\n// a) Initialize dynamically when used.\n// b) Require that all singletons be initialized before main\n// is called or any entry point into the shared library is invoked.\n// This guarantees no race condition for initialization.\n// In debug mode, we assert that no non-const functions are called\n// after main is invoked.\n//\n\n// MS compatible compilers support #pragma once\n#if defined(_MSC_VER)\n# pragma once\n#endif\n\n#include <boost/assert.hpp>\n#include <boost/config.hpp>\n#include <boost/noncopyable.hpp>\n#include <boost/serialization/force_include.hpp>\n#include <boost/serialization/config.hpp>\n\n#include <boost/archive/detail/auto_link_archive.hpp>\n#include <boost/archive/detail/abi_prefix.hpp> // must be the last header\n\n#ifdef BOOST_MSVC\n#  pragma warning(push)\n#  pragma warning(disable : 4511 4512)\n#endif\n\nnamespace boost {\nnamespace serialization {\n\n//////////////////////////////////////////////////////////////////////\n// Provides a dynamically-initialized (singleton) instance of T in a\n// way that avoids LNK1179 on vc6.  See http://tinyurl.com/ljdp8 or\n// http://lists.boost.org/Archives/boost/2006/05/105286.php for\n// details.\n//\n\n// Singletons created by this code are guaranteed to be unique\n// within the executable or shared library which creates them.\n// This is sufficient and in fact ideal for the serialization library.\n// The singleton is created when the module is loaded and destroyed\n// when the module is unloaded.\n\n// This base class has two functions.\n\n// First it provides a module handle for each singleton indicating\n// the executable or shared library in which it was created. This\n// turns out to be necessary and sufficient to implement the tables\n// used by serialization library.\n\n// Second, it provides a mechanism to detect when a non-const function\n// is called after initialization.\n\n// Make a singleton to lock/unlock all singletons for alteration.\n// The intent is that all singletons created/used by this code\n// are to be initialized before main is called. A test program\n// can lock all the singletons when main is entered.  Thus any\n// attempt to retrieve a mutable instance while locked will\n// generate an assertion if compiled for debug.\n\n// The singleton template can be used in 2 ways:\n// 1 (Recommended): Publicly inherit your type T from singleton<T>,\n// make its ctor protected and access it via T::get_const_instance()\n// 2: Simply access singleton<T> without changing T. Note that this only\n// provides a global instance accessible by singleton<T>::get_const_instance()\n// or singleton<T>::get_mutable_instance() to prevent using multiple instances\n// of T make its ctor protected\n\n// Note on usage of BOOST_DLLEXPORT: These functions are in danger of\n// being eliminated by the optimizer when building an application in\n// release mode. Usage of the macro is meant to signal the compiler/linker\n// to avoid dropping these functions which seem to be unreferenced.\n// This usage is not related to autolinking.\n\nclass BOOST_SYMBOL_VISIBLE singleton_module :\n    public boost::noncopyable\n{\nprivate:\n    BOOST_DLLEXPORT bool & get_lock() BOOST_USED {\n        static bool lock = false;\n        return lock;\n    }\n\npublic:\n    BOOST_DLLEXPORT void lock(){\n        get_lock() = true;\n    }\n    BOOST_DLLEXPORT void unlock(){\n        get_lock() = false;\n    }\n    BOOST_DLLEXPORT bool is_locked(){\n        return get_lock();\n    }\n};\n\nstatic inline singleton_module & get_singleton_module(){\n    static singleton_module m;\n    return m;\n}\n\nnamespace detail {\n\n// This is the class actually instantiated and hence the real singleton.\n// So there will only be one instance of this class. This does not hold\n// for singleton<T> as a class derived from singleton<T> could be\n// instantiated multiple times.\n// It also provides a flag `is_destroyed` which returns true, when the\n// class was destructed. It is static and hence accessible even after\n// destruction. This can be used to check, if the singleton is still\n// accessible e.g. in destructors of other singletons.\ntemplate<class T>\nclass singleton_wrapper : public T\n{\n    static bool & get_is_destroyed(){\n        // Prefer a static function member to avoid LNK1179.\n        // Note: As this is for a singleton (1 instance only) it must be set\n        // never be reset (to false)!\n        static bool is_destroyed_flag = false;\n        return is_destroyed_flag;\n    }\npublic:\n    singleton_wrapper(){\n        BOOST_ASSERT(! is_destroyed());\n    }\n    ~singleton_wrapper(){\n        get_is_destroyed() = true;\n    }\n    static bool is_destroyed(){\n        return get_is_destroyed();\n    }\n};\n\n} // detail\n\ntemplate <class T>\nclass singleton {\nprivate:\n    static T * m_instance;\n    // include this to provoke instantiation at pre-execution time\n    static void use(T const &) {}\n    static T & get_instance() {\n        BOOST_ASSERT(! is_destroyed());\n\n        // use a wrapper so that types T with protected constructors can be used\n        // Using a static function member avoids LNK1179\n        static detail::singleton_wrapper< T > t;\n\n        // note that the following is absolutely essential.\n        // commenting out this statement will cause compilers to fail to\n        // construct the instance at pre-execution time.  This would prevent\n        // our usage/implementation of \"locking\" and introduce uncertainty into\n        // the sequence of object initialization.\n        // Unfortunately, this triggers detectors of undefined behavior\n        // and reports an error.  But I've been unable to find a different way\n        // of guaranteeing that the the singleton is created at pre-main time.\n        if (m_instance) use(* m_instance);\n\n        return static_cast<T &>(t);\n    }\nprotected:\n    // Do not allow instantiation of a singleton<T>. But we want to allow\n    // `class T: public singleton<T>` so we can't delete this ctor\n    BOOST_DLLEXPORT singleton(){}\n\npublic:\n    BOOST_DLLEXPORT static T & get_mutable_instance(){\n        BOOST_ASSERT(! get_singleton_module().is_locked());\n        return get_instance();\n    }\n    BOOST_DLLEXPORT static const T & get_const_instance(){\n        return get_instance();\n    }\n    BOOST_DLLEXPORT static bool is_destroyed(){\n        return detail::singleton_wrapper< T >::is_destroyed();\n    }\n};\n\n// Assigning the instance reference to a static member forces initialization\n// at startup time as described in\n// https://groups.google.com/forum/#!topic/microsoft.public.vc.language/kDVNLnIsfZk\ntemplate<class T>\nT * singleton< T >::m_instance = & singleton< T >::get_instance();\n\n} // namespace serialization\n} // namespace boost\n\n#include <boost/archive/detail/abi_suffix.hpp> // pops abi_suffix.hpp pragmas\n\n#ifdef BOOST_MSVC\n#pragma warning(pop)\n#endif\n\n#endif // BOOST_SERIALIZATION_SINGLETON_HPP\n"
  },
  {
    "path": "include/boost/serialization/slist.hpp",
    "content": "#ifndef BOOST_SERIALIZATION_SLIST_HPP\n#define BOOST_SERIALIZATION_SLIST_HPP\n\n// MS compatible compilers support #pragma once\n#if defined(_MSC_VER)\n# pragma once\n#endif\n\n/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// slist.hpp\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for updates, documentation, and revision history.\n\n#include <boost/config.hpp>\n#ifdef BOOST_HAS_SLIST\n#include BOOST_SLIST_HEADER\n\n#include <boost/serialization/collections_save_imp.hpp>\n#include <boost/serialization/collections_load_imp.hpp>\n#include <boost/serialization/nvp.hpp>\n#include <boost/serialization/collection_size_type.hpp>\n#include <boost/serialization/item_version_type.hpp>\n#include <boost/serialization/library_version_type.hpp>\n#include <boost/serialization/split_free.hpp>\n#include <boost/serialization/detail/stack_constructor.hpp>\n#include <boost/serialization/detail/is_default_constructible.hpp>\n#include <boost/move/utility_core.hpp>\n\nnamespace boost {\nnamespace serialization {\n\ntemplate<class Archive, class U, class Allocator>\ninline void save(\n    Archive & ar,\n    const BOOST_STD_EXTENSION_NAMESPACE::slist<U, Allocator> &t,\n    const unsigned int file_version\n){\n    boost::serialization::stl::save_collection<\n        Archive,\n        BOOST_STD_EXTENSION_NAMESPACE::slist<U, Allocator>\n    >(ar, t);\n}\n\nnamespace stl {\n\ntemplate<\n    class Archive,\n    class T,\n    class Allocator\n>\ntypename boost::disable_if<\n    typename detail::is_default_constructible<\n        typename BOOST_STD_EXTENSION_NAMESPACE::slist<T, Allocator>::value_type\n    >,\n    void\n>::type\ncollection_load_impl(\n    Archive & ar,\n    BOOST_STD_EXTENSION_NAMESPACE::slist<T, Allocator> &t,\n    collection_size_type count,\n    item_version_type item_version\n){\n    t.clear();\n    boost::serialization::detail::stack_construct<Archive, T> u(ar, item_version);\n    ar >> boost::serialization::make_nvp(\"item\", u.reference());\n    t.push_front(boost::move(u.reference()));\n    typename BOOST_STD_EXTENSION_NAMESPACE::slist<T, Allocator>::iterator last;\n    last = t.begin();\n    ar.reset_object_address(&(*t.begin()) , & u.reference());\n    while(--count > 0){\n        detail::stack_construct<Archive, T> u(ar, item_version);\n        ar >> boost::serialization::make_nvp(\"item\", u.reference());\n        last = t.insert_after(last, boost::move(u.reference()));\n        ar.reset_object_address(&(*last) , & u.reference());\n    }\n}\n\n} // stl\n\ntemplate<class Archive, class U, class Allocator>\ninline void load(\n    Archive & ar,\n    BOOST_STD_EXTENSION_NAMESPACE::slist<U, Allocator> &t,\n    const unsigned int file_version\n){\n    const boost::serialization::library_version_type library_version(\n        ar.get_library_version()\n    );\n    // retrieve number of elements\n    item_version_type item_version(0);\n    collection_size_type count;\n    ar >> BOOST_SERIALIZATION_NVP(count);\n    if(boost::serialization::library_version_type(3) < library_version){\n        ar >> BOOST_SERIALIZATION_NVP(item_version);\n    }\n    if(detail::is_default_constructible<U>()){\n        t.resize(count);\n        typename BOOST_STD_EXTENSION_NAMESPACE::slist<U, Allocator>::iterator hint;\n        hint = t.begin();\n        while(count-- > 0){\n            ar >> boost::serialization::make_nvp(\"item\", *hint++);\n        }\n    }\n    else{\n        t.clear();\n        boost::serialization::detail::stack_construct<Archive, U> u(ar, item_version);\n        ar >> boost::serialization::make_nvp(\"item\", u.reference());\n        t.push_front(boost::move(u.reference()));\n        typename BOOST_STD_EXTENSION_NAMESPACE::slist<U, Allocator>::iterator last;\n        last = t.begin();\n        ar.reset_object_address(&(*t.begin()) , & u.reference());\n        while(--count > 0){\n            detail::stack_construct<Archive, U> u(ar, item_version);\n            ar >> boost::serialization::make_nvp(\"item\", u.reference());\n            last = t.insert_after(last, boost::move(u.reference()));\n            ar.reset_object_address(&(*last) , & u.reference());\n        }\n    }\n}\n\n// split non-intrusive serialization function member into separate\n// non intrusive save/load member functions\ntemplate<class Archive, class U, class Allocator>\ninline void serialize(\n    Archive & ar,\n    BOOST_STD_EXTENSION_NAMESPACE::slist<U, Allocator> &t,\n    const unsigned int file_version\n){\n    boost::serialization::split_free(ar, t, file_version);\n}\n\n} // serialization\n} // namespace boost\n\n#include <boost/serialization/collection_traits.hpp>\n\nBOOST_SERIALIZATION_COLLECTION_TRAITS(BOOST_STD_EXTENSION_NAMESPACE::slist)\n\n#endif  // BOOST_HAS_SLIST\n#endif  // BOOST_SERIALIZATION_SLIST_HPP\n"
  },
  {
    "path": "include/boost/serialization/smart_cast.hpp",
    "content": "#ifndef BOOST_SERIALIZATION_SMART_CAST_HPP\n#define BOOST_SERIALIZATION_SMART_CAST_HPP\n\n// MS compatible compilers support #pragma once\n#if defined(_MSC_VER)\n# pragma once\n#endif\n\n/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// smart_cast.hpp:\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org/libs/serialization for updates, documentation, and revision history.\n\n// casting of pointers and references.\n\n// In casting between different C++ classes, there are a number of\n// rules that have to be kept in mind in deciding whether to use\n// static_cast or dynamic_cast.\n\n// a) dynamic casting can only be applied when one of the types is polymorphic\n// Otherwise static_cast must be used.\n// b) only dynamic casting can do runtime error checking\n// use of static_cast is generally un checked even when compiled for debug\n// c) static_cast would be considered faster than dynamic_cast.\n\n// If casting is applied to a template parameter, there is no apriori way\n// to know which of the two casting methods will be permitted or convenient.\n\n// smart_cast uses C++ type_traits, and program debug mode to select the\n// most convenient cast to use.\n\n#include <exception>\n#include <typeinfo>\n#include <cstddef> // NULL\n\n#include <boost/config.hpp>\n#include <boost/static_assert.hpp>\n\n#include <boost/type_traits/is_base_and_derived.hpp>\n#include <boost/type_traits/is_polymorphic.hpp>\n#include <boost/type_traits/is_pointer.hpp>\n#include <boost/type_traits/is_reference.hpp>\n#include <boost/type_traits/is_same.hpp>\n#include <boost/type_traits/remove_pointer.hpp>\n#include <boost/type_traits/remove_reference.hpp>\n\n#include <boost/mpl/eval_if.hpp>\n#include <boost/mpl/if.hpp>\n#include <boost/mpl/or.hpp>\n#include <boost/mpl/and.hpp>\n#include <boost/mpl/not.hpp>\n#include <boost/mpl/identity.hpp>\n\n#include <boost/serialization/throw_exception.hpp>\n\nnamespace boost {\nnamespace serialization {\nnamespace smart_cast_impl {\n\n    template<class T>\n    struct reference {\n\n        struct polymorphic {\n\n            struct linear {\n                template<class U>\n                 static T cast(U & u){\n                    return static_cast< T >(u);\n                }\n            };\n\n            struct cross {\n                 template<class U>\n                static T cast(U & u){\n                    return dynamic_cast< T >(u);\n                }\n            };\n\n            template<class U>\n            static T cast(U & u){\n                // if we're in debug mode\n                #if ! defined(NDEBUG)                               \\\n                || defined(__MWERKS__)\n                    // do a checked dynamic cast\n                    return cross::cast(u);\n                #else\n                    // borland 5.51 chokes here so we can't use it\n                    // note: if remove_reference isn't function for these types\n                    // cross casting will be selected this will work but will\n                    // not be the most efficient method. This will conflict with\n                    // the original smart_cast motivation.\n                    typedef typename mpl::eval_if<\n                            typename mpl::and_<\n                                mpl::not_<is_base_and_derived<\n                                    typename remove_reference< T >::type,\n                                    U\n                                > >,\n                                mpl::not_<is_base_and_derived<\n                                    U,\n                                    typename remove_reference< T >::type\n                                > >\n                            >,\n                            // borland chokes w/o full qualification here\n                            mpl::identity<cross>,\n                            mpl::identity<linear>\n                    >::type typex;\n                    // typex works around gcc 2.95 issue\n                    return typex::cast(u);\n                #endif\n            }\n        };\n\n        struct non_polymorphic {\n            template<class U>\n             static T cast(U & u){\n                return static_cast< T >(u);\n            }\n        };\n        template<class U>\n        static T cast(U & u){\n            typedef typename mpl::eval_if<\n                boost::is_polymorphic<U>,\n                mpl::identity<polymorphic>,\n                mpl::identity<non_polymorphic>\n            >::type typex;\n            return typex::cast(u);\n        }\n    };\n\n    template<class T>\n    struct pointer {\n\n        struct polymorphic {\n            // unfortunately, this below fails to work for virtual base\n            // classes.  need has_virtual_base to do this.\n            // Subject for further study\n            #if 0\n            struct linear {\n                template<class U>\n                 static T cast(U * u){\n                    return static_cast< T >(u);\n                }\n            };\n\n            struct cross {\n                template<class U>\n                static T cast(U * u){\n                    T tmp = dynamic_cast< T >(u);\n                    #ifndef NDEBUG\n                        if ( tmp == 0 ) throw_exception(std::bad_cast());\n                    #endif\n                    return tmp;\n                }\n            };\n\n            template<class U>\n            static T cast(U * u){\n                typedef\n                    typename mpl::eval_if<\n                        typename mpl::and_<\n                            mpl::not_<is_base_and_derived<\n                                typename remove_pointer< T >::type,\n                                U\n                            > >,\n                            mpl::not_<is_base_and_derived<\n                                U,\n                                typename remove_pointer< T >::type\n                            > >\n                        >,\n                        // borland chokes w/o full qualification here\n                        mpl::identity<cross>,\n                        mpl::identity<linear>\n                    >::type typex;\n                return typex::cast(u);\n            }\n            #else\n            template<class U>\n            static T cast(U * u){\n                T tmp = dynamic_cast< T >(u);\n                #ifndef NDEBUG\n                    if ( tmp == 0 ) throw_exception(std::bad_cast());\n                #endif\n                return tmp;\n            }\n            #endif\n        };\n\n        struct non_polymorphic {\n            template<class U>\n             static T cast(U * u){\n                return static_cast< T >(u);\n            }\n        };\n\n        template<class U>\n        static T cast(U * u){\n            typedef typename mpl::eval_if<\n                boost::is_polymorphic<U>,\n                mpl::identity<polymorphic>,\n                mpl::identity<non_polymorphic>\n            >::type typex;\n            return typex::cast(u);\n        }\n\n    };\n\n    template<class TPtr>\n    struct void_pointer {\n        template<class UPtr>\n        static TPtr cast(UPtr uptr){\n            return static_cast<TPtr>(uptr);\n        }\n    };\n\n    template<class T>\n    struct error {\n        // if we get here, its because we are using one argument in the\n        // cast on a system which doesn't support partial template\n        // specialization\n        template<class U>\n        static T cast(U){\n            BOOST_STATIC_ASSERT(sizeof(T)==0);\n            return * static_cast<T *>(NULL);\n        }\n    };\n\n} // smart_cast_impl\n\n// this implements:\n// smart_cast<Target *, Source *>(Source * s)\n// smart_cast<Target &, Source &>(s)\n// note that it will fail with\n// smart_cast<Target &>(s)\ntemplate<class T, class U>\nT smart_cast(U u) {\n    typedef\n        typename mpl::eval_if<\n            typename mpl::or_<\n                boost::is_same<void *, U>,\n                boost::is_same<void *, T>,\n                boost::is_same<const void *, U>,\n                boost::is_same<const void *, T>\n            >,\n            mpl::identity<smart_cast_impl::void_pointer< T > >,\n        // else\n        typename mpl::eval_if<boost::is_pointer<U>,\n            mpl::identity<smart_cast_impl::pointer< T > >,\n        // else\n        typename mpl::eval_if<boost::is_reference<U>,\n            mpl::identity<smart_cast_impl::reference< T > >,\n        // else\n            mpl::identity<smart_cast_impl::error< T >\n        >\n        >\n        >\n        >::type typex;\n    return typex::cast(u);\n}\n\n// this implements:\n// smart_cast_reference<Target &>(Source & s)\ntemplate<class T, class U>\nT smart_cast_reference(U & u) {\n    return smart_cast_impl::reference< T >::cast(u);\n}\n\n} // namespace serialization\n} // namespace boost\n\n#endif // BOOST_SERIALIZATION_SMART_CAST_HPP\n"
  },
  {
    "path": "include/boost/serialization/split_free.hpp",
    "content": "#ifndef BOOST_SERIALIZATION_SPLIT_FREE_HPP\n#define BOOST_SERIALIZATION_SPLIT_FREE_HPP\n\n// MS compatible compilers support #pragma once\n#if defined(_MSC_VER)\n# pragma once\n#endif\n\n/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// split_free.hpp:\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for updates, documentation, and revision history.\n\n#include <boost/config.hpp>\n#include <boost/mpl/eval_if.hpp>\n#include <boost/mpl/identity.hpp>\n#include <boost/serialization/serialization.hpp>\n\nnamespace boost {\nnamespace archive {\n    namespace detail {\n        template<class Archive> class interface_oarchive;\n        template<class Archive> class interface_iarchive;\n    } // namespace detail\n} // namespace archive\n\nnamespace serialization {\n\ntemplate<class Archive, class T>\nstruct free_saver {\n    static void invoke(\n        Archive & ar,\n        const T & t,\n        const unsigned int file_version\n    ){\n        // use function overload (version_type) to workaround\n        // two-phase lookup issue\n        const version_type v(file_version);\n        save(ar, t, v);\n    }\n};\ntemplate<class Archive, class T>\nstruct free_loader {\n    static void invoke(\n        Archive & ar,\n        T & t,\n        const unsigned int file_version\n    ){\n        // use function overload (version_type) to workaround\n        // two-phase lookup issue\n        const version_type v(file_version);\n        load(ar, t, v);\n    }\n};\n\ntemplate<class Archive, class T>\ninline void split_free(\n    Archive & ar,\n    T & t,\n    const unsigned int file_version\n){\n    typedef typename mpl::eval_if<\n        typename Archive::is_saving,\n        mpl::identity</* detail:: */ free_saver<Archive, T> >,\n        mpl::identity</* detail:: */ free_loader<Archive, T> >\n    >::type typex;\n    typex::invoke(ar, t, file_version);\n}\n\n} // namespace serialization\n} // namespace boost\n\n#define BOOST_SERIALIZATION_SPLIT_FREE(T)       \\\nnamespace boost { namespace serialization {     \\\ntemplate<class Archive>                         \\\ninline void serialize(                          \\\n        Archive & ar,                               \\\n        T & t,                                      \\\n        const unsigned int file_version             \\\n){                                              \\\n        split_free(ar, t, file_version);            \\\n}                                               \\\n}}\n/**/\n\n#endif // BOOST_SERIALIZATION_SPLIT_FREE_HPP\n"
  },
  {
    "path": "include/boost/serialization/split_member.hpp",
    "content": "#ifndef BOOST_SERIALIZATION_SPLIT_MEMBER_HPP\n#define BOOST_SERIALIZATION_SPLIT_MEMBER_HPP\n\n// MS compatible compilers support #pragma once\n#if defined(_MSC_VER)\n# pragma once\n#endif\n\n/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// split_member.hpp:\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for updates, documentation, and revision history.\n\n#include <boost/config.hpp>\n#include <boost/mpl/eval_if.hpp>\n#include <boost/mpl/identity.hpp>\n\n#include <boost/serialization/access.hpp>\n\nnamespace boost {\nnamespace archive {\n    namespace detail {\n        template<class Archive> class interface_oarchive;\n        template<class Archive> class interface_iarchive;\n    } // namespace detail\n} // namespace archive\n\nnamespace serialization {\nnamespace detail {\n\n    template<class Archive, class T>\n    struct member_saver {\n        static void invoke(\n            Archive & ar,\n            const T & t,\n            const unsigned int file_version\n        ){\n            access::member_save(ar, t, file_version);\n        }\n    };\n\n    template<class Archive, class T>\n    struct member_loader {\n        static void invoke(\n            Archive & ar,\n            T & t,\n            const unsigned int file_version\n        ){\n            access::member_load(ar, t, file_version);\n        }\n    };\n\n} // detail\n\ntemplate<class Archive, class T>\ninline void split_member(\n    Archive & ar, T & t, const unsigned int file_version\n){\n    typedef typename mpl::eval_if<\n        typename Archive::is_saving,\n        mpl::identity<detail::member_saver<Archive, T> >,\n        mpl::identity<detail::member_loader<Archive, T> >\n    >::type typex;\n    typex::invoke(ar, t, file_version);\n}\n\n} // namespace serialization\n} // namespace boost\n\n// split member function serialize function into save/load\n#define BOOST_SERIALIZATION_SPLIT_MEMBER()                       \\\ntemplate<class Archive>                                          \\\nvoid serialize(                                                  \\\n    Archive &ar,                                                 \\\n    const unsigned int file_version                              \\\n){                                                               \\\n    boost::serialization::split_member(ar, *this, file_version); \\\n}                                                                \\\n/**/\n\n#endif // BOOST_SERIALIZATION_SPLIT_MEMBER_HPP\n"
  },
  {
    "path": "include/boost/serialization/stack.hpp",
    "content": "#ifndef  BOOST_SERIALIZATION_STACK_HPP\n#define BOOST_SERIALIZATION_STACK_HPP\n\n// MS compatible compilers support #pragma once\n#if defined(_MSC_VER) && (_MSC_VER >= 1020)\n# pragma once\n#endif\n\n/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// stack.hpp\n\n// (C) Copyright 2014 Robert Ramey - http://www.rrsd.com .\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for updates, documentation, and revision history.\n\n#include <stack>\n#include <boost/config.hpp>\n#include <boost/mpl/eval_if.hpp>\n#include <boost/mpl/identity.hpp>\n\n// function specializations must be defined in the appropriate\n// namespace - boost::serialization\n#if defined(__SGI_STL_PORT) || defined(_STLPORT_VERSION)\n#define STD _STLP_STD\n#else\n#define STD std\n#endif\n\nnamespace boost {\nnamespace serialization {\nnamespace detail{\n\ntemplate <typename U, typename C>\nstruct stack_save : public STD::stack<U, C> {\n    template<class Archive>\n    void operator()(Archive & ar, const unsigned int file_version) const {\n        save(ar, STD::stack<U, C>::c, file_version);\n    }\n};\ntemplate <typename U, typename C>\nstruct stack_load : public STD::stack<U, C> {\n    template<class Archive>\n    void operator()(Archive & ar, const unsigned int file_version) {\n        load(ar, STD::stack<U, C>::c, file_version);\n    }\n};\n\n} // detail\n\ntemplate<class Archive, class T, class C>\ninline void serialize(\n    Archive & ar,\n    std::stack< T, C> & t,\n    const unsigned int file_version\n){\n    typedef typename mpl::eval_if<\n        typename Archive::is_saving,\n        mpl::identity<detail::stack_save<T, C> >,\n        mpl::identity<detail::stack_load<T, C> >\n    >::type typex;\n    static_cast<typex &>(t)(ar, file_version);\n}\n\n} // namespace serialization\n} // namespace boost\n\n#include <boost/serialization/collection_traits.hpp>\n\nBOOST_SERIALIZATION_COLLECTION_TRAITS(STD::stack)\n\n#undef STD\n\n#endif // BOOST_SERIALIZATION_DEQUE_HPP\n"
  },
  {
    "path": "include/boost/serialization/state_saver.hpp",
    "content": "#ifndef BOOST_SERIALIZATION_STATE_SAVER_HPP\n#define BOOST_SERIALIZATION_STATE_SAVER_HPP\n\n// MS compatible compilers support #pragma once\n#if defined(_MSC_VER)\n# pragma once\n#endif\n\n/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// state_saver.hpp:\n\n// (C) Copyright 2003-4 Pavel Vozenilek and Robert Ramey - http://www.rrsd.com.\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org/libs/serialization for updates, documentation, and revision history.\n\n// Inspired by Daryle Walker's iostate_saver concept.  This saves the original\n// value of a variable when a state_saver is constructed and restores\n// upon destruction.  Useful for being sure that state is restored to\n// variables upon exit from scope.\n\n\n#include <boost/config.hpp>\n#ifndef BOOST_NO_EXCEPTIONS\n    #include <exception>\n#endif\n\n#include <boost/call_traits.hpp>\n#include <boost/noncopyable.hpp>\n#include <boost/type_traits/has_nothrow_copy.hpp>\n#include <boost/core/no_exceptions_support.hpp>\n\n#include <boost/mpl/eval_if.hpp>\n#include <boost/mpl/identity.hpp>\n\nnamespace boost {\nnamespace serialization {\n\ntemplate<class T>\n// T requirements:\n//  - POD or object semantic (cannot be reference, function, ...)\n//  - copy constructor\n//  - operator = (no-throw one preferred)\nclass state_saver : private boost::noncopyable\n{\nprivate:\n    const T previous_value;\n    T & previous_ref;\n\n    struct restore {\n        static void invoke(T & previous_ref, const T & previous_value){\n            previous_ref = previous_value; // won't throw\n        }\n    };\n\n    struct restore_with_exception {\n        static void invoke(T & previous_ref, const T & previous_value){\n            BOOST_TRY{\n                previous_ref = previous_value;\n            }\n            BOOST_CATCH(::std::exception &) {\n                // we must ignore it - we are in destructor\n            }\n            BOOST_CATCH_END\n        }\n    };\n\npublic:\n    state_saver(\n        T & object\n    ) :\n        previous_value(object),\n        previous_ref(object)\n    {}\n\n    ~state_saver() {\n        #ifndef BOOST_NO_EXCEPTIONS\n            typedef typename mpl::eval_if<\n                has_nothrow_copy< T >,\n                mpl::identity<restore>,\n                mpl::identity<restore_with_exception>\n            >::type typex;\n            typex::invoke(previous_ref, previous_value);\n        #else\n            previous_ref = previous_value;\n        #endif\n    }\n\n}; // state_saver<>\n\n} // serialization\n} // boost\n\n#endif //BOOST_SERIALIZATION_STATE_SAVER_HPP\n"
  },
  {
    "path": "include/boost/serialization/static_warning.hpp",
    "content": "#ifndef BOOST_SERIALIZATION_STATIC_WARNING_HPP\n#define BOOST_SERIALIZATION_STATIC_WARNING_HPP\n\n//  (C) Copyright Robert Ramey 2003. Jonathan Turkanis 2004.\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// MS compatible compilers support #pragma once\n#if defined(_MSC_VER)\n# pragma once\n#endif\n\n// http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org/libs/static_assert for documentation.\n\n/*\n Revision history:\n   15 June  2003 - Initial version.\n   31 March 2004 - improved diagnostic messages and portability\n                   (Jonathan Turkanis)\n   03 April 2004 - works on VC6 at class and namespace scope\n                 - ported to DigitalMars\n                 - static warnings disabled by default; when enabled,\n                   uses pragmas to enable required compiler warnings\n                   on MSVC, Intel, Metrowerks and Borland 5.x.\n                   (Jonathan Turkanis)\n   30 May 2004   - tweaked for msvc 7.1 and gcc 3.3\n                 - static warnings ENabled by default; when enabled,\n                   (Robert Ramey)\n*/\n\n#include <boost/config.hpp>\n\n//\n// Implementation\n// Makes use of the following warnings:\n//  1. GCC prior to 3.3: division by zero.\n//  2. BCC 6.0 preview: unreferenced local variable.\n//  3. DigitalMars: returning address of local automatic variable.\n//  4. VC6: class previously seen as struct (as in 'boost/mpl/print.hpp')\n//  5. All others: deletion of pointer to incomplete type.\n//\n// The trick is to find code which produces warnings containing the name of\n// a structure or variable. Details, with same numbering as above:\n// 1. static_warning_impl<B>::value is zero iff B is false, so diving an int\n//    by this value generates a warning iff B is false.\n// 2. static_warning_impl<B>::type has a constructor iff B is true, so an\n//    unreferenced variable of this type generates a warning iff B is false.\n// 3. static_warning_impl<B>::type overloads operator& to return a dynamically\n//    allocated int pointer only is B is true, so  returning the address of an\n//    automatic variable of this type generates a warning iff B is false.\n// 4. static_warning_impl<B>::STATIC_WARNING is declared as a struct iff B is\n//    false.\n// 5. static_warning_impl<B>::type is incomplete iff B is false, so deleting a\n//    pointer to this type generates a warning iff B is false.\n//\n\n//------------------Enable selected warnings----------------------------------//\n\n// Enable the warnings relied on by BOOST_STATIC_WARNING, where possible.\n\n// 6. replaced implementation with one which depends solely on\n//    mpl::print<>.  The previous one was found to fail for functions\n//    under recent versions of gcc and intel compilers - Robert Ramey\n\n#include <boost/mpl/bool.hpp>\n#include <boost/mpl/print.hpp>\n#include <boost/mpl/eval_if.hpp>\n#include <boost/mpl/bool_fwd.hpp>\n#include <boost/static_assert.hpp>\n\nnamespace boost {\nnamespace serialization {\n\ntemplate<int L>\nstruct BOOST_SERIALIZATION_STATIC_WARNING_LINE{};\n\ntemplate<bool B, int L>\nstruct static_warning_test{\n    typename boost::mpl::eval_if_c<\n        B,\n        boost::mpl::true_,\n        typename boost::mpl::identity<\n            boost::mpl::print<\n                BOOST_SERIALIZATION_STATIC_WARNING_LINE<L>\n            >\n        >\n    >::type type;\n};\n\ntemplate<int i>\nstruct BOOST_SERIALIZATION_SS {};\n\n} // serialization\n} // boost\n\n#define BOOST_SERIALIZATION_BSW(B, L) \\\n    typedef boost::serialization::BOOST_SERIALIZATION_SS< \\\n        sizeof( boost::serialization::static_warning_test< B, L > ) \\\n    > BOOST_JOIN(STATIC_WARNING_LINE, L) BOOST_ATTRIBUTE_UNUSED;\n#define BOOST_STATIC_WARNING(B) BOOST_SERIALIZATION_BSW(B, __LINE__)\n\n#endif // BOOST_SERIALIZATION_STATIC_WARNING_HPP\n"
  },
  {
    "path": "include/boost/serialization/std_variant.hpp",
    "content": "#ifndef BOOST_SERIALIZATION_STD_VARIANT_HPP\n#define BOOST_SERIALIZATION_STD_VARIANT_HPP\n\n// MS compatible compilers support #pragma once\n#if defined(_MSC_VER)\n# pragma once\n#endif\n\n/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// variant.hpp - non-intrusive serialization of variant types\n//\n// copyright (c) 2019 Samuel Debionne, ESRF\n//\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n//\n// See http://www.boost.org for updates, documentation, and revision history.\n//\n// Widely inspired form boost::variant serialization\n//\n\n#include <boost/serialization/throw_exception.hpp>\n\n#include <variant>\n\n#include <boost/archive/archive_exception.hpp>\n\n#include <boost/serialization/split_free.hpp>\n#include <boost/serialization/serialization.hpp>\n#include <boost/serialization/nvp.hpp>\n\nnamespace boost {\nnamespace serialization {\n\ntemplate<class Archive>\nstruct std_variant_save_visitor\n{\n    std_variant_save_visitor(Archive& ar) :\n        m_ar(ar)\n    {}\n    template<class T>\n    void operator()(T const & value) const\n    {\n        m_ar << BOOST_SERIALIZATION_NVP(value);\n    }\nprivate:\n    Archive & m_ar;\n};\n\n\ntemplate<class Archive>\nstruct std_variant_load_visitor\n{\n    std_variant_load_visitor(Archive& ar) :\n        m_ar(ar)\n    {}\n    template<class T>\n    void operator()(T & value) const\n    {\n        m_ar >> BOOST_SERIALIZATION_NVP(value);\n    }\nprivate:\n    Archive & m_ar;\n};\n\ntemplate<class Archive, class ...Types>\nvoid save(\n    Archive & ar,\n    std::variant<Types...> const & v,\n    unsigned int /*version*/\n){\n    const std::size_t which = v.index();\n    ar << BOOST_SERIALIZATION_NVP(which);\n    std_variant_save_visitor<Archive> visitor(ar);\n    std::visit(visitor, v);\n}\n\n// Minimalist metaprogramming for handling parameter pack\nnamespace mp {\n    namespace detail {\n    template <typename Seq>\n    struct front_impl;\n\n    template <template <typename...> class Seq, typename T, typename... Ts>\n    struct front_impl<Seq<T, Ts...>> {\n        using type = T;\n    };\n\n    template <typename Seq>\n    struct pop_front_impl;\n\n    template <template <typename...> class Seq, typename T, typename... Ts>\n    struct pop_front_impl<Seq<T, Ts...>> {\n        using type = Seq<Ts...>;\n    };\n    } //namespace detail\n\n    template <typename... Ts>\n    struct typelist {};\n\n    template <typename Seq>\n    using front = typename detail::front_impl<Seq>::type;\n\n    template <typename Seq>\n    using pop_front = typename detail::pop_front_impl<Seq>::type;\n}  // namespace mp\n\ntemplate<std::size_t N, class Seq>\nstruct variant_impl\n{\n    template<class Archive, class V>\n    static void load (\n        Archive & ar,\n        std::size_t which,\n        V & v,\n        const unsigned int version\n    ){\n        if(which == 0){\n            // note: A non-intrusive implementation (such as this one)\n            // necessary has to copy the value.  This wouldn't be necessary\n            // with an implementation that de-serialized to the address of the\n            // aligned storage included in the variant.\n            using type = mp::front<Seq>;\n            type value;\n            ar >> BOOST_SERIALIZATION_NVP(value);\n            v = std::move(value);\n            type * new_address = & std::get<type>(v);\n            ar.reset_object_address(new_address, & value);\n            return;\n        }\n        //typedef typename mpl::pop_front<S>::type type;\n        using types = mp::pop_front<Seq>;\n        variant_impl<N - 1, types>::load(ar, which - 1, v, version);\n    }\n};\n\ntemplate<class Seq>\nstruct variant_impl<0, Seq>\n{\n    template<class Archive, class V>\n    static void load (\n        Archive & /*ar*/,\n        std::size_t /*which*/,\n        V & /*v*/,\n        const unsigned int /*version*/\n    ){}\n};\n\ntemplate<class Archive, class... Types>\nvoid load(\n    Archive & ar, \n    std::variant<Types...>& v,\n    const unsigned int version\n){\n    std::size_t which;\n    ar >> BOOST_SERIALIZATION_NVP(which);\n    if(which >=  sizeof...(Types))\n        // this might happen if a type was removed from the list of variant types\n        boost::serialization::throw_exception(\n            boost::archive::archive_exception(\n                boost::archive::archive_exception::unsupported_version\n            )\n        );\n    variant_impl<sizeof...(Types), mp::typelist<Types...>>::load(ar, which, v, version);\n}\n\ntemplate<class Archive,class... Types>\ninline void serialize(\n    Archive & ar,\n    std::variant<Types...> & v,\n    const unsigned int file_version\n){\n    split_free(ar,v,file_version);\n}\n\n// Specialization for std::monostate\ntemplate<class Archive>\nvoid serialize(Archive &, std::monostate &, const unsigned int /*version*/)\n{}\n\n} // namespace serialization\n} // namespace boost\n\n//template<typename T0_, BOOST_VARIANT_ENUM_SHIFTED_PARAMS(typename T)>\n\n#include <boost/serialization/tracking.hpp>\n\nnamespace boost {\n    namespace serialization {\n        \ntemplate<class... Types>\nstruct tracking_level<\n    std::variant<Types...>\n>{\n    typedef mpl::integral_c_tag tag;\n    typedef mpl::int_< ::boost::serialization::track_always> type;\n    BOOST_STATIC_CONSTANT(int, value = type::value);\n};\n\n} // namespace serialization\n} // namespace boost\n\n#endif //BOOST_SERIALIZATION_VARIANT_HPP\n"
  },
  {
    "path": "include/boost/serialization/string.hpp",
    "content": "#ifndef  BOOST_SERIALIZATION_STRING_HPP\n#define BOOST_SERIALIZATION_STRING_HPP\n\n// MS compatible compilers support #pragma once\n#if defined(_MSC_VER)\n# pragma once\n#endif\n\n/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// serialization/string.hpp:\n// serialization for stl string templates\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for updates, documentation, and revision history.\n\n#include <string>\n\n#include <boost/config.hpp>\n#include <boost/serialization/level.hpp>\n\nBOOST_CLASS_IMPLEMENTATION(std::string, boost::serialization::primitive_type)\n#ifndef BOOST_NO_STD_WSTRING\nBOOST_CLASS_IMPLEMENTATION(std::wstring, boost::serialization::primitive_type)\n#endif\n\n#endif // BOOST_SERIALIZATION_STRING_HPP\n"
  },
  {
    "path": "include/boost/serialization/strong_typedef.hpp",
    "content": "#ifndef BOOST_SERIALIZATION_STRONG_TYPEDEF_HPP\n#define BOOST_SERIALIZATION_STRONG_TYPEDEF_HPP\n\n// MS compatible compilers support #pragma once\n#if defined(_MSC_VER)\n# pragma once\n#endif\n\n/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// strong_typedef.hpp:\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .\n// (C) Copyright 2016 Ashish Sadanandan\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org/libs/serialization for updates, documentation, and revision history.\n\n// macro used to implement a strong typedef.  strong typedef\n// guarantees that two types are distinguished even though they\n// share the same underlying implementation.  typedef does not create\n// a new type.  BOOST_STRONG_TYPEDEF(T, D) creates a new type named D\n// that operates as a type T.\n\n#include <boost/config.hpp>\n#include <boost/operators.hpp>\n#include <boost/type_traits/has_nothrow_assign.hpp>\n#include <boost/type_traits/has_nothrow_constructor.hpp>\n#include <boost/type_traits/has_nothrow_copy.hpp>\n\n#define BOOST_STRONG_TYPEDEF(T, D)                                                                               \\\nstruct D                                                                                                         \\\n    : boost::totally_ordered1< D                                                                                 \\\n    , boost::totally_ordered2< D, T                                                                              \\\n    > >                                                                                                          \\\n{                                                                                                                \\\n    T t;                                                                                                         \\\n    explicit D(const T& t_) BOOST_NOEXCEPT_IF(boost::has_nothrow_copy_constructor<T>::value) : t(t_) {}          \\\n    D() BOOST_NOEXCEPT_IF(boost::has_nothrow_default_constructor<T>::value) : t() {}                             \\\n    D(const D & t_) BOOST_NOEXCEPT_IF(boost::has_nothrow_copy_constructor<T>::value) : t(t_.t) {}                \\\n    D& operator=(const D& rhs) BOOST_NOEXCEPT_IF(boost::has_nothrow_assign<T>::value) {t = rhs.t; return *this;} \\\n    D& operator=(const T& rhs) BOOST_NOEXCEPT_IF(boost::has_nothrow_assign<T>::value) {t = rhs; return *this;}   \\\n    operator const T&() const {return t;}                                                                        \\\n    operator T&() {return t;}                                                                                    \\\n    bool operator==(const D& rhs) const {return t == rhs.t;}                                                     \\\n    bool operator<(const D& rhs) const {return t < rhs.t;}                                                       \\\n};\n\n#endif // BOOST_SERIALIZATION_STRONG_TYPEDEF_HPP\n"
  },
  {
    "path": "include/boost/serialization/throw_exception.hpp",
    "content": "#ifndef BOOST_SERIALIZATION_THROW_EXCEPTION_HPP_INCLUDED\n#define BOOST_SERIALIZATION_THROW_EXCEPTION_HPP_INCLUDED\n\n// MS compatible compilers support #pragma once\n\n#if defined(_MSC_VER)\n# pragma once\n#endif\n\n//  boost/throw_exception.hpp\n//\n//  Copyright (c) 2002 Peter Dimov and Multi Media Ltd.\n//\n// Distributed under the Boost Software License, Version 1.0. (See\n// accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n#include <boost/config.hpp>\n\n#ifndef BOOST_NO_EXCEPTIONS\n#include <boost/throw_exception.hpp>\n#endif\n\nnamespace boost {\nnamespace serialization {\n\n#ifdef BOOST_NO_EXCEPTIONS\n\nBOOST_NORETURN inline void throw_exception(std::exception const & e) {\n    ::boost::throw_exception(e);\n}\n\n#else\n\ntemplate<class E>\nBOOST_NORETURN inline void throw_exception(E const & e){\n    throw e;\n}\n\n#endif\n\n} // namespace serialization\n} // namespace boost\n\n#endif // #ifndef BOOST_SERIALIZATION_THROW_EXCEPTION_HPP_INCLUDED\n"
  },
  {
    "path": "include/boost/serialization/tracking.hpp",
    "content": "#ifndef BOOST_SERIALIZATION_TRACKING_HPP\n#define BOOST_SERIALIZATION_TRACKING_HPP\n\n// MS compatible compilers support #pragma once\n#if defined(_MSC_VER)\n# pragma once\n#endif\n\n/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// tracking.hpp:\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for updates, documentation, and revision history.\n\n#include <boost/config.hpp>\n#include <boost/static_assert.hpp>\n#include <boost/mpl/eval_if.hpp>\n#include <boost/mpl/identity.hpp>\n#include <boost/mpl/int.hpp>\n#include <boost/mpl/equal_to.hpp>\n#include <boost/mpl/greater.hpp>\n#include <boost/mpl/integral_c_tag.hpp>\n\n#include <boost/type_traits/is_base_and_derived.hpp>\n#include <boost/type_traits/is_pointer.hpp>\n#include <boost/serialization/level.hpp>\n#include <boost/serialization/tracking_enum.hpp>\n#include <boost/serialization/type_info_implementation.hpp>\n\nnamespace boost {\nnamespace serialization {\n\nstruct basic_traits;\n\n// default tracking level\ntemplate<class T>\nstruct tracking_level_impl {\n    template<class U>\n    struct traits_class_tracking {\n        typedef typename U::tracking type;\n    };\n    typedef mpl::integral_c_tag tag;\n    // note: at least one compiler complained w/o the full qualification\n    // on basic traits below\n    typedef\n        typename mpl::eval_if<\n            is_base_and_derived<boost::serialization::basic_traits, T>,\n            traits_class_tracking< T >,\n        //else\n        typename mpl::eval_if<\n            is_pointer< T >,\n            // pointers are not tracked by default\n            mpl::int_<track_never>,\n        //else\n        typename mpl::eval_if<\n            // for primitives\n            typename mpl::equal_to<\n                implementation_level< T >,\n                mpl::int_<primitive_type>\n            >,\n            // is never\n            mpl::int_<track_never>,\n            // otherwise its selective\n            mpl::int_<track_selectively>\n    >  > >::type type;\n    BOOST_STATIC_CONSTANT(int, value = type::value);\n};\n\ntemplate<class T>\nstruct tracking_level :\n    public tracking_level_impl<const T>\n{\n};\n\ntemplate<class T, enum tracking_type L>\ninline bool operator>=(tracking_level< T > t, enum tracking_type l)\n{\n    return t.value >= (int)l;\n}\n\n} // namespace serialization\n} // namespace boost\n\n\n// The STATIC_ASSERT is prevents one from setting tracking for a primitive type.\n// This almost HAS to be an error.  Doing this will effect serialization of all\n// char's in your program which is almost certainly what you don't want to do.\n// If you want to track all instances of a given primitive type, You'll have to\n// wrap it in your own type so its not a primitive anymore.  Then it will compile\n// without problem.\n#define BOOST_CLASS_TRACKING(T, E)           \\\nnamespace boost {                            \\\nnamespace serialization {                    \\\ntemplate<>                                   \\\nstruct tracking_level< T >                   \\\n{                                            \\\n    typedef mpl::integral_c_tag tag;         \\\n    typedef mpl::int_< E> type;              \\\n    BOOST_STATIC_CONSTANT(                   \\\n        int,                                 \\\n        value = tracking_level::type::value  \\\n    );                                       \\\n    /* tracking for a class  */              \\\n    BOOST_STATIC_ASSERT((                    \\\n        mpl::greater<                        \\\n            /* that is a primitive */        \\\n            implementation_level< T >,       \\\n            mpl::int_<primitive_type>        \\\n        >::value                             \\\n    ));                                      \\\n};                                           \\\n}}\n\n#endif // BOOST_SERIALIZATION_TRACKING_HPP\n"
  },
  {
    "path": "include/boost/serialization/tracking_enum.hpp",
    "content": "#ifndef BOOST_SERIALIZATION_TRACKING_ENUM_HPP\n#define BOOST_SERIALIZATION_TRACKING_ENUM_HPP\n\n// MS compatible compilers support #pragma once\n#if defined(_MSC_VER)\n# pragma once\n#endif\n\n/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// tracking_enum.hpp:\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for updates, documentation, and revision history.\n\nnamespace boost {\nnamespace serialization {\n\n// addresses of serialized objects may be tracked to avoid saving/loading\n// redundant copies.  This header defines a class trait that can be used\n// to specify when objects should be tracked\n\n// names for each tracking level\nenum tracking_type\n{\n    // never track this type\n    track_never = 0,\n    // track objects of this type if the object is serialized through a\n    // pointer.\n    track_selectively = 1,\n    // always track this type\n    track_always = 2\n};\n\n} // namespace serialization\n} // namespace boost\n\n#endif // BOOST_SERIALIZATION_TRACKING_ENUM_HPP\n"
  },
  {
    "path": "include/boost/serialization/traits.hpp",
    "content": "#ifndef BOOST_SERIALIZATION_TRAITS_HPP\n#define BOOST_SERIALIZATION_TRAITS_HPP\n\n// MS compatible compilers support #pragma once\n#if defined(_MSC_VER)\n# pragma once\n#endif\n\n/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// traits.hpp:\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for updates, documentation, and revision history.\n\n// This header is used to apply serialization traits to templates.  The\n// standard system can't be used for platforms which don't support\n// Partial Template Specialization.\n\n// The motivation for this is the Name-Value Pair (NVP) template.\n// it has to work the same on all platforms in order for archives\n// to be portable across platforms.\n\n#include <boost/config.hpp>\n#include <boost/static_assert.hpp>\n\n#include <boost/mpl/int.hpp>\n#include <boost/mpl/bool_fwd.hpp>\n#include <boost/serialization/level_enum.hpp>\n#include <boost/serialization/tracking_enum.hpp>\n\nnamespace boost {\nnamespace serialization {\n\n// common base class used to detect appended traits class\nstruct basic_traits {};\n\ntemplate <class T>\nstruct extended_type_info_impl;\n\ntemplate<\n    class T,\n    int Level,\n    int Tracking,\n    unsigned int Version = 0,\n    class ETII = extended_type_info_impl< T >,\n    class Wrapper = mpl::false_\n>\nstruct traits : public basic_traits {\n    BOOST_STATIC_ASSERT(Version == 0 || Level >= object_class_info);\n    BOOST_STATIC_ASSERT(Tracking == track_never || Level >= object_serializable);\n    typedef typename mpl::int_<Level> level;\n    typedef typename mpl::int_<Tracking> tracking;\n    typedef typename mpl::int_<Version> version;\n    typedef ETII type_info_implementation;\n    typedef Wrapper is_wrapper;\n};\n\n} // namespace serialization\n} // namespace boost\n\n#endif // BOOST_SERIALIZATION_TRAITS_HPP\n"
  },
  {
    "path": "include/boost/serialization/type_info_implementation.hpp",
    "content": "#ifndef BOOST_SERIALIZATION_TYPE_INFO_IMPLEMENTATION_HPP\n#define BOOST_SERIALIZATION_TYPE_INFO_IMPLEMENTATION_HPP\n\n// MS compatible compilers support #pragma once\n#if defined(_MSC_VER)\n# pragma once\n#endif\n\n/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// type_info_implementation.hpp: interface for portable version of type_info\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for updates, documentation, and revision history.\n\n\n#include <boost/config.hpp>\n#include <boost/detail/workaround.hpp>\n\n#include <boost/static_assert.hpp>\n#include <boost/mpl/eval_if.hpp>\n#include <boost/mpl/identity.hpp>\n#include <boost/type_traits/is_base_and_derived.hpp>\n#include <boost/serialization/traits.hpp>\n\nnamespace boost {\nnamespace serialization {\n\n// note that T and const T are folded into const T so that\n// there is only one table entry per type\ntemplate<class T>\nstruct type_info_implementation {\n    template<class U>\n    struct traits_class_typeinfo_implementation {\n      typedef typename U::type_info_implementation::type type;\n    };\n    // note: at least one compiler complained w/o the full qualification\n    // on basic traits below\n    typedef\n        typename mpl::eval_if<\n            is_base_and_derived<boost::serialization::basic_traits, T>,\n            traits_class_typeinfo_implementation< T >,\n        //else\n            mpl::identity<\n                typename extended_type_info_impl< T >::type\n            >\n        >::type type;\n};\n\n} // namespace serialization\n} // namespace boost\n\n// define a macro to assign a particular derivation of extended_type_info\n// to a specified a class.\n#define BOOST_CLASS_TYPE_INFO(T, ETI)              \\\nnamespace boost {                                  \\\nnamespace serialization {                          \\\ntemplate<>                                         \\\nstruct type_info_implementation< T > {             \\\n    typedef ETI type;                              \\\n};                                                 \\\ntemplate<>                                         \\\nstruct type_info_implementation< const T > {       \\\n    typedef ETI type;                              \\\n};                                                 \\\n}                                                  \\\n}                                                  \\\n/**/\n\n#endif /// BOOST_SERIALIZATION_TYPE_INFO_IMPLEMENTATION_HPP\n"
  },
  {
    "path": "include/boost/serialization/unique_ptr.hpp",
    "content": "#ifndef  BOOST_SERIALIZATION_UNIQUE_PTR_HPP\n#define BOOST_SERIALIZATION_UNIQUE_PTR_HPP\n\n// MS compatible compilers support #pragma once\n#if defined(_MSC_VER)\n# pragma once\n#endif\n\n/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// unique_ptr.hpp:\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for updates, documentation, and revision history.\n#include <memory>\n#include <boost/serialization/split_free.hpp>\n#include <boost/serialization/nvp.hpp>\n\nnamespace boost {\nnamespace serialization {\n\n/////////////////////////////////////////////////////////////\n// implement serialization for unique_ptr< T >\n// note: this must be added to the boost namespace in order to\n// be called by the library\ntemplate<class Archive, class T>\ninline void save(\n    Archive & ar,\n    const std::unique_ptr< T > &t,\n    const unsigned int /*file_version*/\n){\n    // only the raw pointer has to be saved\n    // the ref count is rebuilt automatically on load\n    const T * const tx = t.get();\n    ar << BOOST_SERIALIZATION_NVP(tx);\n}\n\ntemplate<class Archive, class T>\ninline void load(\n    Archive & ar,\n    std::unique_ptr< T > &t,\n    const unsigned int /*file_version*/\n){\n    T *tx;\n    ar >> BOOST_SERIALIZATION_NVP(tx);\n    // note that the reset automagically maintains the reference count\n    t.reset(tx);\n}\n\n// split non-intrusive serialization function member into separate\n// non intrusive save/load member functions\ntemplate<class Archive, class T>\ninline void serialize(\n    Archive & ar,\n    std::unique_ptr< T > &t,\n    const unsigned int file_version\n){\n    boost::serialization::split_free(ar, t, file_version);\n}\n\n} // namespace serialization\n} // namespace boost\n\n\n#endif // BOOST_SERIALIZATION_UNIQUE_PTR_HPP\n"
  },
  {
    "path": "include/boost/serialization/unordered_collections_load_imp.hpp",
    "content": "#ifndef BOOST_SERIALIZATION_UNORDERED_COLLECTIONS_LOAD_IMP_HPP\n#define BOOST_SERIALIZATION_UNORDERED_COLLECTIONS_LOAD_IMP_HPP\n\n// MS compatible compilers support #pragma once\n#if defined(_MSC_VER) && (_MSC_VER >= 1020)\n# pragma once\n# pragma warning (disable : 4786) // too long name, harmless warning\n#endif\n\n/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// unordered_collections_load_imp.hpp: serialization for loading stl collections\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .\n// (C) Copyright 2014 Jim Bell\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for updates, documentation, and revision history.\n\n// helper function templates for serialization of collections\n\n#include <boost/assert.hpp>\n#include <cstddef> // size_t\n#include <boost/config.hpp> // msvc 6.0 needs this for warning suppression\n#if defined(BOOST_NO_STDC_NAMESPACE)\nnamespace std{\n    using ::size_t;\n} // namespace std\n#endif\n#include <boost/detail/workaround.hpp>\n\n#include <boost/serialization/access.hpp>\n#include <boost/serialization/nvp.hpp>\n#include <boost/serialization/collection_size_type.hpp>\n#include <boost/serialization/item_version_type.hpp>\n#include <boost/serialization/library_version_type.hpp>\n\nnamespace boost{\nnamespace serialization {\nnamespace stl {\n\n//////////////////////////////////////////////////////////////////////\n// implementation of serialization for STL containers\n//\ntemplate<class Archive, class Container, class InputFunction>\ninline void load_unordered_collection(Archive & ar, Container &s)\n{\n    collection_size_type count;\n    collection_size_type bucket_count;\n    boost::serialization::item_version_type item_version(0);\n    boost::serialization::library_version_type library_version(\n        ar.get_library_version()\n    );\n    // retrieve number of elements\n    ar >> BOOST_SERIALIZATION_NVP(count);\n    ar >> BOOST_SERIALIZATION_NVP(bucket_count);\n    if(boost::serialization::library_version_type(3) < library_version){\n        ar >> BOOST_SERIALIZATION_NVP(item_version);\n    }\n    s.clear();\n    // rehash() will pre-allocate the appropriate number of buckets\n    // given the number of items to be inserted. Therefore it is\n    // unneccesary to use bucket_count here, especially when bucket_count\n    // may be much larger than what is neccessary for 'count' items.\n    //\n    s.rehash(count);\n    InputFunction ifunc;\n    while(count-- > 0){\n        ifunc(ar, s, item_version);\n    }\n}\n\n} // namespace stl\n} // namespace serialization\n} // namespace boost\n\n#endif //BOOST_SERIALIZATION_UNORDERED_COLLECTIONS_LOAD_IMP_HPP\n"
  },
  {
    "path": "include/boost/serialization/unordered_collections_save_imp.hpp",
    "content": "#ifndef BOOST_SERIALIZATION_UNORDERED_COLLECTIONS_SAVE_IMP_HPP\n#define BOOST_SERIALIZATION_UNORDERED_COLLECTIONS_SAVE_IMP_HPP\n\n// MS compatible compilers support #pragma once\n#if defined(_MSC_VER) && (_MSC_VER >= 1020)\n# pragma once\n#endif\n\n/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// hash_collections_save_imp.hpp: serialization for stl collections\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .\n// (C) Copyright 2014 Jim Bell\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for updates, documentation, and revision history.\n\n// helper function templates for serialization of collections\n\n#include <boost/config.hpp>\n#include <boost/serialization/nvp.hpp>\n#include <boost/serialization/serialization.hpp>\n#include <boost/serialization/version.hpp>\n#include <boost/serialization/collection_size_type.hpp>\n#include <boost/serialization/item_version_type.hpp>\n#include <boost/serialization/library_version_type.hpp>\n\nnamespace boost{\nnamespace serialization {\nnamespace stl {\n\n//////////////////////////////////////////////////////////////////////\n// implementation of serialization for STL containers\n//\n\ntemplate<class Archive, class Container>\ninline void save_unordered_collection(Archive & ar, const Container &s)\n{\n    collection_size_type count(s.size());\n    const collection_size_type bucket_count(s.bucket_count());\n    const item_version_type item_version(\n        version<typename Container::value_type>::value\n    );\n\n    #if 0\n    /* should only be necessary to create archives of previous versions\n     * which is not currently supported.  So for now comment this out\n     */\n    boost::serialization::library_version_type library_version(\n        ar.get_library_version()\n    );\n    // retrieve number of elements\n\tar << BOOST_SERIALIZATION_NVP(count);\n\tar << BOOST_SERIALIZATION_NVP(bucket_count);\n    if(boost::serialization::library_version_type(3) < library_version){\n        // record number of elements\n        // make sure the target type is registered so we can retrieve\n        // the version when we load\n        ar << BOOST_SERIALIZATION_NVP(item_version);\n    }\n    #else\n        ar << BOOST_SERIALIZATION_NVP(count);\n        ar << BOOST_SERIALIZATION_NVP(bucket_count);\n        ar << BOOST_SERIALIZATION_NVP(item_version);\n    #endif\n\n    typename Container::const_iterator it = s.begin();\n    while(count-- > 0){\n        // note borland emits a no-op without the explicit namespace\n        boost::serialization::save_construct_data_adl(\n            ar,\n            &(*it),\n            boost::serialization::version<\n                typename Container::value_type\n            >::value\n        );\n        ar << boost::serialization::make_nvp(\"item\", *it++);\n    }\n}\n\n} // namespace stl\n} // namespace serialization\n} // namespace boost\n\n#endif //BOOST_SERIALIZATION_UNORDERED_COLLECTIONS_SAVE_IMP_HPP\n"
  },
  {
    "path": "include/boost/serialization/unordered_map.hpp",
    "content": "#ifndef  BOOST_SERIALIZATION_UNORDERED_MAP_HPP\n#define BOOST_SERIALIZATION_UNORDERED_MAP_HPP\n\n// MS compatible compilers support #pragma once\n#if defined(_MSC_VER) && (_MSC_VER >= 1020)\n# pragma once\n#endif\n\n/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// serialization/unordered_map.hpp:\n// serialization for stl unordered_map templates\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .\n// (C) Copyright 2014 Jim Bell\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for updates, documentation, and revision history.\n\n#include <boost/config.hpp>\n\n#include <unordered_map>\n\n#include <boost/serialization/utility.hpp>\n#include <boost/serialization/unordered_collections_save_imp.hpp>\n#include <boost/serialization/unordered_collections_load_imp.hpp>\n#include <boost/serialization/archive_input_unordered_map.hpp>\n#include <boost/serialization/split_free.hpp>\n\nnamespace boost {\nnamespace serialization {\n\ntemplate<\n    class Archive,\n    class Key,\n    class T,\n    class HashFcn,\n    class EqualKey,\n    class Allocator\n>\ninline void save(\n    Archive & ar,\n    const std::unordered_map<Key, T, HashFcn, EqualKey, Allocator> &t,\n    const unsigned int /*file_version*/\n){\n    boost::serialization::stl::save_unordered_collection<\n        Archive,\n        std::unordered_map<Key, T, HashFcn, EqualKey, Allocator>\n    >(ar, t);\n}\n\ntemplate<\n    class Archive,\n    class Key,\n    class T,\n    class HashFcn,\n    class EqualKey,\n    class Allocator\n>\ninline void load(\n    Archive & ar,\n    std::unordered_map<Key, T, HashFcn, EqualKey, Allocator> &t,\n    const unsigned int /*file_version*/\n){\n    boost::serialization::stl::load_unordered_collection<\n        Archive,\n        std::unordered_map<Key, T, HashFcn, EqualKey, Allocator>,\n        boost::serialization::stl::archive_input_unordered_map<\n            Archive,\n            std::unordered_map<Key, T, HashFcn, EqualKey, Allocator>\n        >\n    >(ar, t);\n}\n\n// split non-intrusive serialization function member into separate\n// non intrusive save/load member functions\ntemplate<\n    class Archive,\n    class Key,\n    class T,\n    class HashFcn,\n    class EqualKey,\n    class Allocator\n>\ninline void serialize(\n    Archive & ar,\n    std::unordered_map<Key, T, HashFcn, EqualKey, Allocator> &t,\n    const unsigned int file_version\n){\n    boost::serialization::split_free(ar, t, file_version);\n}\n\n// unordered_multimap\ntemplate<\n    class Archive,\n    class Key,\n    class T,\n    class HashFcn,\n    class EqualKey,\n    class Allocator\n>\ninline void save(\n    Archive & ar,\n    const std::unordered_multimap<Key, T, HashFcn, EqualKey, Allocator> &t,\n    const unsigned int /*file_version*/\n){\n    boost::serialization::stl::save_unordered_collection<\n        Archive,\n        std::unordered_multimap<Key, T, HashFcn, EqualKey, Allocator>\n    >(ar, t);\n}\n\ntemplate<\n    class Archive,\n    class Key,\n    class T,\n    class HashFcn,\n    class EqualKey,\n    class Allocator\n>\ninline void load(\n    Archive & ar,\n    std::unordered_multimap<Key, T, HashFcn, EqualKey, Allocator> &t,\n    const unsigned int /*file_version*/\n){\n    boost::serialization::stl::load_unordered_collection<\n        Archive,\n        std::unordered_multimap<Key, T, HashFcn, EqualKey, Allocator>,\n        boost::serialization::stl::archive_input_unordered_multimap<\n            Archive,\n            std::unordered_multimap<Key, T, HashFcn, EqualKey, Allocator>\n        >\n    >(ar, t);\n}\n\n// split non-intrusive serialization function member into separate\n// non intrusive save/load member functions\ntemplate<\n    class Archive,\n    class Key,\n    class T,\n    class HashFcn,\n    class EqualKey,\n    class Allocator\n>\ninline void serialize(\n    Archive & ar,\n    std::unordered_multimap<Key, T, HashFcn, EqualKey, Allocator> &t,\n    const unsigned int file_version\n){\n    boost::serialization::split_free(ar, t, file_version);\n}\n\n} // namespace serialization\n} // namespace boost\n\n#endif // BOOST_SERIALIZATION_UNORDERED_MAP_HPP\n"
  },
  {
    "path": "include/boost/serialization/unordered_set.hpp",
    "content": "#ifndef  BOOST_SERIALIZATION_UNORDERED_SET_HPP\n#define BOOST_SERIALIZATION_UNORDERED_SET_HPP\n\n// MS compatible compilers support #pragma once\n#if defined(_MSC_VER) && (_MSC_VER >= 1020)\n# pragma once\n#endif\n\n/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// unordered_set.hpp: serialization for stl unordered_set templates\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .\n// (C) Copyright 2014 Jim Bell\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for updates, documentation, and revision history.\n\n#include <boost/config.hpp>\n\n#include <unordered_set>\n\n#include <boost/serialization/unordered_collections_save_imp.hpp>\n#include <boost/serialization/unordered_collections_load_imp.hpp>\n#include <boost/serialization/archive_input_unordered_set.hpp>\n#include <boost/serialization/split_free.hpp>\n\nnamespace boost {\nnamespace serialization {\n\ntemplate<\n    class Archive,\n    class Key,\n    class HashFcn,\n    class EqualKey,\n    class Allocator\n>\ninline void save(\n    Archive & ar,\n    const std::unordered_set<\n        Key, HashFcn, EqualKey, Allocator\n    > &t,\n    const unsigned int /*file_version*/\n){\n    boost::serialization::stl::save_unordered_collection<\n        Archive,\n        std::unordered_set<Key, HashFcn, EqualKey, Allocator>\n    >(ar, t);\n}\n\ntemplate<\n    class Archive,\n    class Key,\n    class HashFcn,\n    class EqualKey,\n    class Allocator\n>\ninline void load(\n    Archive & ar,\n    std::unordered_set<\n        Key, HashFcn, EqualKey, Allocator\n    > &t,\n    const unsigned int /*file_version*/\n){\n    boost::serialization::stl::load_unordered_collection<\n        Archive,\n        std::unordered_set<Key, HashFcn, EqualKey, Allocator>,\n        stl::archive_input_unordered_set<\n            Archive,\n            std::unordered_set<\n                Key, HashFcn, EqualKey, Allocator\n            >\n        >\n    >(ar, t);\n}\n\n// split non-intrusive serialization function member into separate\n// non intrusive save/load member functions\ntemplate<\n    class Archive,\n    class Key,\n    class HashFcn,\n    class EqualKey,\n    class Allocator\n>\ninline void serialize(\n    Archive & ar,\n    std::unordered_set<\n        Key, HashFcn, EqualKey, Allocator\n    > &t,\n    const unsigned int file_version\n){\n    split_free(ar, t, file_version);\n}\n\n// unordered_multiset\ntemplate<\n    class Archive,\n    class Key,\n    class HashFcn,\n    class EqualKey,\n    class Allocator\n>\ninline void save(\n    Archive & ar,\n    const std::unordered_multiset<\n        Key, HashFcn, EqualKey, Allocator\n    > &t,\n    const unsigned int /*file_version*/\n){\n    stl::save_unordered_collection<\n        Archive,\n        std::unordered_multiset<Key, HashFcn, EqualKey, Allocator>\n    >(ar, t);\n}\n\ntemplate<\n    class Archive,\n    class Key,\n    class HashFcn,\n    class EqualKey,\n    class Allocator\n>\ninline void load(\n    Archive & ar,\n    std::unordered_multiset<\n        Key, HashFcn, EqualKey, Allocator\n    > &t,\n    const unsigned int /*file_version*/\n){\n    boost::serialization::stl::load_unordered_collection<\n        Archive,\n        std::unordered_multiset<Key, HashFcn, EqualKey, Allocator>,\n        boost::serialization::stl::archive_input_unordered_multiset<\n            Archive,\n            std::unordered_multiset<Key, HashFcn, EqualKey, Allocator>\n        >\n    >(ar, t);\n}\n\n// split non-intrusive serialization function member into separate\n// non intrusive save/load member functions\ntemplate<\n    class Archive,\n    class Key,\n    class HashFcn,\n    class EqualKey,\n    class Allocator\n>\ninline void serialize(\n    Archive & ar,\n    std::unordered_multiset<Key, HashFcn, EqualKey, Allocator> &t,\n    const unsigned int file_version\n){\n    boost::serialization::split_free(ar, t, file_version);\n}\n\n} // namespace serialization\n} // namespace boost\n\n#endif // BOOST_SERIALIZATION_UNORDERED_SET_HPP\n"
  },
  {
    "path": "include/boost/serialization/utility.hpp",
    "content": "#ifndef  BOOST_SERIALIZATION_UTILITY_HPP\n#define BOOST_SERIALIZATION_UTILITY_HPP\n\n// MS compatible compilers support #pragma once\n#if defined(_MSC_VER)\n# pragma once\n#endif\n\n/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// serialization/utility.hpp:\n// serialization for stl utility templates\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for updates, documentation, and revision history.\n\n#include <utility>\n#include <boost/config.hpp>\n\n#include <boost/type_traits/remove_const.hpp>\n#include <boost/serialization/nvp.hpp>\n#include <boost/serialization/is_bitwise_serializable.hpp>\n#include <boost/mpl/and.hpp>\n\nnamespace boost {\nnamespace serialization {\n\n// pair\ntemplate<class Archive, class F, class S>\ninline void serialize(\n    Archive & ar,\n    std::pair<F, S> & p,\n    const unsigned int /* file_version */\n){\n    // note: we remove any const-ness on the first argument.  The reason is that\n    // for stl maps, the type saved is pair<const key, T).  We remove\n    // the const-ness in order to be able to load it.\n    typedef typename boost::remove_const<F>::type typef;\n    ar & boost::serialization::make_nvp(\"first\", const_cast<typef &>(p.first));\n    ar & boost::serialization::make_nvp(\"second\", p.second);\n}\n\n/// specialization of is_bitwise_serializable for pairs\ntemplate <class T, class U>\nstruct is_bitwise_serializable<std::pair<T,U> >\n : public mpl::and_<is_bitwise_serializable< T >,is_bitwise_serializable<U> >\n{\n};\n\n} // serialization\n} // namespace boost\n\n#endif // BOOST_SERIALIZATION_UTILITY_HPP\n"
  },
  {
    "path": "include/boost/serialization/valarray.hpp",
    "content": "#ifndef BOOST_SERIALIZATION_VALARAY_HPP\n#define BOOST_SERIALIZATION_VALARAY_HPP\n\n// MS compatible compilers support #pragma once\n#if defined(_MSC_VER)\n# pragma once\n#endif\n\n/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// valarray.hpp: serialization for stl vector templates\n\n// (C) Copyright 2005 Matthias Troyer .\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for updates, documentation, and revision history.\n\n#include <valarray>\n#include <boost/config.hpp>\n#include <boost/core/addressof.hpp>\n\n#include <boost/serialization/collections_save_imp.hpp>\n#include <boost/serialization/collections_load_imp.hpp>\n#include <boost/serialization/split_free.hpp>\n#include <boost/serialization/collection_size_type.hpp>\n#include <boost/serialization/array_wrapper.hpp>\n\n// function specializations must be defined in the appropriate\n// namespace - boost::serialization\n#if defined(__SGI_STL_PORT) || defined(_STLPORT_VERSION)\n#define STD _STLP_STD\n#else\n#define STD std\n#endif\n\nnamespace boost {\nnamespace serialization {\n\n/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// valarray< T >\n\ntemplate<class Archive, class U>\nvoid save( Archive & ar, const STD::valarray<U> &t, const unsigned int /*file_version*/ )\n{\n    const collection_size_type count(t.size());\n    ar << BOOST_SERIALIZATION_NVP(count);\n    if (t.size()){\n        // explicit template arguments to pass intel C++ compiler\n        ar << serialization::make_array<const U, collection_size_type>(\n            static_cast<const U *>( boost::addressof(t[0]) ),\n            count\n        );\n    }\n}\n\ntemplate<class Archive, class U>\nvoid load( Archive & ar, STD::valarray<U> &t,  const unsigned int /*file_version*/ )\n{\n    collection_size_type count;\n    ar >> BOOST_SERIALIZATION_NVP(count);\n    t.resize(count);\n    if (t.size()){\n        // explicit template arguments to pass intel C++ compiler\n        ar >> serialization::make_array<U, collection_size_type>(\n            static_cast<U *>( boost::addressof(t[0]) ),\n            count\n        );\n    }\n}\n\n// split non-intrusive serialization function member into separate\n// non intrusive save/load member functions\ntemplate<class Archive, class U>\ninline void serialize( Archive & ar, STD::valarray<U> & t, const unsigned int file_version)\n{\n    boost::serialization::split_free(ar, t, file_version);\n}\n\n} } // end namespace boost::serialization\n\n#include <boost/serialization/collection_traits.hpp>\n\nBOOST_SERIALIZATION_COLLECTION_TRAITS(STD::valarray)\n#undef STD\n\n#endif // BOOST_SERIALIZATION_VALARAY_HPP\n"
  },
  {
    "path": "include/boost/serialization/variant.hpp",
    "content": "#ifndef BOOST_SERIALIZATION_VARIANT_HPP\n#define BOOST_SERIALIZATION_VARIANT_HPP\n\n// MS compatible compilers support #pragma once\n#if defined(_MSC_VER)\n# pragma once\n#endif\n\n/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// variant.hpp - non-intrusive serialization of variant types\n//\n// copyright (c) 2005\n// troy d. straszheim <troy@resophonic.com>\n// http://www.resophonic.com\n//\n// copyright (c) 2019 Samuel Debionne, ESRF\n//\n// copyright (c) 2023\n// Robert Ramey <ramey@rrsd.com>\n// http://www.rrsd.com\n//\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n//\n// See http://www.boost.org for updates, documentation, and revision history.\n//\n// thanks to Robert Ramey, Peter Dimov, and Richard Crossley.\n//\n\n#include <boost/mpl/front.hpp>\n#include <boost/mpl/pop_front.hpp>\n#include <boost/mpl/eval_if.hpp>\n#include <boost/mpl/identity.hpp>\n#include <boost/mpl/size.hpp>\n#include <boost/mpl/empty.hpp>\n\n#include <boost/serialization/throw_exception.hpp>\n\n// Boost Variant supports all C++ versions back to C++03\n#include <boost/variant/variant.hpp>\n#include <boost/variant/get.hpp>\n\n// Boost Variant2 supports all C++ versions back to C++11\n#if BOOST_CXX_VERSION >= 201103L\n#include <boost/variant2/variant.hpp>\n#endif\n\n// std::variant supports all C++ versions back to C++11\n#ifndef BOOST_NO_CXX17_HDR_VARIANT\n#include <variant>\n#endif\n\n#include <boost/archive/archive_exception.hpp>\n\n#include <boost/serialization/split_free.hpp>\n#include <boost/serialization/serialization.hpp>\n#include <boost/serialization/nvp.hpp>\n\n// use visitor from boost::variant\ntemplate<class Visitor, BOOST_VARIANT_ENUM_PARAMS(class T)>\ntypename Visitor::result_type visit(\n    Visitor visitor,\n    const boost::variant<BOOST_VARIANT_ENUM_PARAMS(T)> & t\n){\n    return boost::apply_visitor(visitor, t);\n}\ntemplate<class Visitor, BOOST_VARIANT_ENUM_PARAMS(class T)>\ntypename Visitor::result_type visit(\n    Visitor visitor,\n    const boost::variant<BOOST_VARIANT_ENUM_PARAMS(T)> & t,\n    const boost::variant<BOOST_VARIANT_ENUM_PARAMS(T)> & u\n){\n    return boost::apply_visitor(visitor, t, u);\n}\n\nnamespace boost {\nnamespace serialization {\n\ntemplate<class Archive>\nstruct variant_save_visitor :\n    boost::static_visitor<void>\n{\n    variant_save_visitor(Archive& ar) :\n        m_ar(ar)\n    {}\n    template<class T>\n    void operator()(T const & value) const {\n        m_ar << BOOST_SERIALIZATION_NVP(value);\n    }\nprivate:\n    Archive & m_ar;\n};\n\ntemplate<class Archive, BOOST_VARIANT_ENUM_PARAMS(/* typename */ class T)>\nvoid save(\n    Archive & ar,\n    boost::variant<BOOST_VARIANT_ENUM_PARAMS(T)> const & v,\n    unsigned int /*version*/\n){\n    int which = v.which();\n    ar << BOOST_SERIALIZATION_NVP(which);\n    variant_save_visitor<Archive> visitor(ar);\n    visit(visitor, v);\n}\n\n#if BOOST_CXX_VERSION >= 201103L\ntemplate<class Archive, class ...Types>\nvoid save(\n    Archive & ar,\n    boost::variant2::variant<Types...> const & v,\n    unsigned int /*version*/\n){\n    int which = v.index();\n    ar << BOOST_SERIALIZATION_NVP(which);\n    const variant_save_visitor<Archive> visitor(ar);\n    visit(visitor, v);\n}\n#endif\n\n#ifndef BOOST_NO_CXX17_HDR_VARIANT\ntemplate<class Archive, class ...Types>\nvoid save(\n    Archive & ar,\n    std::variant<Types...> const & v,\n    unsigned int /*version*/\n){\n    int which = v.index();\n    ar << BOOST_SERIALIZATION_NVP(which);\n    const variant_save_visitor<Archive> visitor(ar);\n    visit(visitor, v);\n}\n#endif\n\ntemplate<class S>\nstruct variant_impl {\n\n    struct load_null {\n        template<class Archive, class V>\n        static void invoke(\n            Archive & /*ar*/,\n            std::size_t /*which*/,\n            V & /*v*/,\n            const unsigned int /*version*/\n        ){}\n    };\n\n    struct load_member {\n        template<class Archive, class V>\n        static void invoke(\n            Archive & ar,\n            std::size_t which,\n            V & v,\n            const unsigned int version\n        ){\n            if(which == 0){\n                // note: A non-intrusive implementation (such as this one)\n                // necessary has to copy the value.  This wouldn't be necessary\n                // with an implementation that de-serialized to the address of the\n                // aligned storage included in the variant.\n                typedef typename mpl::front<S>::type head_type;\n                head_type value;\n                ar >> BOOST_SERIALIZATION_NVP(value);\n                v = std::move(value);;\n                head_type * new_address = & get<head_type>(v);\n                ar.reset_object_address(new_address, & value);\n                return;\n            }\n            typedef typename mpl::pop_front<S>::type type;\n            variant_impl<type>::load_impl(ar, which - 1, v, version);\n        }\n    };\n\n    template<class Archive, class V>\n    static void load_impl(\n        Archive & ar,\n        std::size_t which,\n        V & v,\n        const unsigned int version\n    ){\n        typedef typename mpl::eval_if<mpl::empty<S>,\n            mpl::identity<load_null>,\n            mpl::identity<load_member>\n        >::type typex;\n        typex::invoke(ar, which, v, version);\n    }\n}; // variant_impl\n\ntemplate<class Archive, BOOST_VARIANT_ENUM_PARAMS(/* typename */ class T)>\nvoid load(\n    Archive & ar,\n    boost::variant<BOOST_VARIANT_ENUM_PARAMS(T)>& v,\n    const unsigned int version\n){\n    int which;\n    typedef typename boost::variant<BOOST_VARIANT_ENUM_PARAMS(T)>::types types;\n    ar >> BOOST_SERIALIZATION_NVP(which);\n    if(which >=  mpl::size<types>::value){\n        // this might happen if a type was removed from the list of variant types\n        boost::serialization::throw_exception(\n            boost::archive::archive_exception(\n                boost::archive::archive_exception::unsupported_version\n            )\n        );\n    }\n    variant_impl<types>::load_impl(ar, which, v, version);\n}\n\n#if BOOST_CXX_VERSION >= 201103L\ntemplate<class Archive, class ... Types>\nvoid load(\n    Archive & ar,\n    boost::variant2::variant<Types...> & v,\n    const unsigned int version\n){\n    int which;\n    typedef typename boost::variant<Types...>::types types;\n    ar >> BOOST_SERIALIZATION_NVP(which);\n    if(static_cast<std::size_t>(which) >= sizeof...(Types)){\n        // this might happen if a type was removed from the list of variant types\n        boost::serialization::throw_exception(\n            boost::archive::archive_exception(\n                boost::archive::archive_exception::unsupported_version\n            )\n        );\n    }\n    variant_impl<types>::load_impl(ar, which, v, version);\n}\n#endif\n\n#ifndef BOOST_NO_CXX17_HDR_VARIANT\ntemplate<class Archive, class ... Types>\nvoid load(\n    Archive & ar,\n    std::variant<Types...> & v,\n    const unsigned int version\n){\n    int which;\n    typedef typename boost::variant<Types...>::types types;\n    ar >> BOOST_SERIALIZATION_NVP(which);\n    if(static_cast<std::size_t>(which) >= sizeof...(Types)){\n        // this might happen if a type was removed from the list of variant types\n        boost::serialization::throw_exception(\n            boost::archive::archive_exception(\n                boost::archive::archive_exception::unsupported_version\n            )\n        );\n    }\n    variant_impl<types>::load_impl(ar, which, v, version);\n}\n#endif\n\ntemplate<class Archive,BOOST_VARIANT_ENUM_PARAMS(/* typename */ class T)>\ninline void serialize(\n    Archive & ar,\n    boost::variant<BOOST_VARIANT_ENUM_PARAMS(T)> & v,\n    const unsigned int file_version\n){\n    boost::serialization::split_free(ar,v,file_version);\n}\n\n#if BOOST_CXX_VERSION >= 201103L\ntemplate<class Archive, class ... Types>\ninline void serialize(\n    Archive & ar,\n    boost::variant2::variant<Types...> & v,\n    const unsigned int file_version\n){\n    boost::serialization::split_free(ar,v,file_version);\n}\n#endif\n\n#ifndef BOOST_NO_CXX17_HDR_VARIANT\ntemplate<class Archive, class ... Types>\ninline void serialize(\n    Archive & ar,\n    std::variant<Types...> & v,\n    const unsigned int file_version\n){\n    boost::serialization::split_free(ar,v,file_version);\n}\n#endif\n\n} // namespace serialization\n} // namespace boost\n\n#include <boost/serialization/tracking.hpp>\n\nnamespace boost {\nnamespace serialization {\n\ntemplate<BOOST_VARIANT_ENUM_PARAMS(/* typename */ class T)>\nstruct tracking_level<\n    variant<BOOST_VARIANT_ENUM_PARAMS(T)>\n>{\n    typedef mpl::integral_c_tag tag;\n    typedef mpl::int_< ::boost::serialization::track_always> type;\n    BOOST_STATIC_CONSTANT(int, value = type::value);\n};\n\n#ifndef BOOST_NO_CXX17_HDR_VARIANT\ntemplate<class... Types>\nstruct tracking_level<\n    std::variant<Types...>\n>{\n    typedef mpl::integral_c_tag tag;\n    typedef mpl::int_< ::boost::serialization::track_always> type;\n    BOOST_STATIC_CONSTANT(int, value = type::value);\n};\n#endif\n\n} // namespace serialization\n} // namespace boost\n\n#endif //BOOST_SERIALIZATION_VARIANT_HPP\n"
  },
  {
    "path": "include/boost/serialization/variant2.hpp",
    "content": "#ifndef BOOST_SERIALIZATION_VARIANT2_HPP\n#define BOOST_SERIALIZATION_VARIANT2_HPP\n\n// MS compatible compilers support #pragma once\n#if defined(_MSC_VER)\n# pragma once\n#endif\n\n/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// variant2.hpp - non-intrusive serialization of variant types\n//\n// copyright (c) 2019 Samuel Debionne, ESRF\n//\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n//\n// See http://www.boost.org for updates, documentation, and revision history.\n//\n// Widely inspired from boost::variant serialization\n//\n\n#include <boost/serialization/throw_exception.hpp>\n\n#include <boost/archive/archive_exception.hpp>\n\n#include <boost/mp11/list.hpp>\n\n#include <boost/serialization/split_free.hpp>\n#include <boost/serialization/serialization.hpp>\n#include <boost/serialization/nvp.hpp>\n\nnamespace boost {\nnamespace serialization {\n\ntemplate<class Archive>\nstruct variant2_save_visitor\n{\n    variant2_save_visitor(Archive& ar) :\n        m_ar(ar)\n    {}\n    template<class T>\n    void operator()(T const & value) const\n    {\n        m_ar << BOOST_SERIALIZATION_NVP(value);\n    }\nprivate:\n    Archive & m_ar;\n};\n\n\ntemplate<class Archive>\nstruct variant2_load_visitor\n{\n    variant2_load_visitor(Archive& ar) :\n        m_ar(ar)\n    {}\n    template<class T>\n    void operator()(T & value) const\n    {\n        m_ar >> BOOST_SERIALIZATION_NVP(value);\n    }\nprivate:\n    Archive & m_ar;\n};\n\ntemplate<class Archive, class ...Types>\nvoid save(\n    Archive & ar,\n    variant2::variant<Types...> const & v,\n    unsigned int /*version*/\n){\n    const std::size_t which = v.index();\n    ar << BOOST_SERIALIZATION_NVP(which);\n    variant2_save_visitor<Archive> visitor(ar);\n    std::visit(visitor, v);\n}\n\ntemplate<class Seq>\nstruct variant_impl\n{\n    template<class Archive, class V>\n    static void load (\n        Archive & ar,\n        std::size_t which,\n        V & v,\n        const unsigned int version\n    ){\n        if(which == 0){\n            // note: A non-intrusive implementation (such as this one)\n            // necessary has to copy the value.  This wouldn't be necessary\n            // with an implementation that de-serialized to the address of the\n            // aligned storage included in the variant.\n            using type = mp11::mp_front<Seq>;\n            type value;\n            ar >> BOOST_SERIALIZATION_NVP(value);\n            v = std::move(value);\n            type * new_address = & variant2::get<type>(v);\n            ar.reset_object_address(new_address, & value);\n            return;\n        }\n        //typedef typename mpl::pop_front<S>::type type;\n        using types = mp11::mp_pop_front<Seq>;\n        variant_impl<types>::load(ar, which - 1, v, version);\n    }\n};\n\ntemplate<class Seq>\nstruct variant_impl<Seq>\n{\n    template<class Archive, class V>\n    static void load (\n        Archive & /*ar*/,\n        std::size_t /*which*/,\n        V & /*v*/,\n        const unsigned int /*version*/\n    ){}\n};\n\ntemplate<class Archive, class... Types>\nvoid load(\n    Archive & ar, \n    variant2::variant<Types...> & v,\n    const unsigned int version\n){\n    std::size_t which;\n    ar >> BOOST_SERIALIZATION_NVP(which);\n    if(which >=  sizeof...(Types))\n        // this might happen if a type was removed from the list of variant types\n        boost::serialization::throw_exception(\n            boost::archive::archive_exception(\n                boost::archive::archive_exception::unsupported_version\n            )\n        );\n    variant_impl<sizeof...(Types), mp11::mp_list<Types...>>::load(ar, which, v, version);\n}\n\ntemplate<class Archive,class... Types>\ninline void serialize(\n    Archive & ar,\n    variant2::variant<Types...> & v,\n    const unsigned int file_version\n){\n    split_free(ar,v,file_version);\n}\n\n// Specialization for std::monostate\ntemplate<class Archive>\nvoid serialize(Archive &ar, variant2::monostate &, const unsigned int /*version*/)\n{}\n\n} // namespace serialization\n} // namespace boost\n\n//template<typename T0_, BOOST_VARIANT_ENUM_SHIFTED_PARAMS(typename T)>\n\n#include <boost/serialization/tracking.hpp>\n\nnamespace boost {\n    namespace serialization {\n        \ntemplate<class... Types>\nstruct tracking_level<\n    variant2::variant<Types...>\n>{\n    typedef mpl::integral_c_tag tag;\n    typedef mpl::int_< ::boost::serialization::track_always> type;\n    BOOST_STATIC_CONSTANT(int, value = type::value);\n};\n\n} // namespace serialization\n} // namespace boost\n\n#endif //BOOST_SERIALIZATION_VARIANT2_HPP\n"
  },
  {
    "path": "include/boost/serialization/vector.hpp",
    "content": "#ifndef  BOOST_SERIALIZATION_VECTOR_HPP\n#define BOOST_SERIALIZATION_VECTOR_HPP\n\n// MS compatible compilers support #pragma once\n#if defined(_MSC_VER)\n# pragma once\n#endif\n\n/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// vector.hpp: serialization for stl vector templates\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .\n// fast array serialization (C) Copyright 2005 Matthias Troyer\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for updates, documentation, and revision history.\n\n#include <vector>\n\n#include <boost/config.hpp>\n#include <boost/detail/workaround.hpp>\n\n#include <boost/serialization/access.hpp>\n#include <boost/serialization/nvp.hpp>\n#include <boost/serialization/collection_size_type.hpp>\n#include <boost/serialization/library_version_type.hpp>\n#include <boost/serialization/item_version_type.hpp>\n#include <boost/serialization/library_version_type.hpp>\n\n#include <boost/serialization/collections_save_imp.hpp>\n#include <boost/serialization/collections_load_imp.hpp>\n#include <boost/serialization/split_free.hpp>\n#include <boost/serialization/array_wrapper.hpp>\n#include <boost/mpl/bool_fwd.hpp>\n#include <boost/mpl/if.hpp>\n\n// default is being compatible with version 1.34.1 files, not 1.35 files\n#ifndef BOOST_SERIALIZATION_VECTOR_VERSIONED\n#define BOOST_SERIALIZATION_VECTOR_VERSIONED(V) (V==4 || V==5)\n#endif\n\n// function specializations must be defined in the appropriate\n// namespace - boost::serialization\n#if defined(__SGI_STL_PORT) || defined(_STLPORT_VERSION)\n#define STD _STLP_STD\n#else\n#define STD std\n#endif\n\nnamespace boost {\nnamespace serialization {\n\n/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// vector< T >\n\n// the default versions\n\ntemplate<class Archive, class U, class Allocator>\ninline void save(\n    Archive & ar,\n    const std::vector<U, Allocator> &t,\n    const unsigned int /* file_version */,\n    mpl::false_\n){\n    boost::serialization::stl::save_collection<Archive, STD::vector<U, Allocator> >(\n        ar, t\n    );\n}\n\ntemplate<class Archive, class U, class Allocator>\ninline void load(\n    Archive & ar,\n    std::vector<U, Allocator> &t,\n    const unsigned int /* file_version */,\n    mpl::false_\n){\n    const boost::serialization::library_version_type library_version(\n        ar.get_library_version()\n    );\n    // retrieve number of elements\n    item_version_type item_version(0);\n    collection_size_type count;\n    ar >> BOOST_SERIALIZATION_NVP(count);\n    if(boost::serialization::library_version_type(3) < library_version){\n        ar >> BOOST_SERIALIZATION_NVP(item_version);\n    }\n    t.reserve(count);\n    stl::collection_load_impl(ar, t, count, item_version);\n}\n\n// the optimized versions\n\ntemplate<class Archive, class U, class Allocator>\ninline void save(\n    Archive & ar,\n    const std::vector<U, Allocator> &t,\n    const unsigned int /* file_version */,\n    mpl::true_\n){\n    const collection_size_type count(t.size());\n    ar << BOOST_SERIALIZATION_NVP(count);\n    if (!t.empty())\n        // explicit template arguments to pass intel C++ compiler\n        ar << serialization::make_array<const U, collection_size_type>(\n            static_cast<const U *>(&t[0]),\n            count\n        );\n}\n\ntemplate<class Archive, class U, class Allocator>\ninline void load(\n    Archive & ar,\n    std::vector<U, Allocator> &t,\n    const unsigned int /* file_version */,\n    mpl::true_\n){\n    collection_size_type count(t.size());\n    ar >> BOOST_SERIALIZATION_NVP(count);\n    t.resize(count);\n    unsigned int item_version=0;\n    if(BOOST_SERIALIZATION_VECTOR_VERSIONED(ar.get_library_version())) {\n        ar >> BOOST_SERIALIZATION_NVP(item_version);\n    }\n    if (!t.empty())\n        // explicit template arguments to pass intel C++ compiler\n        ar >> serialization::make_array<U, collection_size_type>(\n            static_cast<U *>(&t[0]),\n            count\n        );\n  }\n\n// dispatch to either default or optimized versions\n\ntemplate<class Archive, class U, class Allocator>\ninline void save(\n    Archive & ar,\n    const std::vector<U, Allocator> &t,\n    const unsigned int file_version\n){\n    typedef typename\n    boost::serialization::use_array_optimization<Archive>::template apply<\n        typename remove_const<U>::type\n    >::type use_optimized;\n    save(ar,t,file_version, use_optimized());\n}\n\ntemplate<class Archive, class U, class Allocator>\ninline void load(\n    Archive & ar,\n    std::vector<U, Allocator> &t,\n    const unsigned int file_version\n){\n#ifdef BOOST_SERIALIZATION_VECTOR_135_HPP\n    if (ar.get_library_version()==boost::serialization::library_version_type(5))\n    {\n      load(ar,t,file_version, boost::is_arithmetic<U>());\n      return;\n    }\n#endif\n    typedef typename\n    boost::serialization::use_array_optimization<Archive>::template apply<\n        typename remove_const<U>::type\n    >::type use_optimized;\n    load(ar,t,file_version, use_optimized());\n}\n\n// split non-intrusive serialization function member into separate\n// non intrusive save/load member functions\ntemplate<class Archive, class U, class Allocator>\ninline void serialize(\n    Archive & ar,\n    std::vector<U, Allocator> & t,\n    const unsigned int file_version\n){\n    boost::serialization::split_free(ar, t, file_version);\n}\n\n/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// vector<bool>\ntemplate<class Archive, class Allocator>\ninline void save(\n    Archive & ar,\n    const std::vector<bool, Allocator> &t,\n    const unsigned int /* file_version */\n){\n    // record number of elements\n    collection_size_type count (t.size());\n    ar << BOOST_SERIALIZATION_NVP(count);\n    std::vector<bool>::const_iterator it = t.begin();\n    while(count-- > 0){\n        bool tb = *it++;\n        ar << boost::serialization::make_nvp(\"item\", tb);\n    }\n}\n\ntemplate<class Archive, class Allocator>\ninline void load(\n    Archive & ar,\n    std::vector<bool, Allocator> &t,\n    const unsigned int /* file_version */\n){\n    // retrieve number of elements\n    collection_size_type count;\n    ar >> BOOST_SERIALIZATION_NVP(count);\n    t.resize(count);\n    for(collection_size_type i = collection_size_type(0); i < count; ++i){\n        bool b;\n        ar >> boost::serialization::make_nvp(\"item\", b);\n        t[i] = b;\n    }\n}\n\n// split non-intrusive serialization function member into separate\n// non intrusive save/load member functions\ntemplate<class Archive, class Allocator>\ninline void serialize(\n    Archive & ar,\n    std::vector<bool, Allocator> & t,\n    const unsigned int file_version\n){\n    boost::serialization::split_free(ar, t, file_version);\n}\n\n} // serialization\n} // namespace boost\n\n#include <boost/serialization/collection_traits.hpp>\n\nBOOST_SERIALIZATION_COLLECTION_TRAITS(std::vector)\n#undef STD\n\n#endif // BOOST_SERIALIZATION_VECTOR_HPP\n"
  },
  {
    "path": "include/boost/serialization/vector_135.hpp",
    "content": "////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// vector_135.hpp: serialization for stl vector templates for compatibility\n//                 with release 1.35, which had a bug\n\n// (C) Copyright 2008 Matthias Troyer\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for updates, documentation, and revision history.\n\n\n#ifndef  BOOST_SERIALIZATION_VECTOR_135_HPP\n#define BOOST_SERIALIZATION_VECTOR_135_HPP\n\n#ifdef BOOST_SERIALIZATION_VECTOR_VERSIONED\n#if BOOST_SERIALIZATION_VECTOR_VERSION != 4\n#error \"Boost.Serialization cannot be compatible with both 1.35 and 1.36-1.40 files\"\n#endif\n#else\n#define BOOST_SERIALIZATION_VECTOR_VERSIONED(V) (V>4)\n#endif\n\n#include <boost/serialization/vector.hpp>\n\n#endif // BOOST_SERIALIZATION_VECTOR_135_HPP\n"
  },
  {
    "path": "include/boost/serialization/version.hpp",
    "content": "#ifndef BOOST_SERIALIZATION_VERSION_HPP\n#define BOOST_SERIALIZATION_VERSION_HPP\n\n// MS compatible compilers support #pragma once\n#if defined(_MSC_VER)\n# pragma once\n#endif\n\n/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// version.hpp:\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for updates, documentation, and revision history.\n\n#include <boost/config.hpp>\n#include <boost/mpl/assert.hpp>\n#include <boost/mpl/int.hpp>\n#include <boost/mpl/eval_if.hpp>\n#include <boost/mpl/identity.hpp>\n#include <boost/mpl/integral_c_tag.hpp>\n\n#include <boost/type_traits/is_base_and_derived.hpp>\n\nnamespace boost {\nnamespace serialization {\n\nstruct basic_traits;\n\n// default version number is 0. Override with higher version\n// when class definition changes.\ntemplate<class T>\nstruct version\n{\n    template<class U>\n    struct traits_class_version {\n        typedef typename U::version type;\n    };\n\n    typedef mpl::integral_c_tag tag;\n    // note: at least one compiler complained w/o the full qualification\n    // on basic traits below\n    typedef\n        typename mpl::eval_if<\n            is_base_and_derived<boost::serialization::basic_traits,T>,\n            traits_class_version< T >,\n            mpl::int_<0>\n        >::type type;\n    BOOST_STATIC_CONSTANT(int, value = version::type::value);\n};\n\n#ifndef BOOST_NO_INCLASS_MEMBER_INITIALIZATION\ntemplate<class T>\nconst int version<T>::value;\n#endif\n\n} // namespace serialization\n} // namespace boost\n\n/* note: at first it seemed that this would be a good place to trap\n * as an error an attempt to set a version # for a class which doesn't\n * save its class information (including version #) in the archive.\n * However, this imposes a requirement that the version be set after\n * the implementation level which would be pretty confusing.  If this\n * is to be done, do this check in the input or output operators when\n * ALL the serialization traits are available.  Included the implementation\n * here with this comment as a reminder not to do this!\n */\n\n#include <boost/mpl/less.hpp>\n#include <boost/mpl/comparison.hpp>\n\n// specify the current version number for the class\n// version numbers limited to 8 bits !!!\n#define BOOST_CLASS_VERSION(T, N)                                      \\\nnamespace boost {                                                      \\\nnamespace serialization {                                              \\\ntemplate<>                                                             \\\nstruct version<T >                                                     \\\n{                                                                      \\\n    typedef mpl::int_<N> type;                                         \\\n    typedef mpl::integral_c_tag tag;                                   \\\n    BOOST_STATIC_CONSTANT(int, value = version::type::value);          \\\n    BOOST_MPL_ASSERT((                                                 \\\n        boost::mpl::less<                                              \\\n            boost::mpl::int_<N>,                                       \\\n            boost::mpl::int_<256>                                      \\\n        >                                                              \\\n    ));                                                                \\\n    /*                                                                 \\\n    BOOST_MPL_ASSERT((                                                 \\\n        mpl::equal_to<                                                 \\\n            :implementation_level<T >,                                 \\\n            mpl::int_<object_class_info>                               \\\n        >::value                                                       \\\n    ));                                                                \\\n    */                                                                 \\\n};                                                                     \\\n}                                                                      \\\n}\n\n#endif // BOOST_SERIALIZATION_VERSION_HPP\n"
  },
  {
    "path": "include/boost/serialization/void_cast.hpp",
    "content": "#ifndef BOOST_SERIALIZATION_VOID_CAST_HPP\n#define BOOST_SERIALIZATION_VOID_CAST_HPP\n\n// MS compatible compilers support #pragma once\n#if defined(_MSC_VER)\n# pragma once\n#endif\n\n/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// void_cast.hpp:   interface for run-time casting of void pointers.\n\n// (C) Copyright 2002-2009 Robert Ramey - http://www.rrsd.com .\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n// gennadiy.rozental@tfn.com\n\n//  See http://www.boost.org for updates, documentation, and revision history.\n\n#include <cstddef> // for ptrdiff_t\n#include <boost/config.hpp>\n#include <boost/noncopyable.hpp>\n\n#include <boost/serialization/smart_cast.hpp>\n#include <boost/serialization/singleton.hpp>\n#include <boost/serialization/force_include.hpp>\n#include <boost/serialization/type_info_implementation.hpp>\n#include <boost/serialization/extended_type_info.hpp>\n#include <boost/type_traits/is_virtual_base_of.hpp>\n#include <boost/type_traits/aligned_storage.hpp>\n#include <boost/serialization/void_cast_fwd.hpp>\n\n#include <boost/serialization/config.hpp>\n#include <boost/config/abi_prefix.hpp> // must be the last header\n\n#ifdef BOOST_MSVC\n#  pragma warning(push)\n#  pragma warning(disable : 4251 4231 4660 4275)\n#endif\n\nnamespace boost {\nnamespace serialization {\n\nclass extended_type_info;\n\n// Given a void *, assume that it really points to an instance of one type\n// and alter it so that it would point to an instance of a related type.\n// Return the altered pointer. If there exists no sequence of casts that\n// can transform from_type to to_type, return a NULL.\n\nBOOST_SERIALIZATION_DECL void const *\nvoid_upcast(\n    extended_type_info const & derived,\n    extended_type_info const & base,\n    void const * const t\n);\n\ninline void *\nvoid_upcast(\n    extended_type_info const & derived,\n    extended_type_info const & base,\n    void * const t\n){\n    return const_cast<void*>(void_upcast(\n        derived,\n        base,\n        const_cast<void const *>(t)\n    ));\n}\n\nBOOST_SERIALIZATION_DECL void const *\nvoid_downcast(\n    extended_type_info const & derived,\n    extended_type_info const & base,\n    void const * const t\n);\n\ninline void *\nvoid_downcast(\n    extended_type_info const & derived,\n    extended_type_info const & base,\n    void * const t\n){\n    return const_cast<void*>(void_downcast(\n        derived,\n        base,\n        const_cast<void const *>(t)\n    ));\n}\n\nnamespace void_cast_detail {\n\nclass BOOST_SYMBOL_VISIBLE void_caster :\n    private boost::noncopyable\n{\n    friend\n    BOOST_SERIALIZATION_DECL void const *\n    boost::serialization::void_upcast(\n        extended_type_info const & derived,\n        extended_type_info const & base,\n        void const * const\n    );\n    friend\n    BOOST_SERIALIZATION_DECL void const *\n    boost::serialization::void_downcast(\n        extended_type_info const & derived,\n        extended_type_info const & base,\n        void const * const\n    );\nprotected:\n    BOOST_SERIALIZATION_DECL void recursive_register(bool includes_virtual_base = false) const;\n    BOOST_SERIALIZATION_DECL void recursive_unregister() const;\n    virtual bool has_virtual_base() const = 0;\npublic:\n    // Data members\n    const extended_type_info * m_derived;\n    const extended_type_info * m_base;\n    /*const*/ std::ptrdiff_t m_difference;\n    void_caster const * const m_parent;\n\n    // note that void_casters are keyed on value of\n    // member extended type info records - NOT their\n    // addresses.  This is necessary in order for the\n    // void cast operations to work across dll and exe\n    // module boundaries.\n    bool operator<(const void_caster & rhs) const;\n\n    const void_caster & operator*(){\n        return *this;\n    }\n    // each derived class must re-implement these;\n    virtual void const * upcast(void const * const t) const = 0;\n    virtual void const * downcast(void const * const t) const = 0;\n    // Constructor\n    void_caster(\n        extended_type_info const * derived,\n        extended_type_info const * base,\n        std::ptrdiff_t difference = 0,\n        void_caster const * const parent = 0\n    ) :\n        m_derived(derived),\n        m_base(base),\n        m_difference(difference),\n        m_parent(parent)\n    {}\n    virtual ~void_caster(){}\n};\n\n#ifdef BOOST_MSVC\n#  pragma warning(push)\n#  pragma warning(disable : 4251 4231 4660 4275 4511 4512)\n#endif\n\ntemplate <class Derived, class Base>\nclass BOOST_SYMBOL_VISIBLE void_caster_primitive :\n    public void_caster\n{\n    void const * downcast(void const * const t) const BOOST_OVERRIDE {\n        const Derived * d =\n            boost::serialization::smart_cast<const Derived *, const Base *>(\n                static_cast<const Base *>(t)\n            );\n        return d;\n    }\n    void const * upcast(void const * const t) const BOOST_OVERRIDE {\n        const Base * b =\n            boost::serialization::smart_cast<const Base *, const Derived *>(\n                static_cast<const Derived *>(t)\n            );\n        return b;\n    }\n    bool has_virtual_base() const BOOST_OVERRIDE {\n        return false;\n    }\npublic:\n    void_caster_primitive();\n    ~void_caster_primitive() BOOST_OVERRIDE;\n\nprivate:\n    static std::ptrdiff_t base_offset() {\n        typename boost::aligned_storage<sizeof(Derived)>::type data;\n        return reinterpret_cast<char*>(&data)\n             - reinterpret_cast<char*>(\n                   static_cast<Base*>(\n                       reinterpret_cast<Derived*>(&data)));\n    }\n};\n\ntemplate <class Derived, class Base>\nvoid_caster_primitive<Derived, Base>::void_caster_primitive() :\n    void_caster(\n        & type_info_implementation<Derived>::type::get_const_instance(),\n        & type_info_implementation<Base>::type::get_const_instance(),\n        base_offset()\n    )\n{\n    recursive_register();\n}\n\ntemplate <class Derived, class Base>\nvoid_caster_primitive<Derived, Base>::~void_caster_primitive(){\n    recursive_unregister();\n}\n\ntemplate <class Derived, class Base>\nclass BOOST_SYMBOL_VISIBLE void_caster_virtual_base :\n    public void_caster\n{\n    bool has_virtual_base() const BOOST_OVERRIDE {\n        return true;\n    }\npublic:\n    void const * downcast(void const * const t) const BOOST_OVERRIDE {\n        const Derived * d =\n            dynamic_cast<const Derived *>(\n                static_cast<const Base *>(t)\n            );\n        return d;\n    }\n    void const * upcast(void const * const t) const BOOST_OVERRIDE {\n        const Base * b =\n            dynamic_cast<const Base *>(\n                static_cast<const Derived *>(t)\n            );\n        return b;\n    }\n    void_caster_virtual_base();\n    ~void_caster_virtual_base() BOOST_OVERRIDE;\n};\n\n#ifdef BOOST_MSVC\n#pragma warning(pop)\n#endif\n\ntemplate <class Derived, class Base>\nvoid_caster_virtual_base<Derived,Base>::void_caster_virtual_base() :\n    void_caster(\n        & (type_info_implementation<Derived>::type::get_const_instance()),\n        & (type_info_implementation<Base>::type::get_const_instance())\n    )\n{\n    recursive_register(true);\n}\n\ntemplate <class Derived, class Base>\nvoid_caster_virtual_base<Derived,Base>::~void_caster_virtual_base(){\n    recursive_unregister();\n}\n\ntemplate <class Derived, class Base>\nstruct BOOST_SYMBOL_VISIBLE void_caster_base :\n    public void_caster\n{\n    typedef\n        typename mpl::eval_if<boost::is_virtual_base_of<Base,Derived>,\n            mpl::identity<\n                void_cast_detail::void_caster_virtual_base<Derived, Base>\n            >\n        ,// else\n            mpl::identity<\n                void_cast_detail::void_caster_primitive<Derived, Base>\n            >\n        >::type type;\n};\n\n} // void_cast_detail\n\ntemplate<class Derived, class Base>\nBOOST_DLLEXPORT\ninline const void_cast_detail::void_caster & void_cast_register(\n    Derived const * /* dnull = NULL */,\n    Base const * /* bnull = NULL */\n){\n    typedef\n        typename mpl::eval_if<boost::is_virtual_base_of<Base,Derived>,\n            mpl::identity<\n                void_cast_detail::void_caster_virtual_base<Derived, Base>\n            >\n        ,// else\n            mpl::identity<\n                void_cast_detail::void_caster_primitive<Derived, Base>\n            >\n        >::type typex;\n    return singleton<typex>::get_const_instance();\n}\n\ntemplate<class Derived, class Base>\nclass BOOST_SYMBOL_VISIBLE void_caster :\n    public void_cast_detail::void_caster_base<Derived, Base>::type\n{\n};\n\n} // namespace serialization\n} // namespace boost\n\n#ifdef BOOST_MSVC\n#  pragma warning(pop)\n#endif\n\n#include <boost/config/abi_suffix.hpp> // pops abi_suffix.hpp pragmas\n\n#endif // BOOST_SERIALIZATION_VOID_CAST_HPP\n"
  },
  {
    "path": "include/boost/serialization/void_cast_fwd.hpp",
    "content": "#ifndef  BOOST_SERIALIZATION_VOID_CAST_FWD_HPP\n#define BOOST_SERIALIZATION_VOID_CAST_FWD_HPP\n\n// MS compatible compilers support #pragma once\n#if defined(_MSC_VER)\n# pragma once\n#endif\n\n/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// void_cast_fwd.hpp:   interface for run-time casting of void pointers.\n\n// (C) Copyright 2005 Robert Ramey - http://www.rrsd.com .\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n// gennadiy.rozental@tfn.com\n\n//  See http://www.boost.org for updates, documentation, and revision history.\n\n#include <cstddef> // NULL\n#include <boost/serialization/force_include.hpp>\n\nnamespace boost {\nnamespace serialization {\nnamespace void_cast_detail{\nclass void_caster;\n} // namespace void_cast_detail\ntemplate<class Derived, class Base>\nBOOST_DLLEXPORT\ninline const void_cast_detail::void_caster & void_cast_register(\n    const Derived * dnull = NULL,\n    const Base * bnull = NULL\n) BOOST_USED;\n} // namespace serialization\n} // namespace boost\n\n#endif // BOOST_SERIALIZATION_VOID_CAST_HPP\n"
  },
  {
    "path": "include/boost/serialization/weak_ptr.hpp",
    "content": "#ifndef BOOST_SERIALIZATION_WEAK_PTR_HPP\n#define BOOST_SERIALIZATION_WEAK_PTR_HPP\n\n// MS compatible compilers support #pragma once\n#if defined(_MSC_VER)\n# pragma once\n#endif\n\n/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// weak_ptr.hpp: serialization for boost weak pointer\n\n// (C) Copyright 2004 Robert Ramey and Martin Ecker\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for updates, documentation, and revision history.\n\n#include <boost/weak_ptr.hpp>\n#include <boost/serialization/shared_ptr.hpp>\n\nnamespace boost {\nnamespace serialization{\n\ntemplate<class Archive, class T>\ninline void save(\n    Archive & ar,\n    const boost::weak_ptr< T > &t,\n    const unsigned int /* file_version */\n){\n    const boost::shared_ptr< T > sp = t.lock();\n    ar << boost::serialization::make_nvp(\"weak_ptr\", sp);\n}\n\ntemplate<class Archive, class T>\ninline void load(\n    Archive & ar,\n    boost::weak_ptr< T > &t,\n    const unsigned int /* file_version */\n){\n    boost::shared_ptr< T > sp;\n    ar >> boost::serialization::make_nvp(\"weak_ptr\", sp);\n    t = sp;\n}\n\ntemplate<class Archive, class T>\ninline void serialize(\n    Archive & ar,\n    boost::weak_ptr< T > &t,\n    const unsigned int file_version\n){\n    boost::serialization::split_free(ar, t, file_version);\n}\n\n} // namespace serialization\n} // namespace boost\n\n#ifndef BOOST_NO_CXX11_SMART_PTR\n#include <memory>\n\nnamespace boost {\nnamespace serialization{\n\ntemplate<class Archive, class T>\ninline void save(\n    Archive & ar,\n    const std::weak_ptr< T > &t,\n    const unsigned int /* file_version */\n){\n    const std::shared_ptr< T > sp = t.lock();\n    ar << boost::serialization::make_nvp(\"weak_ptr\", sp);\n}\n\ntemplate<class Archive, class T>\ninline void load(\n    Archive & ar,\n    std::weak_ptr< T > &t,\n    const unsigned int /* file_version */\n){\n    std::shared_ptr< T > sp;\n    ar >> boost::serialization::make_nvp(\"weak_ptr\", sp);\n    t = sp;\n}\n\ntemplate<class Archive, class T>\ninline void serialize(\n    Archive & ar,\n    std::weak_ptr< T > &t,\n    const unsigned int file_version\n){\n    boost::serialization::split_free(ar, t, file_version);\n}\n\n} // namespace serialization\n} // namespace boost\n\n#endif // BOOST_NO_CXX11_SMART_PTR\n\n#endif // BOOST_SERIALIZATION_WEAK_PTR_HPP\n"
  },
  {
    "path": "include/boost/serialization/wrapper.hpp",
    "content": "#ifndef BOOST_SERIALIZATION_WRAPPER_HPP\n#define BOOST_SERIALIZATION_WRAPPER_HPP\n\n// (C) Copyright 2005-2006 Matthias Troyer\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n#include <boost/serialization/traits.hpp>\n#include <boost/type_traits/is_base_and_derived.hpp>\n#include <boost/mpl/eval_if.hpp>\n#include <boost/mpl/bool_fwd.hpp>\n\nnamespace boost { namespace serialization {\n\n/// the base class for serialization wrappers\n///\n/// wrappers need to be treated differently at various places in the serialization library,\n/// e.g. saving of non-const wrappers has to be possible. Since partial specialization\n// is not supported by all compilers, we derive all wrappers from wrapper_traits.\n\ntemplate<\n    class T,\n    int Level = object_serializable,\n    int Tracking = track_never,\n    unsigned int Version = 0,\n    class ETII = extended_type_info_impl< T >\n>\nstruct wrapper_traits :\n    public traits<T,Level,Tracking,Version,ETII,mpl::true_>\n{};\n\ntemplate<class T>\nstruct is_wrapper_impl :\n    boost::mpl::eval_if<\n      boost::is_base_and_derived<basic_traits,T>,\n      boost::mpl::true_,\n      boost::mpl::false_\n    >::type\n{};\n\ntemplate<class T>\nstruct is_wrapper {\n    typedef typename is_wrapper_impl<const T>::type type;\n};\n\n} // serialization\n} // boost\n\n// A macro to define that a class is a wrapper\n#define BOOST_CLASS_IS_WRAPPER(T)                       \\\nnamespace boost {                                       \\\nnamespace serialization {                               \\\ntemplate<>                                              \\\nstruct is_wrapper_impl<const T> : boost::mpl::true_ {}; \\\n}                                                       \\\n}                                                       \\\n/**/\n\n#endif //BOOST_SERIALIZATION_WRAPPER_HPP\n"
  },
  {
    "path": "index.html",
    "content": "<html>\n<!--\n(C) Copyright 2002-4 Robert Ramey - http://www.rrsd.com . \nUse, modification and distribution is subject to the Boost Software\nLicense, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\nhttp://www.boost.org/LICENSE_1_0.txt)\n-->\n<head>\n<meta http-equiv=\"refresh\" content=\"0; URL=doc/index.html\">\n</head>\n<body>\nAutomatic redirection failed, please go to\n<a href=\"doc/index.html\">doc/index.html</a>.\n</body>\n</html>"
  },
  {
    "path": "meta/libraries.json",
    "content": "{\n    \"key\": \"serialization\",\n    \"name\": \"Serialization\",\n    \"authors\": [\n        \"Robert Ramey\"\n    ],\n    \"description\": \"Serialization for persistence and marshalling.\",\n    \"category\": [\n        \"IO\"\n    ],\n    \"maintainers\": [\n        \"Robert Ramey <ramey -at- rrsd.com>\"\n    ],\n    \"cxxstd\": \"03\"\n}\n"
  },
  {
    "path": "performance/Jamfile.v2",
    "content": "# Boost serialization Library performance test Jamfile\n\n#  (C) Copyright Robert Ramey 2002-2004.\n#  Use, modification, and distribution are subject to the \n#  Boost Software License, Version 1.0. (See accompanying file \n#  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n#\n\nproject libs/serialization/performance\n    : default-build release\n    : id serialization_performance\n    ;\n\n# import rules from the boost serialization test\n# import ../util/test : test-bsl-run-no-lib ;\nimport ../util/test :\n    run-template\n    run-invoke\n    run-winvoke\n    test-bsl-run-no-lib\n    test-bsl-run\n    test-bsl-run_archive\n    test-bsl-run_files\n;\n\nBOOST_ARCHIVE_LIST = [ modules.peek : BOOST_ARCHIVE_LIST ] ;\n\ntest-suite \"performance\" :\n    [ test-bsl-run_files peformance_array : ../test/A ]\n#    [ test-bsl-run_files performance_binary ]\n#    [ test-bsl-run_files performance_polymorphic ]\n#    [ test-bsl-run_files performance_vector ]\n#    [ test-bsl-run_files performance_no_rtti ]\n#    [ test-bsl-run_files performance_simple_class ]\n    \n    [ test-bsl-run-no-lib performance_iterators ]\n    [ test-bsl-run-no-lib performance_iterators_base64 ]\n#    [ test-bsl-run-no-lib performance_utf8_codecvt \n#        : ../src/utf8_codecvt_facet\n#        : # <dependency>../../config/test/all//BOOST_NO_STD_WSTREAMBUF\n#    ]\n#    [ test-bsl-run-no-lib performance_codecvt_null \n#        : ../src/codecvt_null \n#        : # <dependency>../../config/test/all//BOOST_NO_STD_WSTREAMBUF\n#    ]\n;\n"
  },
  {
    "path": "performance/binary_archive.hpp",
    "content": "// (C) Copyright 2002-4 Robert Ramey - http://www.rrsd.com . \n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for updates, documentation, and revision history.\n// (C) Copyright 2002-4 Robert Ramey - http://www.rrsd.com . \n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for updates, documentation, and revision history.\n\n// binary_archive\n#include <boost/archive/binary_oarchive.hpp>\ntypedef boost::archive::binary_oarchive test_oarchive;\ntypedef std::ofstream test_ostream;\n#include <boost/archive/binary_iarchive.hpp>\ntypedef boost::archive::binary_iarchive test_iarchive;\ntypedef std::ifstream test_istream;\n#define TEST_STREAM_FLAGS std::ios::binary\n\n"
  },
  {
    "path": "performance/binary_warchive.hpp",
    "content": "// (C) Copyright 2002-4 Robert Ramey - http://www.rrsd.com . \n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for updates, documentation, and revision history.\n// binary_warchive\n#include <boost/archive/binary_woarchive.hpp>\ntypedef boost::archive::binary_woarchive test_oarchive;\ntypedef std::wofstream test_ostream;\n#include <boost/archive/binary_wiarchive.hpp>\ntypedef boost::archive::binary_wiarchive test_iarchive;\ntypedef std::wifstream test_istream;\n#define TEST_STREAM_FLAGS std::wios::binary\n"
  },
  {
    "path": "performance/peformance_array.cpp",
    "content": "/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// test_array.cpp\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com . \n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n// should pass compilation and execution\n\n#include <fstream>\n#include <cstdio> // remove\n#include <boost/config.hpp>\n#if defined(BOOST_NO_STDC_NAMESPACE)\nnamespace std{ \n    using ::remove;\n}\n#endif\n\n#include \"../test/test_tools.hpp\"\n\n#include <boost/preprocessor/stringize.hpp>\n//#include <boost/preprocessor/cat.hpp>\n// the following fails with (only!) gcc 3.4 \n// #include BOOST_PP_STRINGIZE(BOOST_PP_CAT(../test/,BOOST_ARCHIVE_TEST))\n// just copy over the files from the test directory\n#include BOOST_PP_STRINGIZE(BOOST_ARCHIVE_TEST)\n\n#include <boost/core/no_exceptions_support.hpp>\n#include <boost/archive/archive_exception.hpp>\n\n#include <boost/serialization/nvp.hpp>\n#include \"../test/A.hpp\"\n#include \"../test/A.ipp\"\n\nstruct array_equal_to //: public std::binary_function<T, T, bool>\n{\ntemplate<class T, class U>\n    bool operator()(const T & _Left, const U & _Right) const\n    {\n        // consider alignment\n        int count_left = sizeof(_Left) /    (\n            static_cast<const char *>(static_cast<const void *>(&_Left[1])) \n            - static_cast<const char *>(static_cast<const void *>(&_Left[0]))\n        );\n        int count_right = sizeof(_Right) /  (\n            static_cast<const char *>(static_cast<const void *>(&_Right[1])) \n            - static_cast<const char *>(static_cast<const void *>(&_Right[0]))\n        );\n        if(count_right != count_left)\n            return false;\n        while(count_left-- > 0){\n            if(_Left[count_left] == _Right[count_left])\n                continue;\n            return false;\n        }\n        return true;\n    }\n};\n\ntemplate <class T>\nint test_array(T)\n{\n    const char * testfile = boost::archive::tmpnam(NULL);\n    BOOST_REQUIRE(NULL != testfile);\n\n    // test array of objects\n    const T a_array[10]={T(),T(),T(),T(),T(),T(),T(),T(),T(),T()};\n    {   \n        test_ostream os(testfile, TEST_STREAM_FLAGS);\n        test_oarchive oa(os, TEST_ARCHIVE_FLAGS);\n        oa << boost::serialization::make_nvp(\"a_array\", a_array);\n    }\n    {\n        T a_array1[10];\n        test_istream is(testfile, TEST_STREAM_FLAGS);\n        test_iarchive ia(is, TEST_ARCHIVE_FLAGS);\n        ia >> boost::serialization::make_nvp(\"a_array\", a_array1);\n\n        array_equal_to/*<A[10]>*/ Compare;\n        BOOST_CHECK(Compare(a_array, a_array1));\n    }\n    {\n        T a_array1[9];\n        test_istream is(testfile, TEST_STREAM_FLAGS);\n        BOOST_TRY {\n            test_iarchive ia(is, TEST_ARCHIVE_FLAGS);\n            bool exception_invoked = false;\n            BOOST_TRY {\n                ia >> boost::serialization::make_nvp(\"a_array\", a_array1);\n            }\n            BOOST_CATCH (boost::archive::archive_exception ae){\n                BOOST_CHECK(\n                    boost::archive::archive_exception::array_size_too_short\n                    == ae.code\n                );\n                exception_invoked = true;\n            }\n            BOOST_CATCH_END\n            BOOST_CHECK(exception_invoked);\n        }\n        BOOST_CATCH (boost::archive::archive_exception ae){}\n        BOOST_CATCH_END\n    }\n    std::remove(testfile);\n    return EXIT_SUCCESS;\n}\n\nint test_main( int /* argc */, char* /* argv */[] )\n{\n   int res = test_array(A());\n    // test an int array for which optimized versions should be available\n   if (res == EXIT_SUCCESS)\n     res = test_array(0);  \n   return res;\n}\n\n// EOF\n"
  },
  {
    "path": "performance/performance_binary.cpp",
    "content": "/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// test_simple_class.cpp\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com . \n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n// should pass compilation and execution\n\n#include <fstream>\n\n#include <cstdlib> // for rand()\n#include <cstdio> // remove\n#include <boost/config.hpp>\n#if defined(BOOST_NO_STDC_NAMESPACE)\nnamespace std{ \n    using ::rand; \n    using ::remove;\n}\n#endif\n\n#include \"../test/test_tools.hpp\"\n#include <boost/preprocessor/stringize.hpp>\n// #include <boost/preprocessor/cat.hpp>\n// the following fails with (only!) gcc 3.4 \n// #include BOOST_PP_STRINGIZE(BOOST_PP_CAT(../test/,BOOST_ARCHIVE_TEST))\n// just copy over the files from the test directory\n#include BOOST_PP_STRINGIZE(BOOST_ARCHIVE_TEST)\n\n#include <boost/serialization/nvp.hpp>\n#include <boost/serialization/binary_object.hpp>\n\nclass A {\n    friend class boost::serialization::access;\n    char data[150];\n    // note: from an aesthetic perspective, I would much prefer to have this\n    // defined out of line.  Unfortunately, this trips a bug in the VC 6.0\n    // compiler. So hold our nose and put it her to permit running of tests.\n    template<class Archive>\n    void serialize(Archive & ar, const unsigned int /* file_version */){\n        ar & boost::serialization::make_nvp(\n            \"data\",\n            boost::serialization::make_binary_object(data, sizeof(data))\n        );\n    }\n\npublic:\n    A();\n    bool operator==(const A & rhs) const;\n};\n\nA::A(){\n    int i = sizeof(data);\n    while(i-- > 0)\n        data[i] = 0xff & std::rand();\n}\n\nbool A::operator==(const A & rhs) const {\n    int i = sizeof(data);\n    while(i-- > 0)\n        if(data[i] != rhs.data[i])\n            return false;\n    return true;\n}\n\nint test_main( int /* argc */, char* /* argv */[] )\n{\n    const char * testfile = boost::archive::tmpnam(NULL);\n    BOOST_REQUIRE(NULL != testfile);\n\n    const A a;\n    A a1;\n    const int i = 12345;\n    int i1 = 34790;\n    {   \n        test_ostream os(testfile, TEST_STREAM_FLAGS);\n        test_oarchive oa(os, TEST_ARCHIVE_FLAGS);\n        oa << BOOST_SERIALIZATION_NVP(a);\n        // note: add a little bit on the end of the archive to detect\n        // failure of text mode binary.\n        oa << BOOST_SERIALIZATION_NVP(i);\n    }\n    {\n        test_istream is(testfile, TEST_STREAM_FLAGS);\n        test_iarchive ia(is, TEST_ARCHIVE_FLAGS);\n        ia >> BOOST_SERIALIZATION_NVP(a1);\n        ia >> BOOST_SERIALIZATION_NVP(i1);\n    }\n    BOOST_CHECK(i == i1);\n    BOOST_CHECK(a == a1);\n    std::remove(testfile);\n    return EXIT_SUCCESS;\n}\n\n// EOF\n"
  },
  {
    "path": "performance/performance_codecvt_null.cpp",
    "content": "/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// test_codecvt_null.cpp\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com . \n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n// should pass compilation and execution.  Note: compilation with compilers\n// which use wchar_t as 2 byte objects will emit warnings.  These should be\n// ignored.\n\n#include <algorithm>\n#include <fstream>\n#include <iostream>\n#include <iterator>\n#include <locale>\n#include <vector>\n#include <cstddef>\n\n#include <cstdio> // remove\n#include <boost/config.hpp>\n#if defined(BOOST_NO_STDC_NAMESPACE)\nnamespace std{ \n    using ::remove;\n}\n#endif\n\n#include \"test_tools.hpp\"\n\n#include <boost/archive/add_facet.hpp>\n#include <boost/archive/codecvt_null.hpp>\n#include <boost/archive/iterators/ostream_iterator.hpp>\n#include <boost/archive/iterators/istream_iterator.hpp>\n\ntemplate<std::size_t S>\nstruct test_data\n{\n    static wchar_t wchar_encoding[];\n};\n\ntemplate<>\nwchar_t test_data<2>::wchar_encoding[] = {\n    0x0001,\n    0x007f,\n    0x0080,\n    0x07ff,\n    0x0800,\n    0x7fff\n};\n\ntemplate<>\nwchar_t test_data<4>::wchar_encoding[] = {\n    0x00000001,\n    0x0000007f,\n    0x00000080,\n    0x000007ff,\n    0x00000800,\n    0x0000ffff,\n    0x00010000,\n    0x0010ffff,\n    0x001fffff,\n    0x00200000,\n    0x03ffffff,\n    0x04000000,\n    0x7fffffff\n};\n\n#include <iostream>\n\nint test_main( int /* argc */, char* /* argv */[] ) {\n    const char * testfile = boost::archive::tmpnam(NULL);\n    BOOST_REQUIRE(NULL != testfile);\n\n    std::locale old_loc;\n    std::locale * null_locale = \n        boost::archive::add_facet(old_loc, new boost::archive::codecvt_null<wchar_t>);\n\n    typedef test_data<sizeof(wchar_t)> td;\n    {\n        std::wofstream ofs;\n        ofs.imbue(*null_locale);\n        ofs.open(testfile, std::ios::binary);\n        std::copy(\n            td::wchar_encoding,\n            #if ! defined(BOOST_BORLANDC)\n                // borland 5.60 complains about this\n                td::wchar_encoding + sizeof(td::wchar_encoding)/sizeof(wchar_t),\n            #else\n                // so use this instead\n                td::wchar_encoding + 6,\n            #endif\n            boost::archive::iterators::ostream_iterator<wchar_t>(ofs)\n        );\n    }\n    bool ok = false;\n    {\n        std::wifstream ifs;\n        ifs.imbue(*null_locale);\n        ifs.open(testfile, std::ios::binary);\n        ok = std::equal(\n            td::wchar_encoding,\n            #if ! defined(BOOST_BORLANDC)\n                // borland 5.60 complains about this\n                td::wchar_encoding + sizeof(td::wchar_encoding)/sizeof(wchar_t),\n            #else\n                // so use this instead\n                td::wchar_encoding + 6,\n            #endif\n            boost::archive::iterators::istream_iterator<wchar_t>(ifs)\n        );\n    }\n\n    BOOST_CHECK(ok);\n    {\n        std::wofstream ofs(\"testfile2\");\n        ofs.imbue(*null_locale);\n        int i = 10;\n        ofs << i;\n        ofs.close();\n        \n        std::wifstream ifs(\"testfile2\");\n        ifs.imbue(*null_locale);\n        int i2;\n        ifs >> i2;\n        std::cout << \"i=\" << i << std::endl;\n        std::cout << \"i2=\" << i2 << std::endl;\n        BOOST_CHECK(i == i2);\n        ifs.close();\n    }\n \n    delete null_locale;\n    std::remove(testfile);\n    return EXIT_SUCCESS;\n}\n\n"
  },
  {
    "path": "performance/performance_iterators.cpp",
    "content": "/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// test_iterators.cpp\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com . \n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n#include <algorithm>\n#include <vector>\n#include <cstdlib> // for rand\n#include <functional>\n#include <sstream> // used to test stream iterators\n\n#include <boost/config.hpp>\n#ifdef BOOST_NO_STDC_NAMESPACE\nnamespace std{\n    using ::rand; \n}\n#endif\n\n#include <boost/detail/workaround.hpp>\n#if BOOST_WORKAROUND(BOOST_DINKUMWARE_STDLIB, == 1)\n#include <boost/archive/dinkumware.hpp>\n#endif\n\n#ifndef BOOST_NO_CWCHAR\n#include <boost/archive/iterators/mb_from_wchar.hpp>\n#include <boost/archive/iterators/wchar_from_mb.hpp>\n#endif\n#include <boost/archive/iterators/xml_escape.hpp>\n#include <boost/archive/iterators/xml_unescape.hpp>\n#include <boost/archive/iterators/transform_width.hpp>\n#include <boost/archive/iterators/istream_iterator.hpp>\n#include <boost/archive/iterators/ostream_iterator.hpp>\n\n#include \"../test/test_tools.hpp\"\n\n#ifndef BOOST_NO_CWCHAR\n\nvoid test_wchar_from_mb(const wchar_t *la, const char * a, const unsigned int size){\n    typedef boost::archive::iterators::wchar_from_mb<const char *> translator;\n    BOOST_CHECK((\n        std::equal(\n            translator(BOOST_MAKE_PFTO_WRAPPER(a)),\n            translator(BOOST_MAKE_PFTO_WRAPPER(a + size)),\n            la\n        )\n    ));\n}\n\nvoid test_mb_from_wchar(const char * a, const wchar_t *la, const unsigned int size){\n    typedef boost::archive::iterators::mb_from_wchar<const wchar_t *> translator;\n    BOOST_CHECK(\n        std::equal(\n            translator(BOOST_MAKE_PFTO_WRAPPER(la)), \n            translator(BOOST_MAKE_PFTO_WRAPPER(la + size)), \n            a\n        )\n    );\n}\n\n#endif\n\ntemplate<class CharType>\nvoid test_xml_escape(\n    const CharType * xml_escaped, \n    const CharType * xml, \n    unsigned int size\n){\n    typedef boost::archive::iterators::xml_escape<const CharType *> translator;\n\n    BOOST_CHECK(\n        std::equal(\n            translator(BOOST_MAKE_PFTO_WRAPPER(xml)),\n            translator(BOOST_MAKE_PFTO_WRAPPER(xml + size)),\n            xml_escaped\n        )\n    );\n}\n\ntemplate<class CharType>\nvoid test_xml_unescape(\n    const CharType * xml, \n    const CharType * xml_escaped, \n    unsigned int size\n){\n\n    // test xml_unescape\n    typedef boost::archive::iterators::xml_unescape<const CharType *> translator;\n\n    BOOST_CHECK(\n        std::equal(\n            translator(BOOST_MAKE_PFTO_WRAPPER(xml_escaped)),\n            translator(BOOST_MAKE_PFTO_WRAPPER(xml_escaped + size)),\n            xml\n        )\n    );\n}\n\ntemplate<int BitsOut, int BitsIn>\nvoid test_transform_width(unsigned int size){\n    // test transform_width\n    char rawdata[8];\n    \n    char * rptr;\n    for(rptr = rawdata + 6; rptr-- > rawdata;)\n        *rptr = std::rand();\n\n    // convert 8 to 6 bit characters\n    typedef boost::archive::iterators::transform_width<\n        char *, BitsOut, BitsIn \n    > translator1;\n\n    std::vector<char> v6;\n\n    std::copy(\n        translator1(BOOST_MAKE_PFTO_WRAPPER(static_cast<char *>(rawdata))),\n        translator1(BOOST_MAKE_PFTO_WRAPPER(rawdata + size)),\n        std::back_inserter(v6)\n    );\n\n    // check to see we got the expected # of characters out\n    if(0 ==  size)\n        BOOST_CHECK(v6.size() == 0);\n    else\n        BOOST_CHECK(v6.size() == (size * BitsIn - 1 ) / BitsOut + 1);\n\n    typedef boost::archive::iterators::transform_width<\n        std::vector<char>::iterator, BitsIn, BitsOut\n    > translator2;\n\n    BOOST_CHECK(\n        std::equal(\n            rawdata,\n            rawdata + size,\n            translator2(BOOST_MAKE_PFTO_WRAPPER(v6.begin()))\n        )\n    );\n\n}\n\ntemplate<class CharType>\nvoid test_stream_iterators(\n    const CharType * test_data, \n    unsigned int size\n){\n    std::basic_stringstream<CharType> ss;\n    boost::archive::iterators::ostream_iterator<CharType> osi =\n        boost::archive::iterators::ostream_iterator<CharType>(ss);\n    std::copy(test_data, test_data + size, osi);\n\n    BOOST_CHECK(size == ss.str().size());\n\n    boost::archive::iterators::istream_iterator<CharType> isi =\n        boost::archive::iterators::istream_iterator<CharType>(ss);\n    BOOST_CHECK(std::equal(test_data, test_data + size,isi));\n}\n\nint\ntest_main(int /* argc */, char* /* argv */ [] )\n{\n    const char xml[] = \"<+>+&+\\\"+'\";\n    const char xml_escaped[] = \"&lt;+&gt;+&amp;+&quot;+&apos;\";\n    test_xml_escape<const char>(\n        xml_escaped, \n        xml, \n        sizeof(xml) / sizeof(char) - 1\n    );\n    test_xml_unescape<const char>(\n        xml, \n        xml_escaped, \n        sizeof(xml_escaped) / sizeof(char) - 1\n    );\n\n    const char a[] = \"abcdefghijklmnopqrstuvwxyz\";\n\n    #ifndef BOOST_NO_CWCHAR\n    const wchar_t wxml[] = L\"<+>+&+\\\"+'\";\n    const wchar_t wxml_escaped[] = L\"&lt;+&gt;+&amp;+&quot;+&apos;\";\n    test_xml_escape<const wchar_t>(\n        wxml_escaped, \n        wxml, \n        sizeof(wxml) / sizeof(wchar_t) - 1\n    );\n    test_xml_unescape<const wchar_t>(\n        wxml, \n        wxml_escaped, \n        sizeof(wxml_escaped) / sizeof(wchar_t) - 1\n    );\n\n    const wchar_t la[] = L\"abcdefghijklmnopqrstuvwxyz\";\n\n    test_wchar_from_mb(la, a, sizeof(a) / sizeof(char) - 1);\n    test_mb_from_wchar(a, la, sizeof(la) / sizeof(wchar_t) - 1);\n\n    test_stream_iterators<wchar_t>(la, sizeof(la)/sizeof(wchar_t) - 1);\n    #endif\n\n    test_stream_iterators<char>(a, sizeof(a) - 1);\n\n    test_transform_width<6, 8>(0);\n    test_transform_width<6, 8>(1);\n    test_transform_width<6, 8>(2);\n    test_transform_width<6, 8>(3);\n    test_transform_width<6, 8>(4);\n    test_transform_width<6, 8>(5);\n    test_transform_width<6, 8>(6);\n    test_transform_width<6, 8>(7);\n    test_transform_width<6, 8>(8);\n\n    return EXIT_SUCCESS;\n}\n"
  },
  {
    "path": "performance/performance_iterators_base64.cpp",
    "content": "/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// test_iterators.cpp\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com . \n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n#include <algorithm>\n#include <list>\n\n#if (defined _MSC_VER) && (_MSC_VER == 1200)\n#  pragma warning (disable : 4786) // too long name, harmless warning\n#endif\n\n#include <cstdlib>\n#include <cstddef> // size_t\n\n#include <boost/config.hpp>\n#ifdef BOOST_NO_STDC_NAMESPACE\nnamespace std{ \n    using ::rand; \n    using ::size_t;\n}\n#endif\n\n#include <boost/serialization/pfto.hpp>\n\n#include <boost/archive/iterators/binary_from_base64.hpp>\n#include <boost/archive/iterators/base64_from_binary.hpp>\n#include <boost/archive/iterators/insert_linebreaks.hpp>\n#include <boost/archive/iterators/remove_whitespace.hpp>\n#include <boost/archive/iterators/transform_width.hpp>\n\n#include \"../test/test_tools.hpp\"\n\n#include <iostream>\n\ntemplate<typename CharType>\nvoid test_base64(){\n    CharType rawdata[150];\n    std::size_t size = sizeof(rawdata) / sizeof(CharType);\n    CharType * rptr;\n    for(rptr = rawdata + size; rptr-- > rawdata;)\n        *rptr = std::rand();\n\n    // convert to base64\n    typedef std::list<CharType> text_base64_type;\n    text_base64_type text_base64;\n\n    typedef \n        boost::archive::iterators::insert_linebreaks<\n            boost::archive::iterators::base64_from_binary<\n                boost::archive::iterators::transform_width<\n                    CharType *\n                    ,6\n                    ,sizeof(CharType) * 8\n                >\n            > \n            ,72\n        > \n        translate_out;\n\n    std::copy(\n        translate_out(BOOST_MAKE_PFTO_WRAPPER(static_cast<CharType *>(rawdata))),\n        translate_out(BOOST_MAKE_PFTO_WRAPPER(rawdata + size)),\n        std::back_inserter(text_base64)\n    );\n\n    // convert from base64 to binary and compare with the original \n    typedef \n        boost::archive::iterators::transform_width<\n            boost::archive::iterators::binary_from_base64<\n                boost::archive::iterators::remove_whitespace<\n                    BOOST_DEDUCED_TYPENAME text_base64_type::iterator\n                >\n            >,\n            sizeof(CharType) * 8,\n            6\n        > translate_in;\n    \n    BOOST_CHECK(\n        std::equal(\n            rawdata,\n            rawdata + size,\n            translate_in(BOOST_MAKE_PFTO_WRAPPER(text_base64.begin()))\n        )\n    );\n\n}\n\nint\ntest_main( int argc, char* argv[] )\n{\n    test_base64<char>();\n    #ifndef BOOST_NO_CWCHAR\n    test_base64<wchar_t>();\n    #endif\n    return EXIT_SUCCESS;\n}\n"
  },
  {
    "path": "performance/performance_no_rtti.cpp",
    "content": "/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// test_no_rtti.cpp\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com . \n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n// note: this program tests the inter-operability of different\n// extended typeinfo systems.  In this example, one class is\n// identified using the default RTTI while the other uses a custom\n// system based on the export key.\n// \n// As this program uses RTTI for one of the types, the test will fail\n// on a system for which RTTI is not enabled or not existent.\n\n#include <fstream>\n\n#include <cstdio> // remove\n#include <boost/config.hpp>\n#if defined(BOOST_NO_STDC_NAMESPACE)\nnamespace std{ \n    using ::remove;\n}\n#endif\n\n#include <boost/static_assert.hpp>\n#include <boost/type_traits/is_same.hpp>\n\n#include <boost/archive/archive_exception.hpp>\n#include \"../test/test_tools.hpp\"\n#include <boost/preprocessor/stringize.hpp>\n// #include <boost/preprocessor/cat.hpp>\n// the following fails with (only!) gcc 3.4 \n// #include BOOST_PP_STRINGIZE(BOOST_PP_CAT(../test/,BOOST_ARCHIVE_TEST))\n// just copy over the files from the test directory\n#include BOOST_PP_STRINGIZE(BOOST_ARCHIVE_TEST)\n\n#include <boost/serialization/nvp.hpp>\n#include <boost/serialization/base_object.hpp>\n#include <boost/serialization/export.hpp>\n#include <boost/serialization/type_info_implementation.hpp>\n#include <boost/serialization/extended_type_info_no_rtti.hpp>\n\nclass polymorphic_base\n{\n    friend class boost::serialization::access;\n    template<class Archive>\n    void serialize(Archive & /* ar */, const unsigned int /* file_version */){\n    }\npublic:\n    virtual const char * get_key() const = 0;\n    virtual ~polymorphic_base(){};\n};\n\nBOOST_IS_ABSTRACT(polymorphic_base)\nBOOST_CLASS_TYPE_INFO(\n    polymorphic_base,\n    extended_type_info_no_rtti<polymorphic_base>\n)\n// note: types which use ...no_rtti MUST be exported\nBOOST_CLASS_EXPORT(polymorphic_base)\n\nclass polymorphic_derived1 : public polymorphic_base\n{\n    friend class boost::serialization::access;\n    template<class Archive>\n    void serialize(Archive &ar, const unsigned int  /* file_version */){\n        ar & BOOST_SERIALIZATION_BASE_OBJECT_NVP(polymorphic_base);\n    }\npublic:\n    virtual const char * get_key() const ;\n};\n\nBOOST_CLASS_TYPE_INFO(\n    polymorphic_derived1,\n    extended_type_info_no_rtti<polymorphic_derived1>\n)\nBOOST_CLASS_EXPORT(polymorphic_derived1)\n\nconst char * polymorphic_derived1::get_key() const {\n    const boost::serialization::extended_type_info *eti\n        = boost::serialization::type_info_implementation<polymorphic_derived1>\n            ::type::get_instance();\n    return eti->get_key();\n}\n\nclass polymorphic_derived2 : public polymorphic_base\n{\n    friend class boost::serialization::access;\n    template<class Archive>\n    void serialize(Archive &ar, const unsigned int /* file_version */){\n        ar & BOOST_SERIALIZATION_BASE_OBJECT_NVP(polymorphic_base);\n    }\npublic:\n    virtual const char * get_key() const ;\n};\n\n// note the mixing of type_info systems is supported.\nBOOST_CLASS_TYPE_INFO(\n    polymorphic_derived2,\n    boost::serialization::extended_type_info_typeid<polymorphic_derived2>\n)\n\nBOOST_CLASS_EXPORT(polymorphic_derived2)\n\nconst char * polymorphic_derived2::get_key() const {\n    // use the exported key as the identifier\n    const boost::serialization::extended_type_info *eti\n        = boost::serialization::type_info_implementation<polymorphic_derived2>\n        ::type::get_instance();\n    return eti->get_key();\n}\n\n// save derived polymorphic class\nvoid save_derived(const char *testfile)\n{\n    test_ostream os(testfile, TEST_STREAM_FLAGS);\n    test_oarchive oa(os, TEST_ARCHIVE_FLAGS);\n\n    polymorphic_derived1 *rd1 = new polymorphic_derived1;\n    polymorphic_derived2 *rd2 = new polymorphic_derived2;\n\n    oa << BOOST_SERIALIZATION_NVP(rd1);\n    oa << BOOST_SERIALIZATION_NVP(rd2);\n\n    // the above operation registers the derived classes as a side\n    // effect.  Hence, instances can now be correctly serialized through\n    // a base class pointer.\n    polymorphic_base *rb1 =  rd1;\n    polymorphic_base *rb2 =  rd2;\n    oa << BOOST_SERIALIZATION_NVP(rb1);\n    oa << BOOST_SERIALIZATION_NVP(rb2);\n\n    delete rd1;\n    delete rd2;\n}\n\n// save derived polymorphic class\nvoid load_derived(const char *testfile)\n{\n    test_istream is(testfile, TEST_STREAM_FLAGS);\n    test_iarchive ia(is, TEST_ARCHIVE_FLAGS);\n\n    polymorphic_derived1 *rd1 = NULL;\n    polymorphic_derived2 *rd2 = NULL;\n\n    ia >> BOOST_SERIALIZATION_NVP(rd1);\n\n    BOOST_CHECK_MESSAGE(\n        boost::serialization::type_info_implementation<polymorphic_derived1>\n            ::type::get_instance()\n        == boost::serialization::type_info_implementation<polymorphic_derived1>\n            ::type::get_derived_extended_type_info(*rd1),\n        \"restored pointer d1 not of correct type\"\n    );\n\n    ia >> BOOST_SERIALIZATION_NVP(rd2);\n\n    BOOST_CHECK_MESSAGE(\n        boost::serialization::type_info_implementation<polymorphic_derived2>\n            ::type::get_instance()\n        == boost::serialization::type_info_implementation<polymorphic_derived2>\n            ::type::get_derived_extended_type_info(*rd2),\n        \"restored pointer d2 not of correct type\"\n    );\n\n    polymorphic_base *rb1 = NULL;\n    polymorphic_base *rb2 = NULL;\n\n    // the above operation registers the derived classes as a side\n    // effect.  Hence, instances can now be correctly serialized through\n    // a base class pointer.\n    ia >> BOOST_SERIALIZATION_NVP(rb1);\n\n    BOOST_CHECK_MESSAGE(\n        rb1 == dynamic_cast<polymorphic_base *>(rd1),\n        \"serialized pointers not correctly restored\"\n    );\n\n    BOOST_CHECK_MESSAGE(\n        boost::serialization::type_info_implementation<polymorphic_derived1>\n            ::type::get_instance()\n        == boost::serialization::type_info_implementation<polymorphic_base>\n            ::type::get_derived_extended_type_info(*rb1),\n        \"restored pointer b1 not of correct type\"\n    );\n\n    ia >> BOOST_SERIALIZATION_NVP(rb2);\n\n    BOOST_CHECK_MESSAGE(\n        rb2 ==  dynamic_cast<polymorphic_base *>(rd2),\n        \"serialized pointers not correctly restored\"\n    );\n\n    BOOST_CHECK_MESSAGE(\n        boost::serialization::type_info_implementation<polymorphic_derived2>\n            ::type::get_instance()\n        == boost::serialization::type_info_implementation<polymorphic_base>\n            ::type::get_derived_extended_type_info(*rb2),\n        \"restored pointer b2 not of correct type\"\n    );\n\n    delete rb1;\n    delete rb2;\n}\n\nint\ntest_main( int /* argc */, char* /* argv */[] )\n{\n    const char * testfile = boost::archive::tmpnam(NULL);\n    \n    BOOST_REQUIRE(NULL != testfile);\n\n    save_derived(testfile);\n    load_derived(testfile);\n\n    std::remove(testfile);\n    return EXIT_SUCCESS;\n}\n\n// EOF\n"
  },
  {
    "path": "performance/performance_polymorphic.cpp",
    "content": "/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// test_polymorphic.cpp\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com . \n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n// should pass compilation and execution\n\n#include <fstream>\n\n#include <cstdio> // remove\n#include <boost/config.hpp>\n#if defined(BOOST_NO_STDC_NAMESPACE)\nnamespace std{ \n    using ::remove;\n}\n#endif\n\n#include \"../test/test_tools.hpp\"\n\n#if !defined(BOOST_ARCHIVE_TEST)\n#define BOOST_ARCHIVE_TEST polymorphic_text_archive.hpp\n#endif\n\n// the following is to ensure that when one of the libraries changes\n// BJAM rebuilds and relinks the test.\n/*\n#include \"polymorphic_text_archive.hpp\"\n#include \"polymorphic_text_warchive.hpp\"\n#include \"polymorphic_binary_archive.hpp\"\n#include \"polymorphic_xml_archive.hpp\"\n#include \"polymorphic_xml_warchive.hpp\"\n*/\n\n#include <boost/preprocessor/stringize.hpp>\n// #include <boost/preprocessor/cat.hpp>\n// the following fails with (only!) gcc 3.4 \n// #include BOOST_PP_STRINGIZE(BOOST_PP_CAT(../test/,BOOST_ARCHIVE_TEST))\n// just copy over the files from the test directory\n#include BOOST_PP_STRINGIZE(BOOST_ARCHIVE_TEST)\n\n#include <boost/archive/polymorphic_oarchive.hpp>\n#include <boost/archive/polymorphic_iarchive.hpp>\n\n#include <boost/serialization/nvp.hpp>\n#include \"../test/test_polymorphic_A.hpp\"\n\nint test_main(int /* argc */, char * /* argv */ [])\n{\n    const char * testfile = boost::archive::tmpnam(NULL);\n    BOOST_REQUIRE(NULL != testfile);\n    const data d;\n    data d1;\n    // test using using polymorphic interface\n    {\n        test_ostream os(testfile, TEST_STREAM_FLAGS);\n        test_oarchive oa_implementation(os);\n        boost::archive::polymorphic_oarchive & oa_interface = oa_implementation;\n        oa_interface << BOOST_SERIALIZATION_NVP(d);\n    }\n    {\n        test_istream is(testfile, TEST_STREAM_FLAGS);\n        test_iarchive  ia_implementation(is);\n        boost::archive::polymorphic_iarchive & ia_interface = ia_implementation;\n        ia_interface >> BOOST_SERIALIZATION_NVP(d1);\n    }\n    BOOST_CHECK(d == d1);\n    std::remove(testfile);\n\n    // test using using polymorphic implementation.\n    {\n        test_ostream os(testfile, TEST_STREAM_FLAGS);\n        test_oarchive oa_implementation(os);\n        oa_implementation << BOOST_SERIALIZATION_NVP(d);\n    }\n    {\n        test_istream is(testfile, TEST_STREAM_FLAGS);\n        test_iarchive  ia_implementation(is);\n        ia_implementation >> BOOST_SERIALIZATION_NVP(d1);\n    }\n    BOOST_CHECK(d == d1);\n    std::remove(testfile);\n\n    // test using using polymorphic implementation.\n    {\n        test_ostream os(testfile, TEST_STREAM_FLAGS);\n        boost::archive::polymorphic_oarchive * oa_implementation \n            = new test_oarchive(os);\n        *oa_implementation << BOOST_SERIALIZATION_NVP(d);\n        delete oa_implementation;\n    }\n    {\n        test_istream is(testfile, TEST_STREAM_FLAGS);\n        boost::archive::polymorphic_iarchive * ia_implementation\n            = new test_iarchive(is);\n        *ia_implementation >> BOOST_SERIALIZATION_NVP(d1);\n        delete ia_implementation;\n    }\n    BOOST_CHECK(d == d1);\n    std::remove(testfile);\n    return EXIT_SUCCESS;\n}\n"
  },
  {
    "path": "performance/performance_simple_class.cpp",
    "content": "/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// test_simple_class.cpp\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com . \n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n// should pass compilation and execution\n\n// invoke header for a custom archive test.\n\n#include <fstream>\n\n#include <cstdio> // remove\n#include <boost/config.hpp>\n\n#if defined(BOOST_NO_STDC_NAMESPACE)\nnamespace std{ \n    using ::remove;\n}\n#endif\n\n#include \"../test/test_tools.hpp\"\n#include <boost/preprocessor/stringize.hpp>\n// #include <boost/preprocessor/cat.hpp>\n// the following fails with (only!) gcc 3.4 \n// #include BOOST_PP_STRINGIZE(BOOST_PP_CAT(../test/,BOOST_ARCHIVE_TEST))\n// just copy over the files from the test directory\n#include BOOST_PP_STRINGIZE(BOOST_ARCHIVE_TEST)\n\n#include <boost/serialization/nvp.hpp>\n#include \"../test/A.hpp\"\n\nint \ntest_main( int /* argc */, char* /* argv */[] )\n{\n    const char * testfile = boost::archive::tmpnam(NULL);\n    BOOST_REQUIRE(NULL != testfile);\n\n    A a, a1;\n    {   \n        test_ostream os(testfile, TEST_STREAM_FLAGS);\n        test_oarchive oa(os, TEST_ARCHIVE_FLAGS);\n        oa << boost::serialization::make_nvp(\"a\", a);\n    }\n    {\n        test_istream is(testfile, TEST_STREAM_FLAGS);\n        test_iarchive ia(is, TEST_ARCHIVE_FLAGS);\n        ia >> boost::serialization::make_nvp(\"a\", a1);\n    }\n    BOOST_CHECK_EQUAL(a, a1);\n    std::remove(testfile);\n    return (a == a1) ? EXIT_SUCCESS : EXIT_SUCCESS;\n}\n"
  },
  {
    "path": "performance/performance_utf8_codecvt.cpp",
    "content": "/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// test_utf8_codecvt.cpp\n\n// (C) Copyright 2002-4 Robert Ramey - http://www.rrsd.com . \n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n#include <algorithm>\n#include <fstream>\n#include <iostream>\n#include <iterator>\n#include <locale>\n#include <vector>\n#include <string>\n\n#include <cstddef> // size_t\n#include <boost/config.hpp>\n#if defined(BOOST_NO_STDC_NAMESPACE)\nnamespace std{ \n    using ::size_t; \n} // namespace std\n#endif\n\n#include <cwchar>\n#ifdef BOOST_NO_STDC_NAMESPACE\nnamespace std{ using ::wcslen; }\n#endif\n\n#include \"../test/test_tools.hpp\"\n#include <boost/archive/iterators/istream_iterator.hpp>\n#include <boost/archive/iterators/ostream_iterator.hpp>\n\n#include <boost/archive/add_facet.hpp>\n#include <boost/archive/detail/utf8_codecvt_facet.hpp>\n\ntemplate<std::size_t s>\nstruct test_data\n{\n    static unsigned char utf8_encoding[];\n    static wchar_t wchar_encoding[];\n};\n\ntemplate<>\nunsigned char test_data<2>::utf8_encoding[] = {\n    0x01,\n    0x7f,\n    0xc2, 0x80,\n    0xdf, 0xbf,\n    0xe0, 0xa0, 0x80,\n    0xe7, 0xbf, 0xbf\n};\n\ntemplate<>\nwchar_t test_data<2>::wchar_encoding[] = {\n    0x0001,\n    0x007f,\n    0x0080,\n    0x07ff,\n    0x0800,\n    0x7fff\n};\n\ntemplate<>\nunsigned char test_data<4>::utf8_encoding[] = {\n    0x01,\n    0x7f,\n    0xc2, 0x80,\n    0xdf, 0xbf,\n    0xe0, 0xa0, 0x80,\n    0xef, 0xbf, 0xbf,\n    0xf0, 0x90, 0x80, 0x80,\n    0xf4, 0x8f, 0xbf, 0xbf,\n    0xf7, 0xbf, 0xbf, 0xbf,\n    0xf8, 0x88, 0x80, 0x80, 0x80,\n    0xfb, 0xbf, 0xbf, 0xbf, 0xbf,\n    0xfc, 0x84, 0x80, 0x80, 0x80, 0x80,\n    0xfd, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf\n};\n\ntemplate<>\nwchar_t test_data<4>::wchar_encoding[] = {\n    0x00000001,\n    0x0000007f,\n    0x00000080,\n    0x000007ff,\n    0x00000800,\n    0x0000ffff,\n    0x00010000,\n    0x0010ffff,\n    0x001fffff,\n    0x00200000,\n    0x03ffffff,\n    0x04000000,\n    0x7fffffff\n};\n\nint\ntest_main(int /* argc */, char * /* argv */[]) {\n    std::locale old_loc;\n    std::locale * utf8_locale\n        = boost::archive::add_facet(\n            old_loc, \n            new boost::archive::detail::utf8_codecvt_facet\n        );\n\n    typedef char utf8_t;\n    typedef test_data<sizeof(wchar_t)> td;\n\n    // Send our test UTF-8 data to file\n    {\n        std::ofstream ofs;\n        ofs.open(\"test.dat\", std::ios::binary);\n        std::copy(\n            td::utf8_encoding,\n            #if ! defined(BOOST_BORLANDC)\n                // borland 5.60 complains about this\n                td::utf8_encoding + sizeof(td::utf8_encoding) / sizeof(unsigned char),\n            #else\n                // so use this instead\n                td::utf8_encoding + 12,\n            #endif\n            boost::archive::iterators::ostream_iterator<utf8_t>(ofs)\n        );\n    }\n\n    // Read the test data back in, converting to UCS-4 on the way in\n    std::vector<wchar_t> from_file;\n    {\n        std::wifstream ifs;\n        ifs.imbue(*utf8_locale);\n        ifs.open(\"test.dat\");\n\n        wchar_t item = 0;\n        // note can't use normal vector from iterator constructor because\n        // dinkumware doesn't have it.\n        for(;;){\n            item = ifs.get();\n            if(item == WEOF)\n                break;\n            //ifs >> item;\n            //if(ifs.eof())\n            //    break;\n            from_file.push_back(item);\n        }\n    }\n\n    // compare the data read back in with the original\n    #if ! defined(BOOST_BORLANDC)\n        // borland 5.60 complains about this\n        BOOST_CHECK(from_file.size() == sizeof(td::wchar_encoding)/sizeof(wchar_t));\n    #else\n        // so use this instead\n        BOOST_CHECK(from_file.size() == 6);\n    #endif\n\n    BOOST_CHECK(std::equal(from_file.begin(), from_file.end(), td::wchar_encoding));\n  \n    // Send the UCS4_data back out, converting to UTF-8\n    {\n        std::wofstream ofs;\n        ofs.imbue(*utf8_locale);\n        ofs.open(\"test2.dat\");\n        std::copy(\n            from_file.begin(),\n            from_file.end(),\n            boost::archive::iterators::ostream_iterator<wchar_t>(ofs)\n        );\n    }\n\n    // Make sure that both files are the same\n    {\n        typedef boost::archive::iterators::istream_iterator<utf8_t> is_iter;\n        is_iter end_iter;\n\n        std::ifstream ifs1(\"test.dat\");\n        is_iter it1(ifs1);\n        std::vector<utf8_t> data1;\n        std::copy(it1, end_iter, std::back_inserter(data1));\n\n        std::ifstream ifs2(\"test2.dat\");\n        is_iter it2(ifs2);\n        std::vector<utf8_t> data2;\n        std::copy(it2, end_iter, std::back_inserter(data2));\n\n        BOOST_CHECK(data1 == data2);\n    }\n\n    // some libraries have trouble that only shows up with longer strings\n    \n    wchar_t * test3_data = L\"\\\n    <?xml version=\\\"1.0\\\" encoding=\\\"UTF-8\\\" standalone=\\\"yes\\\" ?>\\\n    <!DOCTYPE boost_serialization>\\\n    <boost_serialization signature=\\\"serialization::archive\\\" version=\\\"3\\\">\\\n    <a class_id=\\\"0\\\" tracking_level=\\\"0\\\">\\\n        <b>1</b>\\\n        <f>96953204</f>\\\n        <g>177129195</g>\\\n        <l>1</l>\\\n        <m>5627</m>\\\n        <n>23010</n>\\\n        <o>7419</o>\\\n        <p>16212</p>\\\n        <q>4086</q>\\\n        <r>2749</r>\\\n        <c>-33</c>\\\n        <s>124</s>\\\n        <t>28</t>\\\n        <u>32225</u>\\\n        <v>17543</v>\\\n        <w>0.84431422</w>\\\n        <x>1.0170664757130923</x>\\\n        <y>tjbx</y>\\\n        <z>cuwjentqpkejp</z>\\\n    </a>\\\n    </boost_serialization>\\\n    \";\n    \n    // Send the UCS4_data back out, converting to UTF-8\n    std::size_t l = std::wcslen(test3_data);\n    {\n        std::wofstream ofs;\n        ofs.imbue(*utf8_locale);\n        ofs.open(\"test3.dat\");\n        std::copy(\n            test3_data,\n            test3_data + l,\n            boost::archive::iterators::ostream_iterator<wchar_t>(ofs)\n        );\n    }\n\n    // Make sure that both files are the same\n    {\n        std::wifstream ifs;\n        ifs.imbue(*utf8_locale);\n        ifs.open(\"test3.dat\");\n        BOOST_CHECK(\n            std::equal(\n                test3_data,\n                test3_data + l,\n                boost::archive::iterators::istream_iterator<wchar_t>(ifs)\n            )\n        );\n    }\n\n    delete utf8_locale;\n    return EXIT_SUCCESS;\n}\n"
  },
  {
    "path": "performance/performance_vector.cpp",
    "content": "/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// test_vector.cpp\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com . \n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n// should pass compilation and execution\n\n#include <fstream>\n\n#include <cstdio> // remove\n#include <boost/config.hpp>\n#if defined(BOOST_NO_STDC_NAMESPACE)\nnamespace std{ \n    using ::remove;\n}\n#endif\n\n#include \"../test/test_tools.hpp\"\n#include <boost/preprocessor/stringize.hpp>\n// #include <boost/preprocessor/cat.hpp>\n// the following fails with (only!) gcc 3.4 \n// #include BOOST_PP_STRINGIZE(BOOST_PP_CAT(../test/,BOOST_ARCHIVE_TEST))\n// just copy over the files from the test directory\n#include BOOST_PP_STRINGIZE(BOOST_ARCHIVE_TEST)\n#include <boost/serialization/vector.hpp>\n\n#include \"../test/A.hpp\"\n\ntemplate <class T>\nint test_vector(T)\n{\n    const char * testfile = boost::archive::tmpnam(NULL);\n    BOOST_REQUIRE(NULL != testfile);\n\n    // test array of objects\n    std::vector<T> avector;\n    avector.push_back(T());\n    avector.push_back(T());\n    {   \n        test_ostream os(testfile, TEST_STREAM_FLAGS);\n        test_oarchive oa(os, TEST_ARCHIVE_FLAGS);\n        oa << boost::serialization::make_nvp(\"avector\", avector);\n    }\n    std::vector<T> avector1;\n    {\n        test_istream is(testfile, TEST_STREAM_FLAGS);\n        test_iarchive ia(is, TEST_ARCHIVE_FLAGS);\n        ia >> boost::serialization::make_nvp(\"avector\", avector1);\n    }\n    BOOST_CHECK(avector == avector1);\n    std::remove(testfile);\n    return EXIT_SUCCESS;\n}\n\nint test_main( int /* argc */, char* /* argv */[] )\n{\n   int res = test_vector(A());\n    // test an int vector for which optimized versions should be available\n   if (res == EXIT_SUCCESS)\n     res = test_vector(0);  \n    // test a bool vector\n   if (res == EXIT_SUCCESS)\n     res = test_vector(false);  \n   return res;\n}\n\n// EOF\n"
  },
  {
    "path": "performance/polymorphic_array_binary_archive.hpp",
    "content": "// (C) Copyright 2002-4 Robert Ramey - http://www.rrsd.com . \n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for updates, documentation, and revision history.\n#include <boost/archive/polymorphic_binary_oarchive.hpp>\ntypedef boost::archive::polymorphic_binary_oarchive test_oarchive;\ntypedef std::ofstream test_ostream;\n#include <boost/archive/polymorphic_binary_iarchive.hpp>\ntypedef boost::archive::polymorphic_binary_iarchive test_iarchive;\ntypedef std::ifstream test_istream;\n#define TEST_STREAM_FLAGS std::ios::binary\n"
  },
  {
    "path": "performance/polymorphic_binary_archive.hpp",
    "content": "// (C) Copyright 2002-4 Robert Ramey - http://www.rrsd.com . \n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for updates, documentation, and revision history.\n#include <boost/archive/polymorphic_binary_oarchive.hpp>\ntypedef boost::archive::polymorphic_binary_oarchive test_oarchive;\ntypedef std::ofstream test_ostream;\n#include <boost/archive/polymorphic_binary_iarchive.hpp>\ntypedef boost::archive::polymorphic_binary_iarchive test_iarchive;\ntypedef std::ifstream test_istream;\n#define TEST_STREAM_FLAGS std::ios::binary\n"
  },
  {
    "path": "performance/polymorphic_text_archive.hpp",
    "content": "// (C) Copyright 2002-4 Robert Ramey - http://www.rrsd.com . \n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for updates, documentation, and revision history.\n#include <boost/archive/polymorphic_text_oarchive.hpp>\ntypedef boost::archive::polymorphic_text_oarchive test_oarchive;\ntypedef std::ofstream test_ostream;\n#include <boost/archive/polymorphic_text_iarchive.hpp>\ntypedef boost::archive::polymorphic_text_iarchive test_iarchive;\ntypedef std::ifstream test_istream;\n#define TEST_STREAM_FLAGS (std::ios_base::openmode)0\n"
  },
  {
    "path": "performance/polymorphic_text_warchive.hpp",
    "content": "// (C) Copyright 2002-4 Robert Ramey - http://www.rrsd.com . \n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for updates, documentation, and revision history.\n#include <boost/config.hpp>\n#ifdef BOOST_NO_STD_WSTREAMBUF\n#error \"wide char i/o not supported on this platform\"\n#else\n#include <boost/archive/polymorphic_text_woarchive.hpp>\ntypedef boost::archive::polymorphic_text_woarchive test_oarchive;\ntypedef std::wofstream test_ostream;\n#include <boost/archive/polymorphic_text_wiarchive.hpp>\ntypedef boost::archive::polymorphic_text_wiarchive test_iarchive;\ntypedef std::wifstream test_istream;\n#define TEST_STREAM_FLAGS (std::ios_base::openmode)0\n#endif\n"
  },
  {
    "path": "performance/polymorphic_xml_archive.hpp",
    "content": "// (C) Copyright 2002-4 Robert Ramey - http://www.rrsd.com . \n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for updates, documentation, and revision history.\n#include <boost/archive/polymorphic_xml_oarchive.hpp>\ntypedef boost::archive::polymorphic_xml_oarchive test_oarchive;\ntypedef std::ofstream test_ostream;\n#include <boost/archive/polymorphic_xml_iarchive.hpp>\ntypedef boost::archive::polymorphic_xml_iarchive test_iarchive;\ntypedef std::ifstream test_istream;\n#define TEST_STREAM_FLAGS (std::ios_base::openmode)0\n"
  },
  {
    "path": "performance/polymorphic_xml_warchive.hpp",
    "content": "// (C) Copyright 2002-4 Robert Ramey - http://www.rrsd.com . \n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for updates, documentation, and revision history.\n#include <boost/archive/polymorphic_xml_woarchive.hpp>\ntypedef boost::archive::polymorphic_xml_woarchive test_oarchive;\ntypedef std::wofstream test_ostream;\n#include <boost/archive/polymorphic_xml_wiarchive.hpp>\ntypedef boost::archive::polymorphic_xml_wiarchive test_iarchive;\ntypedef std::wifstream test_istream;\n#define TEST_STREAM_FLAGS (std::ios_base::openmode)0\n"
  },
  {
    "path": "performance/portable_binary_archive.hpp",
    "content": "// (C) Copyright 2002-4 Robert Ramey - http://www.rrsd.com .\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for updates, documentation, and revision history.// file includes for testing a custom archive.\n// as an example this tests the portable binary archive\n\n// #include output archive header\n#include \"../example/portable_binary_oarchive.hpp\"\n// define output archive class to be used \ntypedef portable_binary_oarchive test_oarchive;\n// and corresponding stream\ntypedef std::ofstream test_ostream;\n\n// repeat the above for corresponding input archive\n#include \"../example/portable_binary_iarchive.hpp\"\ntypedef portable_binary_iarchive test_iarchive;\ntypedef std::ifstream test_istream;\n\n// and stream open flags\n#define TEST_STREAM_FLAGS std::ios::binary\n"
  },
  {
    "path": "performance/profile.sh",
    "content": "# build and run the tests leaving the executables in place\n\n# (C) Copyright 2002 Robert Ramey - http://www.rrsd.com . \n# Use, modification and distribution is subject to the Boost Software\n# License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n# http://www.boost.org/LICENSE_1_0.txt)\n\n# profile.sh --toolset=gcc preserve-test-targets=on variant=profile\nif test $# -eq 0\nthen\n    echo \"Usage: $0 <bjam arguments>\"\n    echo \"Typical bjam arguments are:\"\n    echo \"  toolset=msvc-7.1,gcc\"\n    echo \"  link=static,shared\"\n    echo \"  threading=single,multi\"\n    echo \"  -sBOOST_ARCHIVE_LIST=<archive name>\"\nelse\n    b2 --dump-tests variant=profile preserve-test-targets=on $@ >b2.log 2>&1\n    process_jam_log --v2 <b2ls.log\n\n    # for each test directory\n\n    for dir in                                                             \\\n        ../../../bin.v2/libs/serialization/performance/*/gcc*/profile   \\\n        ../../../bin.v2/libs/serialization/performance/*/gcc*/*/profile\n    do\n        # execute test\n        for exe in $dir/*.exe\n        do\n            # execute the test\n            echo executing $exe\n            $exe\n            # copy profile to test directory\n            gprof $exe gmon.out >$dir/profile.txt\n        done\n    done\n\n    library_status library_status.html links.html\nfi\n"
  },
  {
    "path": "performance/text_archive.hpp",
    "content": "// (C) Copyright 2002-4 Robert Ramey - http://www.rrsd.com . \n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for updates, documentation, and revision history.\n// text_archive\n#include <boost/archive/text_oarchive.hpp>\ntypedef boost::archive::text_oarchive test_oarchive;\ntypedef std::ofstream test_ostream;\n#include <boost/archive/text_iarchive.hpp>\ntypedef boost::archive::text_iarchive test_iarchive;\ntypedef std::ifstream test_istream;\n#define TEST_STREAM_FLAGS (std::ios_base::openmode)0\n"
  },
  {
    "path": "performance/text_warchive.hpp",
    "content": "// (C) Copyright 2002-4 Robert Ramey - http://www.rrsd.com . \n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for updates, documentation, and revision history.\n// text_warchive\n#include <boost/archive/text_woarchive.hpp>\ntypedef boost::archive::text_woarchive test_oarchive;\ntypedef std::wofstream test_ostream;\n#include <boost/archive/text_wiarchive.hpp>\ntypedef boost::archive::text_wiarchive test_iarchive;\ntypedef std::wifstream test_istream;\n#define TEST_STREAM_FLAGS (std::ios_base::openmode)0\n\n\n\n\n\n"
  },
  {
    "path": "performance/xml/Jamfile.v2",
    "content": "################################################################################\n#\n# (C) Copyright 2010 Bryce Lelbach\n#\n# Use, modification and distribution is subject to the Boost Software License,\n# Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at \n# http://www.boost.org/LICENSE_1_0.txt)\n#\n################################################################################\n\nproject bsl-xml-benchmark ;\n\nexe int4_test      : int4_test.cpp  \n                   : <toolset>gcc:<linkflags>\"-lrt -lboost_serialization\" ;\n\nexe int16_test     : int16_test.cpp  \n                   : <toolset>gcc:<linkflags>\"-lrt -lboost_serialization\" ;\n\nexe int64_test     : int64_test.cpp  \n                   : <toolset>gcc:<linkflags>\"-lrt -lboost_serialization\" ;\n\nexe int256_test    : int256_test.cpp  \n                   : <toolset>gcc:<linkflags>\"-lrt -lboost_serialization\" ;\n\nexe string4_test   : string4_test.cpp  \n                   : <toolset>gcc:<linkflags>\"-lrt -lboost_serialization\" ;\n\nexe string16_test  : string16_test.cpp  \n                   : <toolset>gcc:<linkflags>\"-lrt -lboost_serialization\" ;\n\nexe string64_test  : string64_test.cpp  \n                   : <toolset>gcc:<linkflags>\"-lrt -lboost_serialization\" ;\n\nexe string256_test : string256_test.cpp  \n                   : <toolset>gcc:<linkflags>\"-lrt -lboost_serialization\" ;\n"
  },
  {
    "path": "performance/xml/harness.hpp",
    "content": "/* /libs/serialization/xml_performance/harness.hpp *****************************\n\n(C) Copyright 2010 Bryce Lelbach\n\nUse, modification and distribution is subject to the Boost Software License,\nVersion 1.0. (See accompanying file LICENSE_1_0.txt or copy at \nhttp://www.boost.org/LICENSE_1_0.txt)\n\n*******************************************************************************/\n\n#if !defined(BOOST_SERIALIZATION_XML_PERFORMANCE_HARNESS_HPP)\n#define BOOST_SERIALIZATION_XML_PERFORMANCE_HARNESS_HPP\n\n// MS compatible compilers support #pragma once\n#if defined(_MSC_VER)\n  # pragma once\n#endif\n\n#include <cassert>\n#include <cstdio> \n\n#include <string>\n#include <fstream>\n#include <iostream>\n#include <utility>\n\n#include <boost/config.hpp>\n\n#if defined(BOOST_NO_STDC_NAMESPACE)\n  namespace std { \n    using ::remove;\n  }\n#endif \n\n#include <boost/uuid/uuid.hpp>\n#include <boost/uuid/uuid_io.hpp>\n#include <boost/uuid/random_generator.hpp>\n\n#include <boost/functional/hash.hpp>\n\n#include <boost/utility/enable_if.hpp>\n\n#include <boost/type_traits/is_integral.hpp>\n\n#include <boost/archive/xml_iarchive.hpp>\n#include <boost/archive/xml_oarchive.hpp>\n\n#include <boost/archive/archive_exception.hpp>\n\n#include \"high_resolution_timer.hpp\" // from /libs/spirit/optimization\n\n#include \"node.hpp\" // includes macro.hpp\n\nnamespace boost {\nnamespace archive {\nnamespace xml {\n\ntemplate<typename T> T random (void);\n\ntemplate<typename T> T\nrandom (void) {\n  using namespace boost::uuids;\n\n  hash<uuid> hash;\n  basic_random_generator<mt19937> gen;\n\n  return hash(gen());\n}\n\ntemplate<> std::string\nrandom<std::string> (void) {\n  using namespace boost::uuids;\n\n  basic_random_generator<mt19937> gen;\n  uuid u = gen();\n\n  return to_string(u);\n}\n\ntemplate<typename T> std::string\nsave_archive (T const& s) {\n  std::string fn = random<std::string>() +\n    \"-\" BOOST_PP_STRINGIZE(BSL_TYPE)\n    BOOST_PP_STRINGIZE(BSL_EXP(BSL_NODE_MAX, BSL_DEPTH))\n    \".xml\"\n  ;\n\n  std::ofstream ofs(fn.c_str());\n \n  assert(ofs.good());\n  \n  xml_oarchive oa(ofs);\n  oa << BOOST_SERIALIZATION_NVP(s);\n\n  ofs.close();\n  return fn;\n}\n\ntemplate<typename T> std::pair<double, T>\nrestore_archive (std::string fn) {\n  std::ifstream ifs(fn.c_str());\n  T s;\n\n  assert(ifs.good());\n  \n  high_resolution_timer u;\n  \n  xml_iarchive ia(ifs);\n  ia >> BOOST_SERIALIZATION_NVP(s);\n\n  ifs.close();\n  return std::pair<double, T>(u.elapsed(), s);\n}\n\nclass result_set_exception: public virtual archive_exception {\n public:\n  enum exception_code {\n    invalid_archive_metadata\n  };\n\n  result_set_exception (exception_code c = invalid_archive_metadata){ }\n  \n  virtual const char* what() const throw() {\n    const char *msg = \"\";\n    \n    switch (code) {\n      case invalid_archive_metadata:\n        msg = \"result set was not created on this system\";\n      default:\n        archive_exception::what();\n    }\n    \n    return msg;\n  }\n};\n\nstruct entry {\n  std::string type;\n  std::size_t size;\n  double      data;\n\n  template<class ARC>\n  void serialize (ARC& ar, const unsigned int) {\n    ar & BOOST_SERIALIZATION_NVP(type)\n       & BOOST_SERIALIZATION_NVP(size)\n       & BOOST_SERIALIZATION_NVP(data)\n    ;\n  }\n\n  entry (void) { }\n\n  entry (std::string type, std::size_t size, double data):\n    type(type), size(size), data(data) { }\n};\n\nstruct result_set {\n  std::string      compiler;\n  std::string      platform;\n  std::list<entry> entries;\n\n  template<class ARC>\n  void serialize (ARC& ar, const unsigned int) {\n    ar & BOOST_SERIALIZATION_NVP(compiler)\n       & BOOST_SERIALIZATION_NVP(platform)\n       & BOOST_SERIALIZATION_NVP(entries)\n    ;\n\n    if (  (compiler != BOOST_COMPILER)\n       || (platform != BOOST_PLATFORM))\n         throw result_set_exception(); \n  }\n\n  result_set (void):\n    compiler(BOOST_COMPILER),\n    platform(BOOST_PLATFORM) { }\n\n  result_set (std::list<entry> entries):\n    compiler(BOOST_COMPILER),\n    platform(BOOST_PLATFORM),\n    entries(entries) { }\n};\n\n} // xml\n} // archive\n} // boost\n\n#endif // BOOST_SERIALIZATION_XML_PERFORMANCE_HARNESS_HPP\n\n"
  },
  {
    "path": "performance/xml/high_resolution_timer.hpp",
    "content": "//  Copyright (c) 2005-2010 Hartmut Kaiser\n//  Copyright (c) 2009      Edward Grace\n// \n//  Distributed under the Boost Software License, Version 1.0. (See accompanying \n//  file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n#if !defined(HIGH_RESOLUTION_TIMER_MAR_24_2008_1222PM)\n#define HIGH_RESOLUTION_TIMER_MAR_24_2008_1222PM\n\n#include <boost/config.hpp>\n#include <boost/throw_exception.hpp>\n\n#if defined(BOOST_HAS_UNISTD_H)\n#include <unistd.h>\n#endif\n#include <time.h>\n#include <stdexcept>\n#include <limits>\n\n#if defined(BOOST_WINDOWS)\n\n#include <windows.h>\n\nnamespace boost {\nnamespace archive {\nnamespace xml {\n    ///////////////////////////////////////////////////////////////////////////////\n    //\n    //  high_resolution_timer \n    //      A timer object measures elapsed time.\n    //      CAUTION: Windows only!\n    //\n    ///////////////////////////////////////////////////////////////////////////////\n    class high_resolution_timer\n    {\n    public:\n        high_resolution_timer() \n        {\n            restart(); \n        } \n\n        high_resolution_timer(double t) \n        {\n            LARGE_INTEGER frequency;\n            if (!QueryPerformanceFrequency(&frequency))\n                boost::throw_exception(std::runtime_error(\"Couldn't acquire frequency\"));\n\n            start_time.QuadPart = (LONGLONG)(t * frequency.QuadPart); \n        } \n\n        high_resolution_timer(high_resolution_timer const& rhs) \n          : start_time(rhs.start_time)\n        {\n        } \n\n        static double now()\n        {\n            SYSTEMTIME st;\n            GetSystemTime(&st);\n\n            FILETIME ft;\n            SystemTimeToFileTime(&st, &ft);\n\n            LARGE_INTEGER now;\n            now.LowPart = ft.dwLowDateTime;\n            now.HighPart = ft.dwHighDateTime;\n\n            // FileTime is in 100ns increments, result needs to be in [s]\n            return now.QuadPart * 1e-7;\n        }\n\n        void restart() \n        { \n            if (!QueryPerformanceCounter(&start_time))\n                boost::throw_exception(std::runtime_error(\"Couldn't initialize start_time\"));\n        } \n        double elapsed() const                  // return elapsed time in seconds\n        { \n            LARGE_INTEGER now;\n            if (!QueryPerformanceCounter(&now))\n                boost::throw_exception(std::runtime_error(\"Couldn't get current time\"));\n\n            LARGE_INTEGER frequency;\n            if (!QueryPerformanceFrequency(&frequency))\n                boost::throw_exception(std::runtime_error(\"Couldn't acquire frequency\"));\n\n            return double(now.QuadPart - start_time.QuadPart) / frequency.QuadPart;\n        }\n\n        double elapsed_max() const   // return estimated maximum value for elapsed()\n        {\n            LARGE_INTEGER frequency;\n            if (!QueryPerformanceFrequency(&frequency))\n                boost::throw_exception(std::runtime_error(\"Couldn't acquire frequency\"));\n\n            return double((std::numeric_limits<LONGLONG>::max)() - start_time.QuadPart) / \n                double(frequency.QuadPart); \n        }\n\n        double elapsed_min() const            // return minimum value for elapsed()\n        { \n            LARGE_INTEGER frequency;\n            if (!QueryPerformanceFrequency(&frequency))\n                boost::throw_exception(std::runtime_error(\"Couldn't acquire frequency\"));\n\n            return 1.0 / frequency.QuadPart; \n        }\n\n    private:\n        LARGE_INTEGER start_time;\n    }; \n\n} // xml\n} // archive\n} // boost\n\n#elif defined(_POSIX_TIMERS) && _POSIX_TIMERS > 0 && defined(_POSIX_THREAD_CPUTIME)\n\n#if _POSIX_THREAD_CPUTIME > 0   // timer always supported\n\nnamespace boost {\nnamespace archive {\nnamespace xml {\n\n    ///////////////////////////////////////////////////////////////////////////////\n    //\n    //  high_resolution_timer \n    //      A timer object measures elapsed time.\n    //\n    ///////////////////////////////////////////////////////////////////////////////\n    class high_resolution_timer\n    {\n    public:\n        high_resolution_timer() \n        {\n            start_time.tv_sec = 0;\n            start_time.tv_nsec = 0;\n\n            restart(); \n        } \n\n        high_resolution_timer(double t) \n        {\n            start_time.tv_sec = time_t(t);\n            start_time.tv_nsec = (t - start_time.tv_sec) * 1e9;\n        }\n\n        high_resolution_timer(high_resolution_timer const& rhs) \n          : start_time(rhs.start_time)\n        {\n        } \n\n        static double now()\n        {\n            timespec now;\n            if (-1 == clock_gettime(CLOCK_REALTIME, &now))\n                boost::throw_exception(std::runtime_error(\"Couldn't get current time\"));\n            return double(now.tv_sec) + double(now.tv_nsec) * 1e-9;\n        }\n\n        void restart() \n        { \n            if (-1 == clock_gettime(CLOCK_REALTIME, &start_time))\n                boost::throw_exception(std::runtime_error(\"Couldn't initialize start_time\"));\n        } \n        double elapsed() const                  // return elapsed time in seconds\n        { \n            timespec now;\n            if (-1 == clock_gettime(CLOCK_REALTIME, &now))\n                boost::throw_exception(std::runtime_error(\"Couldn't get current time\"));\n\n            if (now.tv_sec == start_time.tv_sec)\n                return double(now.tv_nsec - start_time.tv_nsec) * 1e-9;\n\n            return double(now.tv_sec - start_time.tv_sec) + \n                (double(now.tv_nsec - start_time.tv_nsec) * 1e-9);\n        }\n\n        double elapsed_max() const   // return estimated maximum value for elapsed()\n        {\n            return double((std::numeric_limits<time_t>::max)() - start_time.tv_sec); \n        }\n\n        double elapsed_min() const            // return minimum value for elapsed()\n        { \n            timespec resolution;\n            if (-1 == clock_getres(CLOCK_REALTIME, &resolution))\n                boost::throw_exception(std::runtime_error(\"Couldn't get resolution\"));\n            return double(resolution.tv_sec + resolution.tv_nsec * 1e-9); \n        }\n\n    private:\n        timespec start_time;\n    }; \n\n} // xml\n} // archive\n} // boost\n\n#else   // _POSIX_THREAD_CPUTIME > 0\n\n#include <boost/timer.hpp>\n\n// availability of high performance timers must be checked at runtime\nnamespace boost {\nnamespace archive {\nnamespace xml {\n    ///////////////////////////////////////////////////////////////////////////////\n    //\n    //  high_resolution_timer \n    //      A timer object measures elapsed time.\n    //\n    ///////////////////////////////////////////////////////////////////////////////\n    class high_resolution_timer\n    {\n    public:\n        high_resolution_timer() \n          : use_backup(sysconf(_SC_THREAD_CPUTIME) <= 0)\n        {\n            if (!use_backup) {\n                start_time.tv_sec = 0;\n                start_time.tv_nsec = 0;\n            }\n            restart(); \n        } \n\n        high_resolution_timer(double t) \n          : use_backup(sysconf(_SC_THREAD_CPUTIME) <= 0)\n        {\n            if (!use_backup) {\n                start_time.tv_sec = time_t(t);\n                start_time.tv_nsec = (t - start_time.tv_sec) * 1e9;\n            }\n        }\n        \n        high_resolution_timer(high_resolution_timer const& rhs) \n          : use_backup(sysconf(_SC_THREAD_CPUTIME) <= 0),\n            start_time(rhs.start_time)\n        {\n        } \n\n        static double now()\n        {\n            if (sysconf(_SC_THREAD_CPUTIME) <= 0)\n                return double(std::clock());\n\n            timespec now;\n            if (-1 == clock_gettime(CLOCK_REALTIME, &now))\n                boost::throw_exception(std::runtime_error(\"Couldn't get current time\"));\n            return double(now.tv_sec) + double(now.tv_nsec) * 1e-9;\n        }\n\n        void restart() \n        { \n            if (use_backup)\n                start_time_backup.restart();\n            else if (-1 == clock_gettime(CLOCK_REALTIME, &start_time))\n                boost::throw_exception(std::runtime_error(\"Couldn't initialize start_time\"));\n        } \n        double elapsed() const                  // return elapsed time in seconds\n        { \n            if (use_backup)\n                return start_time_backup.elapsed();\n\n            timespec now;\n            if (-1 == clock_gettime(CLOCK_REALTIME, &now))\n                boost::throw_exception(std::runtime_error(\"Couldn't get current time\"));\n\n            if (now.tv_sec == start_time.tv_sec)\n                return double(now.tv_nsec - start_time.tv_nsec) * 1e-9;\n                \n            return double(now.tv_sec - start_time.tv_sec) + \n                (double(now.tv_nsec - start_time.tv_nsec) * 1e-9);\n        }\n\n        double elapsed_max() const   // return estimated maximum value for elapsed()\n        {\n            if (use_backup)\n                start_time_backup.elapsed_max();\n\n            return double((std::numeric_limits<time_t>::max)() - start_time.tv_sec); \n        }\n\n        double elapsed_min() const            // return minimum value for elapsed()\n        { \n            if (use_backup)\n                start_time_backup.elapsed_min();\n\n            timespec resolution;\n            if (-1 == clock_getres(CLOCK_REALTIME, &resolution))\n                boost::throw_exception(std::runtime_error(\"Couldn't get resolution\"));\n            return double(resolution.tv_sec + resolution.tv_nsec * 1e-9); \n        }\n\n    private:\n        bool use_backup;\n        timespec start_time;\n        boost::timer start_time_backup;\n    }; \n\n} // xml\n} // archive\n} // boost\n\n#endif  // _POSIX_THREAD_CPUTIME > 0\n\n#else   //  !defined(BOOST_WINDOWS) && (!defined(_POSIX_TIMERS)\n        //      || _POSIX_TIMERS <= 0\n        //      || !defined(_POSIX_THREAD_CPUTIME)\n        //      || _POSIX_THREAD_CPUTIME <= 0)\n\n#if defined(BOOST_HAS_GETTIMEOFDAY)\n\n// For platforms that do not support _POSIX_TIMERS but do have\n// GETTIMEOFDAY, which is still preferable to std::clock()\n#include <sys/time.h>\n\nnamespace boost {\nnamespace archive {\nnamespace xml {\n\n    ///////////////////////////////////////////////////////////////////////////\n    //\n    //  high_resolution_timer \n    //      A timer object measures elapsed time.\n    //\n    //  Implemented with gettimeofday() for platforms that support it,\n    //  such as Darwin (OS X) but do not support the previous options.\n    //\n    //  Copyright (c) 2009 Edward Grace\n    //\n    ///////////////////////////////////////////////////////////////////////////\n    class high_resolution_timer\n    {\n    private:\n        template <typename U>\n        static inline double unsigned_diff(const U &a, const U &b)\n        {\n            if (a > b)\n                return static_cast<double>(a-b);\n            return -static_cast<double>(b-a);\n        }\n\n        // @brief Return the difference between two timeval types.\n        // \n        // @param t1 The most recent timeval.\n        // @param t0 The historical timeval.\n        // \n        // @return The difference between the two in seconds.\n        double elapsed(const timeval &t1, const timeval &t0) const\n        { \n            if (t1.tv_sec == t0.tv_sec)\n                return unsigned_diff(t1.tv_usec,t0.tv_usec) * 1e-6;\n\n            // We do it this way as the result of the difference of the\n            // microseconds can be negative if the clock is implemented so\n            // that the seconds timer increases in large steps.\n            //\n            // Naive subtraction of the unsigned types and conversion to\n            // double can wreak havoc!\n            return unsigned_diff(t1.tv_sec,t0.tv_sec) + \n                unsigned_diff(t1.tv_usec,t0.tv_usec) * 1e-6; \n        }\n\n    public:\n        high_resolution_timer() \n        {\n            start_time.tv_sec = 0;\n            start_time.tv_usec = 0;\n\n            restart(); \n        } \n\n        high_resolution_timer(double t) \n        {\n            start_time.tv_sec = time_t(t);\n            start_time.tv_usec = (t - start_time.tv_sec) * 1e6;\n        }\n\n        high_resolution_timer(high_resolution_timer const& rhs) \n          : start_time(rhs.start_time)\n        {\n        } \n\n        static double now()\n        {\n            // Under some implementations gettimeofday() will always\n            // return zero. If it returns anything else however then\n            // we accept this as evidence of an error.  Note we are\n            // not assuming that -1 explicitly indicates the error\n            // condition, just that non zero is indicative of the\n            // error.\n            timeval now;\n            if (gettimeofday(&now, NULL))\n                boost::throw_exception(std::runtime_error(\"Couldn't get current time\"));\n            return double(now.tv_sec) + double(now.tv_usec) * 1e-6;\n        }\n\n        void restart() \n        { \n            if (gettimeofday(&start_time, NULL))\n                boost::throw_exception(std::runtime_error(\"Couldn't initialize start_time\"));\n        } \n\n        double elapsed() const                  // return elapsed time in seconds\n        { \n            timeval now;\n            if (gettimeofday(&now, NULL))\n                boost::throw_exception(std::runtime_error(\"Couldn't get current time\"));\n            return elapsed(now,start_time);\n        }\n\n        double elapsed_max() const   // return estimated maximum value for elapsed()\n        {\n            return double((std::numeric_limits<time_t>::max)() - start_time.tv_sec); \n        }\n\n        double elapsed_min() const            // return minimum value for elapsed()\n        { \n            // On systems without an explicit clock_getres or similar\n            // we can only estimate an upper bound on the resolution\n            // by repeatedly calling the gettimeofday function.  This\n            // is often likely to be indicative of the true\n            // resolution.\n            timeval t0, t1;\n            double delta(0);\n\n            if (gettimeofday(&t0, NULL)) \n                boost::throw_exception(std::runtime_error(\"Couldn't get resolution.\"));\n\n            // Spin around in a tight loop until we observe a change\n            // in the reported timer value.\n            do {\n                if (gettimeofday(&t1, NULL)) \n                    boost::throw_exception(std::runtime_error(\"Couldn't get resolution.\"));\n                delta = elapsed(t1, t0);\n            } while (delta <= 0.0);\n\n            return delta;\n        }\n\n    private:\n        timeval start_time;\n    }; \n\n} // xml\n} // archive\n} // boost\n\n#else // BOOST_HAS_GETTIMEOFDAY\n\n//  For platforms other than Windows or Linux, or not implementing gettimeofday\n//  simply fall back to boost::timer\n#include <boost/timer.hpp>\n\nnamespace boost {\nnamespace archive {\nnamespace xml {\n\n    struct high_resolution_timer\n        : boost::timer\n    {\n        static double now()\n        {\n            return double(std::clock());\n        }\n    };\n\n} // xml\n} // archive\n} // boost\n \n\n#endif\n\n#endif\n\n#endif  // HIGH_RESOLUTION_TIMER_AUG_14_2009_0425PM\n\n//\n// $Log: high_resolution_timer.hpp,v $\n// Revision 1.4  2009/08/14 15:28:10  graceej\n// * It is entirely possible for the updating clock to increment the\n// * seconds and *decrement* the microseconds field.  Consequently\n// * when subtracting these unsigned microseconds fields a wrap-around\n// * error can occur.  For this reason elapsed(t1, t0) is used in a\n// * similar manner to cycle.h this preserves the sign of the\n// * difference.\n//\n"
  },
  {
    "path": "performance/xml/int16_results.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\" ?>\n<!DOCTYPE boost_serialization>\n<boost_serialization signature=\"serialization::archive\" version=\"8\">\n<results class_id=\"0\" tracking_level=\"0\" version=\"0\">\n\t<compiler>GNU C++ version 4.5.1 20100617 (prerelease)</compiler>\n\t<platform>linux</platform>\n\t<entries class_id=\"1\" tracking_level=\"0\" version=\"0\">\n\t\t<count>256</count>\n\t\t<item_version>0</item_version>\n\t\t<item class_id=\"2\" tracking_level=\"0\" version=\"0\">\n\t\t\t<type>int</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0091240829999999998</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0039804419999999998</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.003975363</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0041283230000000006</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.003973201</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0039916819999999999</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0039507209999999999</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.003963243</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0039550010000000005</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0039774010000000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0040641210000000004</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0040065630000000003</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0039576810000000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0039339209999999999</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0039280410000000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0039456830000000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0039237630000000003</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0039022810000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0039720409999999999</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0039302410000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0040139630000000006</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.003958441</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0039454820000000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.003940921</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0039098830000000003</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0039246010000000007</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0039138010000000006</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0039268810000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0039260830000000004</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0039660830000000005</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0039050410000000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0039309610000000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0039204830000000006</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0039173630000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0039208010000000007</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0039189620000000007</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0039035220000000004</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0039350030000000003</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0039948810000000005</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0039946010000000004</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0039224820000000006</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0039112830000000006</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.00392612</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0039826410000000003</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0039312010000000005</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.003906283</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0040008029999999998</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0039259610000000004</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0039096820000000003</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0039164009999999999</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0039059230000000004</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0039398410000000003</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0039865610000000004</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0039256410000000005</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0039788829999999999</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0040020799999999999</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0039252410000000003</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0039988810000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0039786029999999998</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0039644430000000007</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0039585210000000004</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0039494420000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0039636020000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0039696430000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0039952010000000003</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0039923210000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.003981081</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0039232429999999999</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0039772010000000005</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0040404009999999999</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0039756820000000003</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0039785230000000003</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0040130030000000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0039342810000000004</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0039185610000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.003929002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0039356030000000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0039261210000000003</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0039248010000000003</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0039206010000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.003921323</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0039623610000000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0039768010000000003</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0039882810000000006</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0039450430000000005</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0039181229999999999</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0039785210000000005</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0039770420000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.003920242</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0040526030000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0039671610000000003</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0039684009999999999</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.003951001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0039216429999999998</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0039896410000000004</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0039810010000000005</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0039498020000000005</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0039298430000000006</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0039901630000000006</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0039274410000000003</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0039447610000000006</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0039199630000000003</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.003965283</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.004002121</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0040376020000000004</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.003977202</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0039340830000000005</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0039951610000000005</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.003941361</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0039718420000000006</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0039271230000000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0039771630000000006</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0039450810000000005</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0039788410000000003</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.003906563</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0039912430000000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0039290410000000003</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0040306020000000003</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0039789200000000004</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0039774830000000004</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0039634810000000005</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0039378010000000003</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0039205619999999998</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0039250830000000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0039660609999999999</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0039749609999999999</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.003934402</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0039190830000000003</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0039127229999999999</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0039247610000000006</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0039810010000000005</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0039310410000000006</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0039226830000000006</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0039676010000000003</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0039205200000000003</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0039862420000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0039284430000000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.00398292</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0039506810000000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0040586010000000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0039792030000000006</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0040032829999999998</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0039780409999999999</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0039807620000000005</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0039528810000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0039343630000000006</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0039706810000000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0039614810000000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0039668810000000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0040543630000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0039853600000000003</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0039722410000000005</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0040198410000000006</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0039786029999999998</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0039824430000000004</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0039788010000000006</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0039784420000000004</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0039569219999999999</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0039798429999999829</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.003989561</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0039734410000000003</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.003959522</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0039615230000000006</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0039729209999999999</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0040494010000000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.003996561</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0039343630000000006</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0039701229999999999</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0039064010000000003</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0039213620000000003</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0039636419999999999</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0039354030000000005</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0039401610000000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.003979481</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0039353210000000003</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0039471230000000003</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0039845210000000004</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0040990010000000006</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0039887210000000006</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0039748830000000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0039555630000000005</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0039723610000000006</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0039555220000000004</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0039587630000000006</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0039941630000000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0039804410000000004</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0039180810000000003</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0039247220000000003</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0039286830000000005</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.003925001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0039934810000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.003982602</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0039627230000000005</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0039693430000000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.003979481</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0039772420000000006</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0039774830000000004</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0039840029999999999</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0039316810000000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0039705210000000003</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0040028810000000007</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0039730830000000005</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0040140410000000003</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0039439610000000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0039728410000000004</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0039775629999999999</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0039797600000000006</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0039672409999999998</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.003991802</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0039799230000000007</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0040010829999999999</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0039361209999999999</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0039165210000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0040524020000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0039798030000000005</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.003964721</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0039675610000000005</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0040526010000000003</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0039617630000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0040681210000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0039866010000000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0039520010000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0039534430000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0039646030000000006</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0039686809999999999</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0039310810000000003</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0039799610000000006</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0039404429999999602</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0040029610000000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.003971161</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0039470020000000007</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0039831630000000005</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.003932161</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0039708410000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0039706020000000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0039416830000000005</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0039592830000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0039440410000000006</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0039856819999999999</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0039864810000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0039909230000000004</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0039244409999999999</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0040034810000000006</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0039812010000000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0039719230000000005</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0040905210000000006</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0039932810000000004</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0039387220000000004</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0039618029999999999</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0040639630000000003</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0039436410000000003</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0039764420000000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0039905230000000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0040003629999999998</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0039767610000000005</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0039385219999999999</data>\n\t\t</item>\n\t</entries>\n</results>\n"
  },
  {
    "path": "performance/xml/int16_test.cpp",
    "content": "/* /libs/serialization/xml_performance/int25_test.cpp **************************\n\n(C) Copyright 2010 Bryce Lelbach\n\nUse, modification and distribution is subject to the Boost Software License,\nVersion 1.0. (See accompanying file LICENSE_1_0.txt or copy at \nhttp://www.boost.org/LICENSE_1_0.txt)\n\n*******************************************************************************/\n\n#define BSL_TYPE         int\n#define BSL_DEPTH        2\n#define BSL_ROUNDS       256\n#define BSL_NODE_MAX     4\n#define BSL_SAVE_TMPFILE 0\n\n#include \"harness.hpp\"\n\nBSL_MAIN\n\n"
  },
  {
    "path": "performance/xml/int256_results.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\" ?>\n<!DOCTYPE boost_serialization>\n<boost_serialization signature=\"serialization::archive\" version=\"8\">\n<results class_id=\"0\" tracking_level=\"0\" version=\"0\">\n\t<compiler>GNU C++ version 4.5.1 20100617 (prerelease)</compiler>\n\t<platform>linux</platform>\n\t<entries class_id=\"1\" tracking_level=\"0\" version=\"0\">\n\t\t<count>256</count>\n\t\t<item_version>0</item_version>\n\t\t<item class_id=\"2\" tracking_level=\"0\" version=\"0\">\n\t\t\t<type>int</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.15321624699999992</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.08650484</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.085920982000000007</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.085633820999999999</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.16989353200000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.068107577000000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.16393698700000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.151674061</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.085580072000000007</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.085237985000000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.17062496600000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.16267781100000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.16851917800000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.14782741100000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.086171551999999998</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.114132571</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.12319324500000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.110353244</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.097322675000000011</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.15796201600000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.086067782000000009</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.125855732</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.095308130999999907</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.085265061000000003</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.109543947</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.14504557000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.14939509599999989</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.082221090999999968</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.109551042</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.12431112100000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.085782263000000011</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.15682879900000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.068575454000000008</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.15049496400000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.12869196700000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.17715746300000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.13313712599999999</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.08405491100000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.16982336199999992</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.1650644779999999</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.087539541000000012</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.144009527</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.084986318000000005</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.15154921200000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.089096928999999991</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.078815780000000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.15179225900000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.071424974000000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.17383854799999998</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.15968935400000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.15121306300000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.17404088399999995</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.14575297599999992</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.147578247</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.088792417999999929</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.13412004899999996</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.086281149000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.10452476200000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.17052829600000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.12843396500000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.24160787</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.17276313100000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.08786999299999998</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.10957144100000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.18513253200000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.12825971899999999</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.14682889500000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.14917019100000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.13963762200000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.162242785</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.171921189</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.21192338600000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.16182439900000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.075873628999999998</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.091050645999999999</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.090728246000000012</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.16790991200000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.131269792</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.147774081</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.075707901000000008</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.085849350000000005</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.17120687700000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.18270776999999994</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.115657858</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.086130823000000009</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.08591346100000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.148075872</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.093777932000000008</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.170032617</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.078983854000000006</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.183002574</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.17499062400000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.16999298600000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.12343807900000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.17547888899999997</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.070078961000000009</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.184841536</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.089750393000000012</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.09077006</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.14565105699999992</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.17549457500000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.16971993600000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.086169903000000006</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.15882590900000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.087636622000000011</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.091248745000000006</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.17427003100000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.15880698700000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.131337537</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.17184867300000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.17884059400000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.18736676700000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.13111488800000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.10980652</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.20151995</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.10182866500000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.13558609700000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.085793494000000012</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.169369618</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.16526854600000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.172801116</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.170604694</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.085537078000000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.13368856099999993</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.13219763200000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.170200771</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.094924826000000004</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.086014382</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.101821225</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.11041902200000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.17392156399999992</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.14795049999999998</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.17319567400000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.177151848</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.17826678499999993</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.18706392999999999</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.097755478999999923</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.085452795000000012</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.17952716699999993</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.178897155</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.17744515400000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.18380319199999995</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.090120586000000003</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.20748273</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.121544734</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.097762067000000008</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.17140295499999991</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.17661355500000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.123409586</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.18124515800000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.17018973100000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.16837838000000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.090471122000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.18274939500000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.170376201</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.086761270000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.07082036600000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.090469033000000004</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.17457247199999992</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.085507465000000005</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.086006947</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.091171989000000009</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.087034903000000011</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.12438318900000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.091942750000000004</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.085740925000000009</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.11181491799999999</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.114592052</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.14088795500000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.11735219499999994</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.172994324</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.14173148300000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.13917877400000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.14680699700000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.10930996100000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.144352757</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.088056063000000004</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.086860233000000009</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.1702753629999999</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.086362106000000008</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.085859911000000011</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.085879831000000004</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.12267887299999991</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.098423322000000008</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.153468932</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.122094645</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.11257624400000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.160093242</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.10990803</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.16383646200000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.10992213000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.15929886000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.14134709300000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.08445474900000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.087441700000000011</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.085373326999999999</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.16715591000000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.151999576</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.17614413999999989</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.096750264000000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.085893666000000007</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.17629694000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.16497436300000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.086379006000000008</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.08848594600000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.068952251000000006</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.177542798</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.12553706100000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.15891637</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.086406062000000006</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.085517463000000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.13787316499999991</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.085759060000000012</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.156784109</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.085655992</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.100888635</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.15356141700000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.15893653900000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.17356975800000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.15669519600000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.14556728399999996</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.14882284900000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.085451261000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.144400527</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.14155816700000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.14364901800000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.16980553100000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.15952327000000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.087087096999999947</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.114074747</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.083433352000000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.109351719</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.087319604000000009</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.16535071099999998</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.085455526000000004</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.085924925999999999</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.088723519000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.11805582100000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.086636225999999983</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.075564457000000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.074940988</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.093248515000000004</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.14556818800000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.12369044300000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.14557024000000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.1763824719999999</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.14606613100000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.14864195300000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.16122792900000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.18750939500000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.159254863</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.12342580800000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.069498242000000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.068196053000000006</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.08690642400000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.083593906000000009</data>\n\t\t</item>\n\t</entries>\n</results>\n"
  },
  {
    "path": "performance/xml/int256_test.cpp",
    "content": "/* /libs/serialization/xml_performance/int25_test.cpp **************************\n\n(C) Copyright 2010 Bryce Lelbach\n\nUse, modification and distribution is subject to the Boost Software License,\nVersion 1.0. (See accompanying file LICENSE_1_0.txt or copy at \nhttp://www.boost.org/LICENSE_1_0.txt)\n\n*******************************************************************************/\n\n#define BSL_TYPE         int\n#define BSL_DEPTH        4\n#define BSL_ROUNDS       256\n#define BSL_NODE_MAX     4\n#define BSL_SAVE_TMPFILE 0\n\n#include \"harness.hpp\"\n\nBSL_MAIN\n\n"
  },
  {
    "path": "performance/xml/int4_results.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\" ?>\n<!DOCTYPE boost_serialization>\n<boost_serialization signature=\"serialization::archive\" version=\"8\">\n<results class_id=\"0\" tracking_level=\"0\" version=\"0\">\n\t<compiler>GNU C++ version 4.5.1 20100617 (prerelease)</compiler>\n\t<platform>linux</platform>\n\t<entries class_id=\"1\" tracking_level=\"0\" version=\"0\">\n\t\t<count>256</count>\n\t\t<item_version>0</item_version>\n\t\t<item class_id=\"2\" tracking_level=\"0\" version=\"0\">\n\t\t\t<type>int</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0064683200000000005</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0013484810000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0012968400000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0012938400000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.001321881</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0012813600000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0012798400000000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.00128432</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0013019210000000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0012802800000000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.00128484</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.001293043</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.00128148</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0012812800000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0012898830000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0012836800000000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.00128812</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.001305481</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.00128188</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.00129484</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0013052410000000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0012850400000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0012983600000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0012958010000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0012928400000000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0012897200000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0013186410000000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.00128724</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0012884400000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.001303963</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0012984000000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0013423600000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.00130412</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0013056810000000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.00128388</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0012844</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0012939210000000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0012815200000000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0012848800000000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0012886810000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0012767200000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0012861600000000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0012976020000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.00127812</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.00128808</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0012958430000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0012735600000000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.00129024</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0012937630000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.001314801</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.00128812</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0012858400000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.001299681</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.00128736</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0012926400000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0013075610000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0012856</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0012841200000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0013007210000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0012770400000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0012774800000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0012995630000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0012760800000000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0013167200000000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.001299803</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.00130152</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0012791600000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.00128444</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0012910810000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0012824800000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0012862000000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0012863600000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0012840400000000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0012963220000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0012926400000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.00128604</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.001302683</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0012925600000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0012863200000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0012868000000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.001301803</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0012945600000000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0012883200000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0013074010000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.00128652</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.00128524</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0013003210000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.001289</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0012887600000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0012898010000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0012779200000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.001284</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0013036830000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0012790400000000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.00128232</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0012894430000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0013535600000000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0012924400000000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.001294201</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0012804800000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.00128228</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.001305081</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0012888400000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0012826000000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0013026020000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0012876400000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0012842400000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.001301321</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0012849600000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0012959600000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0012933600000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0012845600000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0012874800000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0012894</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.001298881</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0012834000000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.00128652</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0013008010000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.00128472</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.00128644</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0012989620000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0012816000000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0012825200000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0012950820000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.00128012</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0012857600000000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.001298883</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.00127972</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0013221600000000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.001299283</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0012888000000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0012896400000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.001294601</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0012852</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0012851200000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.001312281</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0012859600000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.00139204</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.001303081</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0012967200000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0012925200000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0012986430000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0012917200000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0012922000000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.001318963</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.00128648</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.001284</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.001299641</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0014884800000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0012899600000000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0012945610000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.00128808</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.00137524</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.00129112</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0012960020000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.00127808</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0012879200000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0012991210000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.00128476</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0012820400000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.001311083</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.00136856</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0013016800000000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0012952410000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0012880000000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.00128732</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0012946000000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0013174810000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0012829200000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0012948</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.001307601</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.00128432</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0012834000000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0012954820000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.00128104</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0012853200000000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0013023630000000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.00127676</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0012791600000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.00128604</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.00127564</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0012862800000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0012893610000000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0012794400000000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0012824800000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.001308121</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0012832000000000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0012821200000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0012924810000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0012824800000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.00127892</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.001298443</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0012879600000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0012920800000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0028338400000000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0013351200000000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0013108810000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0012887600000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0012856</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0012970010000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0012761200000000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.00127644</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0012980820000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.00127684</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0012760800000000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.001297201</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.00127648</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0012804800000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0012903230000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0012802800000000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0012727600000000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0012685050000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0012786400000000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0012832400000000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0012928410000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0012786800000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0012866400000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0012979200000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0013046820000000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0012878000000000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0012865600000000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0012973220000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0012819600000000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0012832000000000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0013041630000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0012849200000000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0013826000000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0013183230000000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0012816800000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0012865600000000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0012882010000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0012740000000000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.00127808</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.001292762</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0012758000000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.00127684</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0012998010000000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0012753200000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.001276</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0012916830000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0012774800000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0012794800000000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0012958830000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0012859200000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0012798</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.001303401</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.00128304</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0012883200000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.001291761</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0012875200000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0012957600000000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.00129184</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0013144820000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0012892800000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0012874400000000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0012954830000000001</data>\n\t\t</item>\n\t</entries>\n</results>\n"
  },
  {
    "path": "performance/xml/int4_test.cpp",
    "content": "/* /libs/serialization/xml_performance/int5_test.cpp ***************************\n\n(C) Copyright 2010 Bryce Lelbach\n\nUse, modification and distribution is subject to the Boost Software License,\nVersion 1.0. (See accompanying file LICENSE_1_0.txt or copy at \nhttp://www.boost.org/LICENSE_1_0.txt)\n\n*******************************************************************************/\n\n#define BSL_TYPE         int\n#define BSL_DEPTH        1\n#define BSL_ROUNDS       256\n#define BSL_NODE_MAX     4\n#define BSL_SAVE_TMPFILE 0\n\n#include \"harness.hpp\"\n\nBSL_MAIN\n\n"
  },
  {
    "path": "performance/xml/int64_results.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\" ?>\n<!DOCTYPE boost_serialization>\n<boost_serialization signature=\"serialization::archive\" version=\"8\">\n<results class_id=\"0\" tracking_level=\"0\" version=\"0\">\n\t<compiler>GNU C++ version 4.5.1 20100617 (prerelease)</compiler>\n\t<platform>linux</platform>\n\t<entries class_id=\"1\" tracking_level=\"0\" version=\"0\">\n\t\t<count>256</count>\n\t\t<item_version>0</item_version>\n\t\t<item class_id=\"2\" tracking_level=\"0\" version=\"0\">\n\t\t\t<type>int</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.019669446</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.014487284000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.014522886</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.014541604000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.014511724</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.014433683000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.014422160000000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.014430572000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.014482052</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.014466769000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.014473404</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.014467164000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.014443046000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.014502884000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.014437164000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.014470963000000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.014436202</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.014684172000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.014476372000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.014445972000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.014496126000000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.014419045</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.014431766</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.014509245</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.014461203000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.014438964</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.014516004000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.014467052000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.014451089</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.014470532000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.014495084</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.014541806000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.014538686</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.014557006000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.014515684000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.014478643000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.014463043</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.014503089</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.014455809000000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.014486252000000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.014485492000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.014489486000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.014524406</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.014491006000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.014503724000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.014480844000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.014498644000000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.014424628</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.014758172000000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.014486449</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.014480489000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.014488966000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.014479684000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.014487846</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.014490003000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.014495404000000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.014468323000000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.014482585000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.014458649000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.014433292</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.014510932000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.014445526</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.014448486000000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.014487125000000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.014460044000000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.014419084</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.014461804000000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.014440065</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.014518092000000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.014421129000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.014449812000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.014491406</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.014498206000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.014493726</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.014491084000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.014521844000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.014434484000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.01446416</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.014464689000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.014509292000000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.014446532000000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.014462526000000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.014507046000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.014492486000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.014478405000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.014495164000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.014410804000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.014448363000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.014446089</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.014426529</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.014439369000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.014481006000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.014549005</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.014524126</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.014579886</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.014504884000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.014479804000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.014504883000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.014493212</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.01452561199999991</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.014501612000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.014468292000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.014477526000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.014580486</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.014502485000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.014492244000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.014523443</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.014456803000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.014578564</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.014513652</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.014602012000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.014517612000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.014438726000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.014636246</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.014512446000000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.014496724000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.014508804</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.014463284000000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.014476564000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.014486652000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.014519532000000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.014501529000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.014499489000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.014508846000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.014486965000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.014604445000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.014466683000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.014418044000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.014486163000000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.014435129000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.014433848999999888</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.014466412000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.014421729000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.014503366</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.014473445000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.014462526000000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.014440163000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.014511683000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.014473923000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.014486921000000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.014494692000000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.014464452000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.014510572000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.014450526000000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.014446524000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.014475006</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.014495605000000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.014441004</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.014513924000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.014508523000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.014639452000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.014492212000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.014475649</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.014522406000000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.014492246</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.014547646000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.014526446</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.014550083</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.014535804000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.014513963000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.014525052</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.014477651999999952</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.014536052000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.014505209000000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.014549046000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.014494046000000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.014543766000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.014517763000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.014560324000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.014490044000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.01452084</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.014468092</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.014456372</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.014464052000000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.014488444000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.014533046000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.014455205</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.014468363000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.014420884</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.014514723</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.014476803000000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.014691652000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.014528652000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.014488212</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.014486725000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.014492484000000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.014512206000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.014477606000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.014445083000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.014434764000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.014466163000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.014462852000000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.014470572000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.014492972000000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.014462692000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.014505326000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.014498126</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.014515127000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.014505484000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.014550483000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.014492964000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.014474105000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.014491652000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.014511252000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.014481772</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.014490206</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.014557166000000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.014467925000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.014520123000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.014490163</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.014529804</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.014479643</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.014665332000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.014451529000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.014474492</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.014458326000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.014478766000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.014512045000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.014480244000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.014506004000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.014465164000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.014486164000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.014495092000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.014493612000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.014517529000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.014456050000000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.014505726</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.014472166000000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.014522446000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.014501124000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.014496084000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.014433204000000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.015052948000000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.014451772000000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.014503892000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.014487729000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.014457845</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.014468924000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.014471005</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.014513285000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.014458324000000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.014509163</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.014488203000000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.014733972000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.014396972000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.014481252000000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.014464165000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.014463646</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.014520247000000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.014405925000000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.014428203000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.014457364</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.014505124000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.014459212000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.014439049000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>int</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.014547252</data>\n\t\t</item>\n\t</entries>\n</results>\n"
  },
  {
    "path": "performance/xml/int64_test.cpp",
    "content": "/* /libs/serialization/xml_performance/int25_test.cpp **************************\n\n(C) Copyright 2010 Bryce Lelbach\n\nUse, modification and distribution is subject to the Boost Software License,\nVersion 1.0. (See accompanying file LICENSE_1_0.txt or copy at \nhttp://www.boost.org/LICENSE_1_0.txt)\n\n*******************************************************************************/\n\n#define BSL_TYPE         int\n#define BSL_DEPTH        3\n#define BSL_ROUNDS       256\n#define BSL_NODE_MAX     4\n#define BSL_SAVE_TMPFILE 0\n\n#include \"harness.hpp\"\n\nBSL_MAIN\n\n"
  },
  {
    "path": "performance/xml/macro.hpp",
    "content": "/* /libs/serialization/xml_performance/macro.hpp *******************************\n\n(C) Copyright 2010 Bryce Lelbach\n\nUse, modification and distribution is subject to the Boost Software License,\nVersion 1.0. (See accompanying file LICENSE_1_0.txt or copy at \nhttp://www.boost.org/LICENSE_1_0.txt)\n\n*******************************************************************************/\n\n#if !defined(BOOST_SERIALIZATION_XML_PERFORMANCE_MACRO_HPP)\n#define BOOST_SERIALIZATION_XML_PERFORMANCE_MACRO_HPP\n\n#if defined(_MSC_VER)\n  #pragma once\n#endif\n\n#include <boost/preprocessor.hpp>\n\n#if !defined(BSL_NODE_MAX)\n  #define BSL_NODE_MAX 4\n#endif\n\n#if !defined(BSL_DEPTH)\n  #define BSL_DEPTH 2\n#endif\n\n#if !defined(BSL_ROUNDS)\n  #define BSL_ROUNDS 256\n#endif\n\n#if !defined(BSL_TYPE)\n  #define BSL_TYPE int\n#endif\n\n#if !defined(BSL_SAVE_TMPFILE)\n  #define BSL_SAVE_TMPFILE 0\n#endif\n\n#if !defined(BSL_RESULTS_FILE)\n  #define BSL_RESULTS_FILE                                \\\n    BOOST_PP_STRINGIZE(BSL_TYPE)                          \\\n    BOOST_PP_STRINGIZE(BSL_EXP(BSL_NODE_MAX, BSL_DEPTH))  \\\n    \"_results.xml\"                                        \\\n  /**/\n#endif\n\n// utility print macro\n\n#define BSL_PRINT(Z, N, T) T\n\n// preprocessor power function, BSL_EXP\n\n#define BSL_EXP_PRED(B, D) BOOST_PP_TUPLE_ELEM(3, 0, D)\n\n#define BSL_EXP_OP(B, D)                                                       \\\n   (                                                                           \\\n      BOOST_PP_DEC(BOOST_PP_TUPLE_ELEM(3, 0, D)),                              \\\n      BOOST_PP_TUPLE_ELEM(3, 1, D),                                            \\\n      BOOST_PP_MUL_D(                                                          \\\n         B,                                                                    \\\n         BOOST_PP_TUPLE_ELEM(3, 2, D),                                         \\\n         BOOST_PP_TUPLE_ELEM(3, 1, D)                                          \\\n      )                                                                        \\\n   )                                                                           \\\n   /**/\n\n#define BSL_EXP(X, N)                                                          \\\n  BOOST_PP_TUPLE_ELEM(                                                         \\\n    3, 2, BOOST_PP_WHILE(BSL_EXP_PRED, BSL_EXP_OP, (N, X, 1))                  \\\n  )                                                                            \\\n  /**/\n\n// boost::archive::xml::node macros\n\n#define BSL_NODE_DECL_MEMBER(Z, N, _)   T ## N  element ## N  ;\n#define BSL_NODE_DECL_NONE(Z, N, _)     unused_type  element ## N  ;\n#define BSL_NODE_xDECL_CTOR()           node (void) { }\n\n#define BSL_NODE_DECL_CTOR(P)                                                  \\\n  BOOST_PP_IF(P,                                                               \\\n    BSL_NODE_xDECL_CTOR,                                                       \\\n    BOOST_PP_EMPTY                                                             \\\n  )()                                                                          \\\n  /**/\n\n#define BSL_NODE_SERIALIZE(Z, N, _)                                            \\\n  & BOOST_SERIALIZATION_NVP(BOOST_PP_CAT(element, N))                          \\\n  /**/\n\n#define BSL_NODE_INIT_LIST(Z, N, _)                                            \\\n  BOOST_PP_COMMA_IF(N)  BOOST_PP_CAT(element, N)                               \\\n  BOOST_PP_LPAREN() BOOST_PP_CAT(p, N) BOOST_PP_RPAREN()                       \\\n  /**/\n\n#define BSL_NODE_DECL(Z, N, _)                                                 \\\n  template<BOOST_PP_ENUM_PARAMS_Z(Z, N, typename T)>                           \\\n  struct node<                                                                 \\\n    BOOST_PP_ENUM_PARAMS_Z(Z, N, T)                                            \\\n    BOOST_PP_COMMA_IF(N)                                                       \\\n    BOOST_PP_ENUM_ ## Z(BOOST_PP_SUB(BSL_NODE_MAX, N), BSL_PRINT, unused_type) \\\n  > {                                                                          \\\n    BOOST_PP_REPEAT_ ## Z(N, BSL_NODE_DECL_MEMBER, _)                          \\\n                                                                               \\\n    BOOST_PP_REPEAT_FROM_TO_ ## Z(N, BSL_NODE_MAX, BSL_NODE_DECL_NONE, _)      \\\n                                                                               \\\n    template<class ARC>                                                        \\\n    void serialize (ARC& ar, const unsigned int) {                             \\\n      ar BOOST_PP_REPEAT_ ## Z(N, BSL_NODE_SERIALIZE, _);                      \\\n    }                                                                          \\\n                                                                               \\\n    BSL_NODE_DECL_CTOR(N)                                                      \\\n                                                                               \\\n    node (BOOST_PP_ENUM_BINARY_PARAMS_Z(Z, N, T, p)):                          \\\n      BOOST_PP_REPEAT_ ## Z(N, BSL_NODE_INIT_LIST, _) { }                      \\\n  };                                                                           \\\n  /**/\n\n// instantiation macros\n\n#define BSL_INST_BASE(Z, N, L)                                                 \\\n  T0 T0 ## _ ## N(BOOST_PP_ENUM_ ## Z(                                         \\\n    BSL_NODE_MAX, BSL_PRINT,                                                   \\\n    boost::archive::xml::random<BSL_TYPE> BOOST_PP_LPAREN() BOOST_PP_RPAREN()  \\\n  ));                                                                          \\\n  /**/\n\n#define BSL_INST_yNODES(Z, N, L)                                               \\\n  BOOST_PP_COMMA_IF(N)                                                         \\\n  BOOST_PP_CAT(T,                                                              \\\n    BOOST_PP_CAT(BOOST_PP_LIST_AT(L, 1),                                       \\\n      BOOST_PP_CAT(_,                                                          \\\n        BOOST_PP_ADD(N,                                                        \\\n          BOOST_PP_LIST_AT(L, 0)                                               \\\n        )                                                                      \\\n      )                                                                        \\\n    )                                                                          \\\n  )                                                                            \\\n  /**/\n\n#define BSL_INST_xNODES(Z, N, L)                                               \\\n  T ## L T ## L ## _ ## N(                                                     \\\n    BOOST_PP_REPEAT_ ## Z(                                                     \\\n      BSL_NODE_MAX, BSL_INST_yNODES,                                           \\\n      (BOOST_PP_MUL(N, BSL_NODE_MAX), (BOOST_PP_SUB(L, 1), BOOST_PP_NIL))      \\\n    )                                                                          \\\n  );                                                                           \\\n  /**/\n\n#define BSL_INST_NODES(Z, N, L)                                                \\\n  BOOST_PP_REPEAT_ ## Z(                                                       \\\n    BSL_EXP(BSL_NODE_MAX, BOOST_PP_SUB(BSL_DEPTH, N)),                         \\\n    BSL_INST_xNODES, N                                                         \\\n  )                                                                            \\\n  /**/\n\n#define BSL_TYPEDEF_NODES(Z, N, L)                                             \\\n  typedef boost::archive::xml::node<                                           \\\n    BOOST_PP_ENUM_ ## Z(                                                       \\\n      BSL_NODE_MAX, BSL_PRINT, BOOST_PP_CAT(T, BOOST_PP_SUB(N, 1))             \\\n    )                                                                          \\\n  > T ## N;                                                                    \\\n  /**/\n\n// main macro\n\n#define BSL_MAIN                                                               \\\n  int main (void) {                                                            \\\n    using namespace boost::archive;                                            \\\n    using namespace boost::archive::xml;                                       \\\n                                                                               \\\n    typedef node<BOOST_PP_ENUM(BSL_NODE_MAX, BSL_PRINT, BSL_TYPE)> T0;         \\\n                                                                               \\\n    BOOST_PP_REPEAT_FROM_TO(1, BSL_DEPTH, BSL_TYPEDEF_NODES, _)                \\\n                                                                               \\\n    typedef node<BOOST_PP_ENUM(                                                \\\n      BSL_NODE_MAX, BSL_PRINT,                                                 \\\n      BOOST_PP_CAT(T, BOOST_PP_SUB(BSL_DEPTH, 1))                              \\\n    )> HEAD;                                                                   \\\n                                                                               \\\n    result_set results;                                                        \\\n    std::size_t rounds = BSL_ROUNDS;                                           \\\n                                                                               \\\n    while (rounds --> 0) {                                                     \\\n      BOOST_PP_REPEAT(BSL_EXP(BSL_NODE_MAX, BSL_DEPTH), BSL_INST_BASE, _)      \\\n                                                                               \\\n      BOOST_PP_REPEAT_FROM_TO(1, BSL_DEPTH, BSL_INST_NODES, _)                 \\\n                                                                               \\\n      HEAD h(BOOST_PP_ENUM_PARAMS(                                             \\\n        BSL_NODE_MAX,                                                          \\\n        BOOST_PP_CAT(T, BOOST_PP_CAT(BOOST_PP_SUB(BSL_DEPTH, 1), _))           \\\n      ));                                                                      \\\n                                                                               \\\n      std::string fn = save_archive(h);                                        \\\n                                                                               \\\n      std::pair<double, HEAD> r = restore_archive<HEAD>(fn);                   \\\n                                                                               \\\n      std::cout << \"round \"                                                    \\\n                << ((BSL_ROUNDS - 1) - rounds)                                 \\\n                << \" -> \" << fn << \"\\n\";                                       \\\n                                                                               \\\n      BOOST_PP_IF(BSL_SAVE_TMPFILE,                                            \\\n        BOOST_PP_EMPTY(),                                                      \\\n        std::remove(fn.c_str());                                               \\\n      )                                                                        \\\n                                                                               \\\n      results.entries.push_back(entry(                                         \\\n         BOOST_PP_STRINGIZE(BSL_TYPE),                                         \\\n         BSL_EXP(BSL_NODE_MAX, BSL_DEPTH), r.first                             \\\n      ));                                                                      \\\n    }                                                                          \\\n                                                                               \\\n    std::fstream fs(BSL_RESULTS_FILE, std::fstream::in);                       \\\n                                                                               \\\n    if (fs.good()) {                                                           \\\n      xml_iarchive ia(fs);                                                     \\\n      ia >> BOOST_SERIALIZATION_NVP(results);                                  \\\n      fs.close();                                                              \\\n    }                                                                          \\\n                                                                               \\\n    fs.open(BSL_RESULTS_FILE, std::fstream::out | std::fstream::trunc);        \\\n    xml_oarchive oa(fs);                                                       \\\n    oa << BOOST_SERIALIZATION_NVP(results);                                    \\\n                                                                               \\\n    fs.close();                                                                \\\n  }                                                                            \\\n  /**/\n\n#endif // BOOST_SERIALIZATION_XML_PERFORMANCE_MACRO_HPP\n"
  },
  {
    "path": "performance/xml/node.hpp",
    "content": "/* /libs/serialization/xml_performance/node.hpp ********************************\n\n(C) Copyright 2010 Bryce Lelbach\n\nUse, modification and distribution is subject to the Boost Software License,\nVersion 1.0. (See accompanying file LICENSE_1_0.txt or copy at \nhttp://www.boost.org/LICENSE_1_0.txt)\n\n*******************************************************************************/\n\n#if !defined(BOOST_SERIALIZATION_XML_PERFORMANCE_NODE_HPP)\n#define BOOST_SERIALIZATION_XML_PERFORMANCE_NODE_HPP\n\n#if defined(_MSC_VER)\n  #pragma once\n#endif\n\n#include <boost/serialization/nvp.hpp>\n#include <boost/serialization/utility.hpp>\n#include <boost/serialization/list.hpp>\n#include <boost/serialization/version.hpp>\n\n#include \"macro.hpp\"\n\nnamespace boost {\nnamespace archive {\nnamespace xml {\n\nstruct unused_type { };\n\ntemplate<\n  typename T,\n  BOOST_PP_ENUM_PARAMS_WITH_A_DEFAULT(\n    BOOST_PP_SUB(BSL_NODE_MAX, 1), typename T, unused_type\n  )\n> struct node;\n\nBOOST_PP_REPEAT_FROM_TO(1, BSL_NODE_MAX, BSL_NODE_DECL, _)\n\ntemplate<BOOST_PP_ENUM_PARAMS(BSL_NODE_MAX, typename T)>\nstruct node {\n  BOOST_PP_REPEAT(BSL_NODE_MAX, BSL_NODE_DECL_MEMBER, _)\n\n  template<class ARC>                                   \n  void serialize (ARC& ar, const unsigned int) {        \n    ar                                                  \n      BOOST_PP_REPEAT(BSL_NODE_MAX, BSL_NODE_SERIALIZE, _)        \n    ;                                                   \n  }                                                     \n                                                        \n  BSL_NODE_xDECL_CTOR()                                      \n                                                        \n  node (BOOST_PP_ENUM_BINARY_PARAMS(BSL_NODE_MAX, T, p)):     \n    BOOST_PP_REPEAT(BSL_NODE_MAX, BSL_NODE_INIT_LIST, _) \n  { }\n};                                                      \n\n} // xml\n} // archive\n} // boost\n\n#endif // BOOST_SERIALIZATION_XML_PERFORMANCE_NODE_HPP\n\n"
  },
  {
    "path": "performance/xml/string16_results.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\" ?>\n<!DOCTYPE boost_serialization>\n<boost_serialization signature=\"serialization::archive\" version=\"8\">\n<results class_id=\"0\" tracking_level=\"0\" version=\"0\">\n\t<compiler>GNU C++ version 4.5.1 20100617 (prerelease)</compiler>\n\t<platform>linux</platform>\n\t<entries class_id=\"1\" tracking_level=\"0\" version=\"0\">\n\t\t<count>256</count>\n\t\t<item_version>0</item_version>\n\t\t<item class_id=\"2\" tracking_level=\"0\" version=\"0\">\n\t\t\t<type>string</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.012478289</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0072560000000000003</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0072030420000000006</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0071682020000000003</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0071778060000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0072362460000000009</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0071869220000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0071878830000000008</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0071994860000000006</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.007244566</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0071920810000000003</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0072397640000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0071930430000000005</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0071888830000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0071856820000000005</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0071798830000000006</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0071797230000000007</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0071992860000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0072556420000000005</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0072098020000000004</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.007207321</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0072045260000000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0071889830000000004</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0071904010000000008</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0071754830000000007</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0072048060000000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0072293660000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0072043620000000006</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0072351230000000004</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0072088830000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0071613630000000005</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0071968020000000004</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0072091630000000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0071625610000000004</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0071758860000000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0072168020000000005</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0072034020000000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0071784030000000007</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0072256860000000003</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0072109220000000007</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0071665210000000003</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0072158430000000004</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0072299660000000009</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0072064680000000006</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0071831220000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0071800030000000008</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0072292860000000006</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0071624430000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0071836820000000003</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0072084030000000004</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0071665620000000005</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0072477660000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0072076020000000005</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0072072030000000006</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0072176030000000004</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0071833660000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0071831220000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0071601210000000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0072026430000000008</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0071991260000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0072078410000000004</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0072082020000000004</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0071928830000000006</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0071964460000000004</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0071826460000000009</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0071702020000000005</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0071683230000000007</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0071388030000000009</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0072348860000000003</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0071883620000000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0071758410000000005</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0071781630000000004</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0071760060000000004</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0072201620000000005</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0071673630000000004</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0071732830000000008</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0071706460000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0072266420000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0072288420000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0072125630000000008</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0072115630000000007</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0071812000000000004</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.007202122</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.007167362</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0072384060000000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0072055260000000003</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0072029620000000003</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0071922830000000007</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0071877260000000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0072153660000000008</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0072294010000000008</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0071974830000000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0071855230000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0071989230000000003</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0072465620000000007</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0071857230000000006</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0072022430000000005</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0072071660000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0072090020000000008</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0072011620000000005</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0072017610000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0071964060000000007</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0072420000000000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0071690410000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0071992430000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0071818460000000004</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0071558030000000005</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0071756420000000003</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0072259230000000004</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0071872860000000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0072312860000000008</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0072287620000000006</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0071818030000000005</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0071858810000000007</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0071967260000000005</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0071914020000000004</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0071645210000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0071816830000000003</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0071695260000000007</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0072521220000000006</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0072282020000000004</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0072272830000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0072088460000000005</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0071882650000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.007179922</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0072016430000000006</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0071915230000000009</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0072753260000000004</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0072302020000000007</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.007209923</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.007189122</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0072191260000000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0072180020000000003</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0071952810000000004</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0071876430000000005</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0071936060000000008</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0072690820000000005</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0072184420000000003</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0072203630000000005</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0071952060000000009</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0071918810000000007</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0071836420000000005</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0072154830000000008</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0071770830000000008</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0072342460000000006</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0072119220000000008</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.007218683</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0072250430000000004</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0072196860000000003</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0072206420000000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0072086820000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0072429630000000007</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0072798060000000006</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0072191220000000006</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0072123220000000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0071857230000000006</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0071828060000000008</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0071980010000000007</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0072397220000000005</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0072392030000000005</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.007219446</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0072401210000000004</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0072177220000000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0072424830000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0071834030000000005</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0072027260000000004</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0071956820000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0072182430000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0071804460000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0072502860000000008</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0072154820000000005</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0072068410000000003</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0071990430000000005</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0072062060000000006</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0072053220000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0071906030000000003</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0071940830000000004</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0072020060000000004</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0072318010000000004</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0071934820000000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0072077230000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0071936460000000006</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0071854800000000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0071955220000000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0071776030000000003</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0071916830000000008</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0072421260000000006</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.007211322</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0071732020000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0071748060000000006</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0071980060000000007</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0072117220000000003</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0072090420000000006</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0072236430000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0072546460000000009</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0071919610000000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0071797630000000005</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.007174723</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0071845260000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0071910020000000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0072310020000000003</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0072686430000000008</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0071835230000000007</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0072432400000000006</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.007220962</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0071698030000000006</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0071864460000000008</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0071785260000000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0072036020000000008</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0071802010000000006</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0071924460000000008</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0072578860000000007</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0072124820000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0072392830000000009</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0072244830000000003</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0071948460000000004</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0071743210000000009</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.007205922</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0071905630000000005</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0071846830000000007</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0072338420000000007</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0072037220000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0071850030000000006</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0071687630000000007</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0071699850000000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0071892820000000008</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0071742420000000008</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0071893660000000009</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0072221260000000006</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0071861620000000003</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0071887230000000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0071893630000000007</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0071844860000000003</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0071784010000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0072017230000000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0072007630000000006</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0072040859999998874</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0072226420000000005</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0072083620000000003</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0072103630000000009</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0071846830000000007</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0072017620000000004</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0072684820000000006</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0071865230000000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0071598460000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0072246680000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0071868820000000003</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0071647230000000004</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0072765660000000008</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0071751260000000004</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0071459620000000005</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0072247630000000004</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0071712020000000007</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0072490860000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0071670820000000008</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>16</size>\n\t\t\t<data>0.0072127220000000004</data>\n\t\t</item>\n\t</entries>\n</results>\n"
  },
  {
    "path": "performance/xml/string16_test.cpp",
    "content": "/* /libs/serialization/xml_performance/string25_test.cpp ***********************\n\n(C) Copyright 2010 Bryce Lelbach\n\nUse, modification and distribution is subject to the Boost Software License,\nVersion 1.0. (See accompanying file LICENSE_1_0.txt or copy at \nhttp://www.boost.org/LICENSE_1_0.txt)\n\n*******************************************************************************/\n\n#include <string>\n\ntypedef std::string string;\n\n#define BSL_TYPE         string\n#define BSL_DEPTH        2\n#define BSL_ROUNDS       256\n#define BSL_NODE_MAX     4\n#define BSL_SAVE_TMPFILE 0\n\n#include \"harness.hpp\"\n\nBSL_MAIN\n\n"
  },
  {
    "path": "performance/xml/string256_results.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\" ?>\n<!DOCTYPE boost_serialization>\n<boost_serialization signature=\"serialization::archive\" version=\"8\">\n<results class_id=\"0\" tracking_level=\"0\" version=\"0\">\n\t<compiler>GNU C++ version 4.5.1 20100617 (prerelease)</compiler>\n\t<platform>linux</platform>\n\t<entries class_id=\"1\" tracking_level=\"0\" version=\"0\">\n\t\t<count>256</count>\n\t\t<item_version>0</item_version>\n\t\t<item class_id=\"2\" tracking_level=\"0\" version=\"0\">\n\t\t\t<type>string</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.24082843600000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.15478449400000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.14540435600000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.14332035000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.14574748900000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.162143815</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.143199773</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.14591024800000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.148218763</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.26581049599999995</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.15119754200000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.25551917900000004</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.30426230999999992</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.23429972399999999</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.152736329</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.16095108700000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.257406205</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.21526160400000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.310253734</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.30385512799999992</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.277919476</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.15155350300000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.2247563669999999</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.311096769</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.18083700100000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.25365826600000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.146422422</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.31615557699999997</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.17431823499999999</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.30721216100000004</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.274691929</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.25493901099999999</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.24813491900000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.21902227400000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.182308211</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.14080317399999998</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.27130100700000004</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.141822905</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.234210945</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.18912357100000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.23694535000000003</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.30294369100000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.23246992800000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.15832027100000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.26319235099999994</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.147053033</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.30371506200000004</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.306945248</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.34078868499999992</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.16450026000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.353907258</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.29755154299999997</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.31086977300000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.166196543</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.29479566800000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.29576432800000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.18159834400000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.19346430100000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.15868047100000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.18001983300000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.30650560900000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.16728085300000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.28264082199999996</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.23873842499999998</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.142975195</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.306175533</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.28568148900000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.27912233200000003</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.24095708900000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.29895117200000004</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.31077380700000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.22219352000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.17159283699999994</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.18810837300000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.31016322400000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.24117843300000003</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.25069571300000004</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.35484542899999993</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.25646144200000004</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.23715143800000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.17434978100000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.22196388700000003</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.31783167000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.44040980399999996</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.18985125600000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.16910165699999991</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.22861478000000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.32245771200000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.18971205300000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.34642208599999991</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.16614582600000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.29925598899999994</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.29850647600000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.172233461</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.21215700399999993</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.21100386000000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.24862557099999993</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.16703737700000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.25782752200000003</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.26164129199999997</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.57651874200000008</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.36986256299999998</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.21878367700000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.17820567400000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.24184889000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.24552513400000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.33087374899999999</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.344138096</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.25427008900000003</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.33677569699999998</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.33239564400000005</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.29225137200000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.23854207300000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.21931018499999999</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.33166821100000005</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.33713559600000004</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.35802521499999995</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.21386164400000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.35509271800000003</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.16676263400000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.23069279500000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.33617436300000003</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.336949834</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.34125201800000005</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.33968717300000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.34125770800000005</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.32101234700000003</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.33470459899999994</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.18704252400000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.28705466900000004</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.29912810300000003</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.17272062800000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.20886833600000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.33794845900000003</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.264968284</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.26913011600000003</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.25145834900000003</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.33495682699999996</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.26798035000000003</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.24842696600000003</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.33503277800000003</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.30332787699999997</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.28991897599999999</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.33133644100000004</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.26798883300000004</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.291365229</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.34162038900000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.170376363</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.170955098</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.17217529200000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.2625844249999999</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.25749087800000003</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.214833564</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.20960021100000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.20222120200000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.28324146</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.303095801</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.31430344799999999</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.23109986400000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.20973660100000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.26268180499999999</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.34926366799999997</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.22327798399999998</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.16531669100000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.17791732599999999</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.16743454199999996</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.190363907</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.16638140000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.31061568700000003</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.29818055100000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.16645938000000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.16849109600000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.19088629400000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.233309764</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.26293923899999999</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.20451668599999995</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.18545595400000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.33442231900000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.307385672</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.23357416</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.287179342</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.20827706400000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.42202693800000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.34912425000000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.241049968</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.21442900300000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.34573371899999999</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.31089394199999998</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.26286895299999991</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.28370315699999993</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.17465668500000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.348761398</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.166838869</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.26464613599999998</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.29856266600000003</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.24585868199999994</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.27416464800000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.33280198300000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.23629951400000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.31782385300000005</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.17180628100000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.31635188200000003</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.291131843</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.19067002899999996</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.23594924</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.32661452500000004</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.228596355</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.25246959299999999</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.34272192000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.24635339900000003</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.23385871399999991</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.168213903</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.27104451799999996</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.28353989400000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.27119438400000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.31294787200000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.263878267</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.26840745700000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.19721746600000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.21171784800000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.31691192800000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.16284852300000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.206485163</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.17293324500000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.30097051599999991</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.18753556099999991</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.352919066</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.23880742000000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.21931351400000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.30510558200000004</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.306646945</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.19290866000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.31661062500000003</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.15527985900000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.21309966899999999</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.25295672000000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.31927861000000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.28013629200000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.23187213000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.241622844</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.28193659500000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.25082649800000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.21928747300000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.213718137</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.31063365000000004</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.16080174</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.30793034600000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.18621517200000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.31502906899999999</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.20341706500000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.16701237700000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.18218058300000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.31295746400000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.22039852299999996</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.16650589500000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>256</size>\n\t\t\t<data>0.30901178699999998</data>\n\t\t</item>\n\t</entries>\n</results>\n"
  },
  {
    "path": "performance/xml/string256_test.cpp",
    "content": "/* /libs/serialization/xml_performance/string25_test.cpp ***********************\n\n(C) Copyright 2010 Bryce Lelbach\n\nUse, modification and distribution is subject to the Boost Software License,\nVersion 1.0. (See accompanying file LICENSE_1_0.txt or copy at \nhttp://www.boost.org/LICENSE_1_0.txt)\n\n*******************************************************************************/\n\n#include <string>\n\ntypedef std::string string;\n\n#define BSL_TYPE         string\n#define BSL_DEPTH        4\n#define BSL_ROUNDS       256\n#define BSL_NODE_MAX     4\n#define BSL_SAVE_TMPFILE 0\n\n#include \"harness.hpp\"\n\nBSL_MAIN\n\n"
  },
  {
    "path": "performance/xml/string4_results.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\" ?>\n<!DOCTYPE boost_serialization>\n<boost_serialization signature=\"serialization::archive\" version=\"8\">\n<results class_id=\"0\" tracking_level=\"0\" version=\"0\">\n\t<compiler>GNU C++ version 4.5.1 20100617 (prerelease)</compiler>\n\t<platform>linux</platform>\n\t<entries class_id=\"1\" tracking_level=\"0\" version=\"0\">\n\t\t<count>256</count>\n\t\t<item_version>0</item_version>\n\t\t<item class_id=\"2\" tracking_level=\"0\" version=\"0\">\n\t\t\t<type>string</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0074473220000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0021171600000000003</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0021249610000000003</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0020889610000000003</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0020989610000000003</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0021022810000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0020897610000000003</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.00207932</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0020796</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.00206676</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0021010830000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0020941230000000003</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0020960029999999999</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0022728430000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0021422430000000003</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0021111599999999999</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0020897210000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0020777199999999999</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.00207756</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0020766400000000003</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0020919610000000003</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0020888820000000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0020911620000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.002101922</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.00207456</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0020878400000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0020859200000000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.002087963</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0021150030000000003</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0020946430000000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.002101323</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0020741600000000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.00207048</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0020697200000000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0020688</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0020761210000000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0021957610000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.002088922</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0020608800000000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.00207632</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0020790000000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0020759200000000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.002086563</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0020913630000000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0021061630000000003</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0021424030000000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0020861200000000003</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0020792000000000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0020831199999999999</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0020748800000000003</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0020908810000000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0020839210000000003</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0020882019999999999</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0020667200000000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0020760000000000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0020742</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0020731200000000003</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.002098721</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.002094963</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0020910030000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0021128430000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0020812000000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0020832800000000003</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0020760800000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0020872810000000003</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.002092801</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0020863209999999999</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.002081641</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0020940020000000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0020796400000000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.00207428</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0020808800000000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.002087401</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.002102881</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0020912830000000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.002095043</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0020720000000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0021351600000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0020774000000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0020770000000000003</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0020883210000000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.002102521</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0020871209999999999</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0020829210000000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0020788</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0022383620000000003</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0021013220000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0020742400000000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0020818799999999999</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.00208304</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0020769600000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0020958030000000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.002107083</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0020970430000000003</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.002090083</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0020642</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.00206924</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0020811600000000003</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0020840810000000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0020956010000000003</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0021117220000000003</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.002084762</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0020757600000000003</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0020830800000000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0020730800000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0020841200000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0021030430000000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.002085763</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0022383630000000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0021111630000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0020823600000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0020833200000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0020757200000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0020928410000000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0021011610000000003</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0020833610000000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0020972820000000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0020638800000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0020747600000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0020711200000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0020848810000000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0021020430000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.002103443</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0020883630000000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0020817600000000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0020656800000000003</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0020790000000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0020752000000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.002078641</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0020934009999999999</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0020846810000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0020884010000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.00208224</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0020734400000000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0020746000000000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0020917209999999999</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.002091561</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.002099643</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0020947230000000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0020736000000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0021564399999999999</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0021086</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0020864400000000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0020888009999999999</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0020872410000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0021153610000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0020850809999999999</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0020748800000000003</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0020727600000000003</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.00206544</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0020935610000000003</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0020951210000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0020952810000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.002109203</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0020785199999999999</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0020814800000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.00207932</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0020870800000000003</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0021083600000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0020882410000000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0020863209999999999</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0020938810000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0020698400000000003</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.00207412</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0020688</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.00208376</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0020955610000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0020943610000000003</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0020893610000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0020961230000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0020729200000000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.00206996</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0021200800000000003</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0020985630000000003</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0021015600000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.002084481</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0020864810000000003</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0020774400000000003</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0020692800000000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.00207136</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0020879610000000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.002089441</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0021005609999999999</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0021022409999999999</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0020743200000000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0020792800000000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0020774000000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0020765600000000003</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0020830830000000003</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0020838829999999999</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0020982410000000003</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0020833610000000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0020726</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0020782800000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0020529599999999999</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0021279210000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.002089161</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0020892010000000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.00207544</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0020828400000000003</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0020691200000000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.00207704</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0020880429999999999</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0020918429999999999</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0021526430000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.002085323</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0020922810000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0020669200000000003</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.00215372</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.00207304</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.002076601</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0020949620000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.002083321</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.002073961</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0020738000000000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0020674400000000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.00207888</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0020933230000000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0020924430000000003</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0021093230000000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0020860030000000003</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0020732400000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0020663999999999999</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.00206828</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0020734</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0020888009999999999</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0020840010000000003</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0021071610000000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0020698800000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.002078</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0020668800000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0020828000000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0021036430000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.002105923</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.002094963</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0022069630000000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.00209384</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0020772</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0020736800000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0020742</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0020923210000000003</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.002086081</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0020877210000000003</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0020729200000000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0021266810000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0020851610000000003</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.00208464</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0020736400000000003</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0020819600000000003</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0020852399999999999</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0020909230000000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.002100963</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0020798030000000003</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.002048865</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0020709600000000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>4</size>\n\t\t\t<data>0.0020917600000000002</data>\n\t\t</item>\n\t</entries>\n</results>\n"
  },
  {
    "path": "performance/xml/string4_test.cpp",
    "content": "/* /libs/serialization/xml_performance/string5_test.cpp ************************\n\n(C) Copyright 2010 Bryce Lelbach\n\nUse, modification and distribution is subject to the Boost Software License,\nVersion 1.0. (See accompanying file LICENSE_1_0.txt or copy at \nhttp://www.boost.org/LICENSE_1_0.txt)\n\n*******************************************************************************/\n\n#include <string>\n\ntypedef std::string string;\n\n#define BSL_TYPE         string\n#define BSL_DEPTH        1\n#define BSL_ROUNDS       256\n#define BSL_NODE_MAX     4\n#define BSL_SAVE_TMPFILE 0\n\n#include \"harness.hpp\"\n\nBSL_MAIN\n\n"
  },
  {
    "path": "performance/xml/string64_results.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\" ?>\n<!DOCTYPE boost_serialization>\n<boost_serialization signature=\"serialization::archive\" version=\"8\">\n<results class_id=\"0\" tracking_level=\"0\" version=\"0\">\n\t<compiler>GNU C++ version 4.5.1 20100617 (prerelease)</compiler>\n\t<platform>linux</platform>\n\t<entries class_id=\"1\" tracking_level=\"0\" version=\"0\">\n\t\t<count>256</count>\n\t\t<item_version>0</item_version>\n\t\t<item class_id=\"2\" tracking_level=\"0\" version=\"0\">\n\t\t\t<type>string</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.032849208000000005</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.027500566000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.027451327000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.027459310000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.027409781000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.027785380999999942</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.027489781000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.027510701000000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.027549732</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.027456249000000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.027514171</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.02757565</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.027492611</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.027502767000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.027517847000000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.027530807000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.027565327000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.027517444000000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.027542341000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.027525541000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.027602181000000003</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.027534101000000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.027491539000000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.027615651000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.027528491000000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.027536010000000003</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.027506650000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.027591449000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.027568327</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.027615967000000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.027532167000000003</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.027549087000000003</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.027636750000000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.033203064000000004</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.027562501000000003</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.027484821000000003</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.027475901</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.027442895000000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.027424131000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.027452170000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.027489530000000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.027491611000000003</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.027540329000000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.027551367</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.027500207000000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.027557087000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.027513927000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.027486718</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.027924781000000003</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.027442101</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.027467501000000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.027566061000000003</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.027441051000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.027590011000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.027544210000000003</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.02752425</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.027618371000000003</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.027548727000000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.027522687000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.027526447000000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.027556727000000003</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.027505950000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.027557421000000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.027538700999999888</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.027576901000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.027507901000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.027592498</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.027575250000000003</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.027515571000000003</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.027482651</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.027488170000000003</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.027652449000000003</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.027509127000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.027598727000000003</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.027549807000000003</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.027606287</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.027548792000000003</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.027512221000000003</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.027756460999999955</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.027540181</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.027546621</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.027576093000000003</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.027483489000000003</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.027560690000000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.027573130000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.027519331000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.027563687000000003</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.027538127000000003</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.027482087000000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.027507527</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.027609726000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.027489240000000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.027490021000000003</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.027504140999999982</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.027508021000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.027476421000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.027566891000000003</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.027467090000000003</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.027596731000000003</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.027603850000000003</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.027543370000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.027497287000000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.027564527000000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.027462127000000003</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.027475286000000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.027454365000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.027497301000000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.027490581</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.027542981000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.027498461000000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.027499541000000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.027512971000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.027546411000000003</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.027550209000000003</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.027480250000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.027508009000000003</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.027507007</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.027574567000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.027455566000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.027504607</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.027463672000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.027678861000000003</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.027500861000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.027479541000000003</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.027560741000000003</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.027520495000000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.027470051000000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.027435090000000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.027529330000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.027526049</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.027518048000000003</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.027476686</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.027496167000000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.027677887000000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.027653447000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.027444680000000003</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.027470621000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.027427941000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.027514701000000003</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.027530581000000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.02742785</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.027486410000000003</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.027441931000000003</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.027472611000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.027543169000000003</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.027448767000000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.027436287</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.027571407000000003</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.027521287000000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.027472364000000003</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.027511181000000003</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.028075300999999886</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.027459541000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.027472981</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.027476179000000003</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.027502249000000003</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.027453571000000003</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.027541969000000003</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.027626410000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.027644890000000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.027532927000000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.027655526000000003</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.027602647000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.027518967000000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.027523947</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.027511461000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.027583540999999934</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.027469901000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.027504741000000003</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.027594818</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.027498931000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.02751605</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.027519130000000003</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.027566811</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.02766093</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.027595167</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.027505447000000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.027495406</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.027481407000000003</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.027461713000000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.027512301000000003</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.027660660999999975</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.027531381000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.027476181000000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.027551693000000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.02747109</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.027675011000000003</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.027477691000000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.027453569000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.027546848000000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.027615687000000003</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.027535927000000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.027526766000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.027491245000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.027559138</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.027477061000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.027517181000000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.027551421000000003</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.027533621000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.027495289000000003</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.027478930000000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.027494170000000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.027549171000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.027530529000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.027580927000000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.027560406000000003</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.027538047000000003</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.027684046</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.027510467</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.027602541000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.027593101000000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.027597261000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.027524541000000003</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.027597696000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.027612531000000003</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.027652890000000003</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.027569450000000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.027542971000000003</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.027531930000000003</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.027596847000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.027515367000000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.027395526000000003</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.027510847000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.027532389000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.027653221000000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.027480381000000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.027523341000000003</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.027545901000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.027552058000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.027556891</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.02759725</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.027615211000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.027532371000000003</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.027467209000000003</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.027508167</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.027547567000000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.027625847000000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.027527047000000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.027561192000000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.027590181000000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.027565781000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.027491221000000003</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.027549341000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.027529575000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.027578011000000003</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.027560330000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.027543449000000001</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.027562091</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.027551447000000003</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.027531247000000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.027608247000000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.027568047000000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.027576647000000003</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.027502877000000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.027854221000000002</data>\n\t\t</item>\n\t\t<item>\n\t\t\t<type>string</type>\n\t\t\t<size>64</size>\n\t\t\t<data>0.027568421000000003</data>\n\t\t</item>\n\t</entries>\n</results>\n"
  },
  {
    "path": "performance/xml/string64_test.cpp",
    "content": "/* /libs/serialization/xml_performance/string25_test.cpp ***********************\n\n(C) Copyright 2010 Bryce Lelbach\n\nUse, modification and distribution is subject to the Boost Software License,\nVersion 1.0. (See accompanying file LICENSE_1_0.txt or copy at \nhttp://www.boost.org/LICENSE_1_0.txt)\n\n*******************************************************************************/\n\n#include <string>\n\ntypedef std::string string;\n\n#define BSL_TYPE         string\n#define BSL_DEPTH        3\n#define BSL_ROUNDS       256\n#define BSL_NODE_MAX     4\n#define BSL_SAVE_TMPFILE 0\n\n#include \"harness.hpp\"\n\nBSL_MAIN\n\n"
  },
  {
    "path": "performance/xml_archive.hpp",
    "content": "// (C) Copyright 2002-4 Robert Ramey - http://www.rrsd.com . \n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for updates, documentation, and revision history.\n// xml_archive\n#include <boost/archive/xml_oarchive.hpp>\ntypedef boost::archive::xml_oarchive test_oarchive;\ntypedef std::ofstream test_ostream;\n#include <boost/archive/xml_iarchive.hpp>\ntypedef boost::archive::xml_iarchive test_iarchive;\ntypedef std::ifstream test_istream;\n#define TEST_STREAM_FLAGS (std::ios_base::openmode)0\n\n\n"
  },
  {
    "path": "performance/xml_warchive.hpp",
    "content": "// (C) Copyright 2002-4 Robert Ramey - http://www.rrsd.com . \n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for updates, documentation, and revision history.\n// xml_warchive\n#include <boost/archive/xml_woarchive.hpp>\ntypedef boost::archive::xml_woarchive test_oarchive;\ntypedef std::wofstream test_ostream;\n#include <boost/archive/xml_wiarchive.hpp>\ntypedef boost::archive::xml_wiarchive test_iarchive;\ntypedef std::wifstream test_istream;\n#define TEST_STREAM_FLAGS (std::ios_base::openmode)0\n\n\n"
  },
  {
    "path": "src/archive_exception.cpp",
    "content": "/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// archive_exception.cpp:\n\n// (C) Copyright 2009 Robert Ramey - http://www.rrsd.com . \n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for updates, documentation, and revision history.\n\n#if (defined _MSC_VER) && (_MSC_VER == 1200)\n#  pragma warning (disable : 4786) // too long name, harmless warning\n#endif\n\n#include <exception>\n#include <string>\n#include <cstring>\n\n#define BOOST_ARCHIVE_SOURCE\n#include <boost/serialization/config.hpp>\n#include <boost/archive/archive_exception.hpp>\n\nnamespace boost {\nnamespace archive {\n\nBOOST_ARCHIVE_DECL\nunsigned int\narchive_exception::append(unsigned int l, const char * a){\n    while(l < (sizeof(m_buffer) - 1)){\n        char c = *a++;\n        if('\\0' == c)\n            break;\n        m_buffer[l++] = c;\n    }\n    m_buffer[l] = '\\0';\n    return l;\n}\n\nBOOST_ARCHIVE_DECL\narchive_exception::archive_exception(\n    exception_code c, \n    const char * e1,\n    const char * e2\n) BOOST_NOEXCEPT :\n    code(c)\n{\n    unsigned int length = 0;\n    switch(code){\n    case no_exception:\n        length = append(length, \"uninitialized exception\");\n        break;\n    case unregistered_class:\n        length = append(length, \"unregistered class\");\n        if(NULL != e1){\n            length = append(length, \" - \");\n            length = append(length, e1);\n        }    \n        break;\n    case invalid_signature:\n        length = append(length, \"invalid signature\");\n        break;\n    case unsupported_version:\n        length = append(length, \"unsupported version\");\n        break;\n    case pointer_conflict:\n        length = append(length, \"pointer conflict\");\n        break;\n    case incompatible_native_format:\n        length = append(length, \"incompatible native format\");\n        if(NULL != e1){\n            length = append(length, \" - \");\n            length = append(length, e1);\n        }    \n        break;\n    case array_size_too_short:\n        length = append(length, \"array size too short\");\n        break;\n    case input_stream_error:\n        length = append(length, \"input stream error\");\n        if(NULL != e1){\n            length = append(length, \"-\");\n            length = append(length, e1);\n        }\n        if(NULL != e2){\n            length = append(length, \"-\");\n            length = append(length, e2);\n        }\n        break;\n    case invalid_class_name:\n        length = append(length, \"class name too long\");\n        break;\n    case unregistered_cast:\n        length = append(length, \"unregistered void cast \");\n        length = append(length, (NULL != e1) ? e1 : \"?\");\n        length = append(length, \"<-\");\n        length = append(length, (NULL != e2) ? e2 : \"?\");\n        break;\n    case unsupported_class_version:\n        length = append(length, \"class version \");\n        length = append(length, (NULL != e1) ? e1 : \"<unknown class>\");\n        break;\n    case other_exception:\n        // if get here - it indicates a derived exception \n        // was sliced by passing by value in catch\n        length = append(length, \"unknown derived exception\");\n        break;\n    case multiple_code_instantiation:\n        length = append(length, \"code instantiated in more than one module\");\n        if(NULL != e1){\n            length = append(length, \" - \");\n            length = append(length, e1);\n        }    \n        break;\n    case output_stream_error:\n        length = append(length, \"output stream error\");\n        if(NULL != e1){\n            length = append(length, \"-\");\n            length = append(length, e1);\n        }\n        if(NULL != e2){\n            length = append(length, \"-\");\n            length = append(length, e2);\n        }\n        break;\n    default:\n        BOOST_ASSERT(false);\n        length = append(length, \"programming error\");\n        break;\n    }\n}\n\nBOOST_ARCHIVE_DECL\narchive_exception::archive_exception(archive_exception const & oth) BOOST_NOEXCEPT :\n\tstd::exception(oth),\n\tcode(oth.code)\n{\n\tstd::memcpy(m_buffer,oth.m_buffer,sizeof m_buffer);\n}\n\nBOOST_ARCHIVE_DECL\narchive_exception::~archive_exception() BOOST_NOEXCEPT_OR_NOTHROW {}\n\nBOOST_ARCHIVE_DECL const char *\narchive_exception::what() const BOOST_NOEXCEPT_OR_NOTHROW {\n    return m_buffer;\n}\n\nBOOST_ARCHIVE_DECL\narchive_exception::archive_exception() BOOST_NOEXCEPT :\n    code(no_exception)\n{}\n\n} // archive\n} // boost\n"
  },
  {
    "path": "src/basic_archive.cpp",
    "content": "/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// basic_archive.cpp:\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com . \n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for updates, documentation, and revision history.\n\n//////////////////////////////////////////////////////////////////////\n//\n//  objects are stored as\n//\n//      class_id*   // -1 for a null pointer\n//      if a new class id\n//      [\n//          exported key - class name*\n//          tracking level - always/never\n//          class version\n//      ]\n//\n//      if tracking\n//      [\n//          object_id\n//      ]\n//          \n//      [   // if a new object id\n//          data...\n//      ]\n//\n//  * required only for pointers - optional for objects\n\n#define BOOST_ARCHIVE_SOURCE\n#include <boost/serialization/config.hpp>\n#include <boost/archive/basic_archive.hpp>\n\nnamespace boost {\nnamespace archive {\n\n///////////////////////////////////////////////////////////////////////\n// constants used in archive signature\n//This should never ever change. note that is not an std::string\n// string.\nBOOST_SYMBOL_VISIBLE const char * \nBOOST_ARCHIVE_SIGNATURE(){\n    return \"serialization::archive\";\n}\n\n// this should change if the capabilities are added to the library\n// such that archives can be created which can't be read by previous\n// versions of this library\n// 1 - initial version\n// 2 - made address tracking optional\n// 3 - numerous changes - can't guarantee compatibility with previous versions\n// 4 - Boost 1.34\n//     added item_version to properly support versioning for collections \n// 5 - Boost 1.36\n//     changed serialization of collections: adding version even for primitive\n//     types caused backwards compatibility breaking change in 1.35\n// 6 - Boost 1.41 17 Nov 2009\n//     serializing collection sizes as std::size_t\n// 7   Boost 1.42 2 Feb 2010\n//     error - changed binary version to 16 bits w/o changing library version #\n//     That is - binary archives are recorded with #6 even though they are\n//     different from the previous versions.  This means that binary archives\n//     created with versions 1.42 and 1.43 will have to be fixed with a special\n//     program which fixes the library version # in the header\n//     Boost 1.43 6 May 2010\n//     no change\n// 8 - Boost 1.44\n//     separated version_type into library_version_type and class_version_type\n//     changed version_type to be stored as 8 bits.\n// 10- fixed base64 output/input.\n// 11- not changes\n// 12- improved serialization of collections\n// 13- simplified visibility, removed Borland, removed pfto\n// 14- improved visibility, refactor map/set\n// 15- corrections to optional and collection loading\n// 16- eliminated dependency on <codecvt> which is buggy in some libraries\n//     and now officially deprecated in the standard\n// 17- Boost 1.68 August 2018\n// 18- addressed undefined behavior in archive constructors.\n//     init() called from base wrote archive header before archive\n//     was fully constructed.\n// 19- Boost 1.76 April 2021\n// 20- Boost 1.84 April 2021\nBOOST_SYMBOL_VISIBLE boost::serialization::library_version_type\nBOOST_ARCHIVE_VERSION(){\n    return boost::serialization::library_version_type(20);\n}\n\n} // namespace archive\n} // namespace boost\n"
  },
  {
    "path": "src/basic_iarchive.cpp",
    "content": "/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// basic_archive.cpp:\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com . \n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for updates, documentation, and revision history.\n\n#include <boost/config.hpp> // msvc 6.0 needs this to suppress warnings\n\n#include <boost/assert.hpp>\n#include <set>\n#include <list>\n#include <vector>\n#include <cstddef> // size_t, NULL\n\n#include <boost/config.hpp>\n#if defined(BOOST_NO_STDC_NAMESPACE)\nnamespace std{ \n    using ::size_t; \n} // namespace std\n#endif\n\n#include <boost/integer_traits.hpp>\n\n#define BOOST_ARCHIVE_SOURCE\n// include this to prevent linker errors when the\n// same modules are marked export and import.\n#define BOOST_SERIALIZATION_SOURCE\n#include <boost/serialization/config.hpp>\n\n#include <boost/serialization/state_saver.hpp>\n#include <boost/serialization/throw_exception.hpp>\n#include <boost/serialization/tracking.hpp>\n\n#include <boost/archive/archive_exception.hpp>\n#include <boost/archive/detail/decl.hpp>\n#include <boost/archive/basic_archive.hpp>\n#include <boost/archive/detail/basic_iserializer.hpp>\n#include <boost/archive/detail/basic_pointer_iserializer.hpp>\n#include <boost/archive/detail/basic_iarchive.hpp>\n\n#include <boost/archive/detail/auto_link_archive.hpp>\n\nusing namespace boost::serialization;\n\nnamespace boost {\nnamespace archive {\nnamespace detail {\n\nclass basic_iarchive_impl {\n    friend class basic_iarchive;\n    library_version_type m_archive_library_version;\n    unsigned int m_flags;\n\n    //////////////////////////////////////////////////////////////////////\n    // information about each serialized object loaded\n    // indexed on object_id\n    struct aobject\n    {\n        void * address;\n        bool loaded_as_pointer;\n        class_id_type class_id;\n        aobject(\n            void *a,\n            class_id_type class_id_\n        ) :\n            address(a),\n            loaded_as_pointer(false),\n            class_id(class_id_)\n        {}\n        aobject() : \n            address(NULL),\n            loaded_as_pointer(false),\n            class_id(-2) \n        {}\n    };\n    typedef std::vector<aobject> object_id_vector_type;\n    object_id_vector_type object_id_vector;\n\n    //////////////////////////////////////////////////////////////////////\n    // used to implement the reset_object_address operation.\n    struct moveable_objects {\n        object_id_type start;\n        object_id_type end;\n        object_id_type recent;\n        bool is_pointer;\n        moveable_objects() :\n            start(0),\n            end(0),\n            recent(0),\n            is_pointer(false)\n        {}\n    } m_moveable_objects;\n\n    void reset_object_address(\n        const void * new_address, \n        const void *old_address\n    );\n\n    //////////////////////////////////////////////////////////////////////\n    // used by load object to look up class id given basic_serializer\n    struct cobject_type\n    {\n        const basic_iserializer * m_bis;\n        const class_id_type m_class_id;\n        cobject_type(\n            std::size_t class_id,\n            const basic_iserializer & bis\n        ) : \n            m_bis(& bis),\n            m_class_id(class_id)\n        {}\n        cobject_type(const cobject_type & rhs) : \n            m_bis(rhs.m_bis),\n            m_class_id(rhs.m_class_id)\n        {}\n        // the following cannot be defined because of the const\n        // member.  This will generate a link error if an attempt\n        // is made to assign.  This should never be necessary\n        cobject_type & operator=(const cobject_type & rhs);\n        bool operator<(const cobject_type &rhs) const\n        {\n            return *m_bis < *(rhs.m_bis);\n        }\n    };\n    typedef std::set<cobject_type> cobject_info_set_type;\n    cobject_info_set_type cobject_info_set;\n\n    //////////////////////////////////////////////////////////////////////\n    // information about each serialized class indexed on class_id\n    class cobject_id \n    {\n    public:\n        cobject_id & operator=(const cobject_id & rhs){\n            bis_ptr = rhs.bis_ptr;\n            bpis_ptr = rhs.bpis_ptr;\n            file_version = rhs.file_version;\n            tracking_level = rhs.tracking_level;\n            initialized = rhs.initialized;\n            return *this;\n        }\n        const basic_iserializer * bis_ptr;\n        const basic_pointer_iserializer * bpis_ptr;\n        version_type file_version;\n        tracking_type tracking_level;\n        bool initialized;\n\n        cobject_id(const basic_iserializer & bis_) :\n            bis_ptr(& bis_),\n            bpis_ptr(NULL),\n            file_version(0),\n            tracking_level(track_never),\n            initialized(false)\n        {}\n        cobject_id(const cobject_id &rhs): \n            bis_ptr(rhs.bis_ptr),\n            bpis_ptr(rhs.bpis_ptr),\n            file_version(rhs.file_version),\n            tracking_level(rhs.tracking_level),\n            initialized(rhs.initialized)\n        {}\n    };\n    typedef std::vector<cobject_id> cobject_id_vector_type;\n    cobject_id_vector_type cobject_id_vector;\n\n    //////////////////////////////////////////////////////////////////////\n    // address of the most recent object serialized as a pointer\n    // whose data itself is now pending serialization\n    struct pending {\n        void * object;\n        const basic_iserializer * bis;\n        version_type version;\n        pending() :\n            object(NULL),\n            bis(NULL),\n            version(0)\n        {}\n    } m_pending;\n\n    basic_iarchive_impl(unsigned int flags) :\n        m_archive_library_version(BOOST_ARCHIVE_VERSION()),\n        m_flags(flags)\n    {}\n    void set_library_version(library_version_type archive_library_version){\n        m_archive_library_version = archive_library_version;\n    }\n    bool\n    track(\n        basic_iarchive & ar,\n        void * & t\n    );\n    void\n    load_preamble(\n        basic_iarchive & ar,\n        cobject_id & co\n    );\n    class_id_type register_type(\n        const basic_iserializer & bis\n    );\n\n    // redirect through virtual functions to load functions for this archive\n    template<class T>\n    void load(basic_iarchive & ar, T & t){\n        ar.vload(t);\n    }\n\n//public:\n    void\n    next_object_pointer(void * t){\n        m_pending.object = t;\n    }\n    void delete_created_pointers();\n    class_id_type register_type(\n        const basic_pointer_iserializer & bpis\n    );\n    void load_object(\n        basic_iarchive & ar,\n        void * t,\n        const basic_iserializer & bis\n    );\n    const basic_pointer_iserializer * load_pointer(\n        basic_iarchive & ar,\n        void * & t, \n        const basic_pointer_iserializer * bpis,\n        const basic_pointer_iserializer * (*finder)(\n            const boost::serialization::extended_type_info & type\n        )\n    );\n};\n\ninline void \nbasic_iarchive_impl::reset_object_address(\n    void const * const new_address, \n    void const * const old_address\n){\n    if(m_moveable_objects.is_pointer)\n        return;\n\n    // this code handles a couple of situations.\n    // a) where reset_object_address is applied to an untracked object.\n    //    In such a case the call is really superfluous and its really an\n    //    an error.  But we don't have access to the types here so we can't\n    //    know that.  However, this code will effectively turn this situation\n    //    into a no-op and every thing will work fine - albeat with a small\n    //    execution time penalty.\n    // b) where the call to reset_object_address doesn't immediatly follow\n    //    the << operator to which it corresponds.  This would be a bad idea\n    //    but the code may work anyway.  Naturally, a bad practice on the part\n    //    of the programmer but we can't detect it - as above.  So maybe we\n    //    can save a few more people from themselves as above.\n    object_id_type i = m_moveable_objects.recent;\n    for(; i < m_moveable_objects.end; ++i){\n        if(old_address == object_id_vector[i].address)\n            break;\n    }\n    for(; i < m_moveable_objects.end; ++i){\n        const aobject & ao = object_id_vector[i];\n        if(ao.loaded_as_pointer)\n            continue;\n        void const * const this_address = ao.address;\n        // calculate displacement from this level\n        // warning - pointer arithmetic on void * is inherently non-portable\n        // but expected to work on all platforms in current usage\n        if(this_address > old_address){\n            std::size_t member_displacement\n                = reinterpret_cast<std::size_t>(this_address) \n                - reinterpret_cast<std::size_t>(old_address);\n            object_id_vector[i].address = reinterpret_cast<void *>(\n                reinterpret_cast<std::size_t>(new_address) + member_displacement\n            );\n        }\n        else{\n            std::size_t member_displacement\n                = reinterpret_cast<std::size_t>(old_address)\n                - reinterpret_cast<std::size_t>(this_address); \n            object_id_vector[i].address = reinterpret_cast<void *>(\n                reinterpret_cast<std::size_t>(new_address) - member_displacement\n            );\n       }\n    }\n}\n\ninline void \nbasic_iarchive_impl::delete_created_pointers()\n{\n    object_id_vector_type::iterator i;\n    for(\n        i = object_id_vector.begin();\n        i != object_id_vector.end(); \n        ++i\n    ){\n        if(i->loaded_as_pointer){\n            // borland complains without this minor hack\n            const int j = i->class_id;\n            const cobject_id & co = cobject_id_vector[j];\n            //const cobject_id & co = cobject_id_vector[i->class_id];\n            // with the appropriate input serializer, \n            // delete the indicated object\n            co.bis_ptr->destroy(i->address);\n        }\n    }\n}\n\ninline class_id_type\nbasic_iarchive_impl::register_type(\n    const basic_iserializer & bis\n){\n    class_id_type cid(cobject_info_set.size());\n    cobject_type co(cid, bis);\n    std::pair<cobject_info_set_type::const_iterator, bool>\n        result = cobject_info_set.insert(co);\n\n    if(result.second){\n        cobject_id_vector.push_back(cobject_id(bis));\n        BOOST_ASSERT(cobject_info_set.size() == cobject_id_vector.size());\n    }\n    cid = result.first->m_class_id;\n    // borland complains without this minor hack\n    const int tid = cid;\n    cobject_id & coid = cobject_id_vector[tid];\n    coid.bpis_ptr = bis.get_bpis_ptr();\n    return cid;\n}\n\nvoid\nbasic_iarchive_impl::load_preamble(\n    basic_iarchive & ar,\n    cobject_id & co\n){\n    if(! co.initialized){\n        if(co.bis_ptr->class_info()){\n            class_id_optional_type cid(class_id_type(0));\n            load(ar, cid);    // to be thrown away\n            load(ar, co.tracking_level);\n            load(ar, co.file_version);\n        }\n        else{\n            // override tracking with indicator from class information\n            co.tracking_level = co.bis_ptr->tracking(m_flags);\n            co.file_version = version_type(\n                co.bis_ptr->version()\n            );\n        }\n        co.initialized = true;\n    }\n}\n\nbool\nbasic_iarchive_impl::track(\n    basic_iarchive & ar,\n    void * & t\n){\n    object_id_type oid;\n    load(ar, oid);\n\n    // if its a reference to a old object\n    if(object_id_type(object_id_vector.size()) > oid){\n        // we're done\n        t = object_id_vector[oid].address;\n        return false;\n    }\n    return true;\n}\n\ninline void\nbasic_iarchive_impl::load_object(\n    basic_iarchive & ar,\n    void * t,\n    const basic_iserializer & bis\n){\n    m_moveable_objects.is_pointer = false;\n    serialization::state_saver<bool> ss_is_pointer(m_moveable_objects.is_pointer);\n    // if its been serialized through a pointer and the preamble's been done\n    if(t == m_pending.object && & bis == m_pending.bis){\n        // read data\n        (bis.load_object_data)(ar, t, m_pending.version);\n        return;\n    }\n\n    const class_id_type cid = register_type(bis);\n    const int i = cid;\n    cobject_id & co = cobject_id_vector[i];\n\n    load_preamble(ar, co);\n\n    // save the current move stack position in case we want to truncate it\n    boost::serialization::state_saver<object_id_type> ss_start(m_moveable_objects.start);\n\n    // note: extra line used to evade borland issue\n    const bool tracking = co.tracking_level;\n\n    object_id_type this_id;\n    m_moveable_objects.start =\n    this_id = object_id_type(object_id_vector.size());\n\n    // if we tracked this object when the archive was saved\n    if(tracking){ \n        // if it was already read\n        if(!track(ar, t))\n            // we're done\n            return;\n        // add a new entry into the tracking list\n        object_id_vector.push_back(aobject(t, cid));\n        // and add an entry for this object\n        m_moveable_objects.end = object_id_type(object_id_vector.size());\n    }\n    // read data\n    (bis.load_object_data)(ar, t, co.file_version);\n    m_moveable_objects.recent = this_id;\n}\n\ninline const basic_pointer_iserializer *\nbasic_iarchive_impl::load_pointer(\n    basic_iarchive &ar,\n    void * & t,\n    const basic_pointer_iserializer * bpis_ptr,\n    const basic_pointer_iserializer * (*finder)(\n        const boost::serialization::extended_type_info & type_\n    )\n){\n    m_moveable_objects.is_pointer = true;\n    serialization::state_saver<bool> w(m_moveable_objects.is_pointer);\n\n    class_id_type cid;\n    load(ar, cid);\n\n    if(BOOST_SERIALIZATION_NULL_POINTER_TAG == cid){\n        t = NULL;\n        return bpis_ptr;\n    }\n\n    // if its a new class type - i.e. never been registered\n    if(class_id_type(cobject_info_set.size()) <= cid){\n        // if its either abstract\n        if(NULL == bpis_ptr\n        // or polymorphic\n        || bpis_ptr->get_basic_serializer().is_polymorphic()){\n            // is must have been exported\n            char key[BOOST_SERIALIZATION_MAX_KEY_SIZE];\n            class_name_type class_name(key);\n            load(ar, class_name);\n            // if it has a class name\n            const serialization::extended_type_info *eti = NULL;\n            if(0 != key[0])\n                eti = serialization::extended_type_info::find(key);\n            if(NULL == eti)\n                boost::serialization::throw_exception(\n                    archive_exception(archive_exception::unregistered_class)\n                );\n            bpis_ptr = (*finder)(*eti);\n        }\n        BOOST_ASSERT(NULL != bpis_ptr);\n        // class_id_type new_cid = register_type(bpis_ptr->get_basic_serializer());\n        BOOST_VERIFY(register_type(bpis_ptr->get_basic_serializer()) == cid);\n        int i = cid;\n        cobject_id_vector[i].bpis_ptr = bpis_ptr;\n    }\n    int i = cid;\n    cobject_id & co = cobject_id_vector[i];\n    bpis_ptr = co.bpis_ptr;\n\n    if (bpis_ptr == NULL) {\n        boost::serialization::throw_exception(\n            archive_exception(archive_exception::unregistered_class)\n        );\n    }\n\n    load_preamble(ar, co);\n\n    // extra line to evade borland issue\n    const bool tracking = co.tracking_level;\n    // if we're tracking and the pointer has already been read\n    if(tracking && ! track(ar, t))\n        // we're done\n        return bpis_ptr;\n\n    // save state\n    serialization::state_saver<object_id_type> w_start(m_moveable_objects.start);\n\n    // allocate space on the heap for the object - to be constructed later\n    t = bpis_ptr->heap_allocation();\n    BOOST_ASSERT(NULL != t);\n\n    if(! tracking){\n        bpis_ptr->load_object_ptr(ar, t, co.file_version);\n    }\n    else{\n        serialization::state_saver<void *> x(m_pending.object);\n        serialization::state_saver<const basic_iserializer *> y(m_pending.bis);\n        serialization::state_saver<version_type> z(m_pending.version);\n\n        m_pending.bis = & bpis_ptr->get_basic_serializer();\n        m_pending.version = co.file_version;\n\n        // predict next object id to be created\n        const size_t ui = object_id_vector.size();\n\n        serialization::state_saver<object_id_type> w_end(m_moveable_objects.end);\n\n        // add to list of serialized objects so that we can properly handle\n        // cyclic structures\n        object_id_vector.push_back(aobject(t, cid));\n\n        // remember that that the address of these elements could change\n        // when we make another call so don't use the address\n        bpis_ptr->load_object_ptr(\n            ar,\n            t,\n            m_pending.version\n        );\n        object_id_vector[ui].loaded_as_pointer = true;\n    }\n\n    return bpis_ptr;\n}\n\n} // namespace detail\n} // namespace archive\n} // namespace boost\n\n//////////////////////////////////////////////////////////////////////\n// implementation of basic_iarchive functions\nnamespace boost {\nnamespace archive {\nnamespace detail {\n\nBOOST_ARCHIVE_DECL void\nbasic_iarchive::next_object_pointer(void *t){\n    pimpl->next_object_pointer(t);\n}\n\nBOOST_ARCHIVE_DECL\nbasic_iarchive::basic_iarchive(unsigned int flags) : \n    pimpl(new basic_iarchive_impl(flags))\n{}\n\nBOOST_ARCHIVE_DECL\nbasic_iarchive::~basic_iarchive()\n{}\n\nBOOST_ARCHIVE_DECL void\nbasic_iarchive::set_library_version(library_version_type archive_library_version){\n    pimpl->set_library_version(archive_library_version);\n}\n\nBOOST_ARCHIVE_DECL void\nbasic_iarchive::reset_object_address(\n    const void * new_address, \n    const void * old_address\n){\n    pimpl->reset_object_address(new_address, old_address);\n}\n\nBOOST_ARCHIVE_DECL void\nbasic_iarchive::load_object(\n    void *t, \n    const basic_iserializer & bis\n){\n    pimpl->load_object(*this, t, bis);\n}\n\n// load a pointer object\nBOOST_ARCHIVE_DECL const basic_pointer_iserializer *\nbasic_iarchive::load_pointer(\n    void * &t, \n    const basic_pointer_iserializer * bpis_ptr,\n    const basic_pointer_iserializer * (*finder)(\n        const boost::serialization::extended_type_info & type_\n    )\n\n){\n    return pimpl->load_pointer(*this, t, bpis_ptr, finder);\n}\n\nBOOST_ARCHIVE_DECL void\nbasic_iarchive::register_basic_serializer(const basic_iserializer & bis){\n    pimpl->register_type(bis);\n}\n\nBOOST_ARCHIVE_DECL void\nbasic_iarchive::delete_created_pointers()\n{\n    pimpl->delete_created_pointers();\n}\n\nBOOST_ARCHIVE_DECL boost::serialization::library_version_type\nbasic_iarchive::get_library_version() const{\n    return pimpl->m_archive_library_version;\n}\n\nBOOST_ARCHIVE_DECL unsigned int\nbasic_iarchive::get_flags() const{\n    return pimpl->m_flags;\n}\n\n} // namespace detail\n} // namespace archive\n} // namespace boost\n"
  },
  {
    "path": "src/basic_iserializer.cpp",
    "content": "/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// basic_iserializer.cpp:\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com . \n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for updates, documentation, and revision history.\n\n#include <cstddef> // NULL\n\n#define BOOST_ARCHIVE_SOURCE\n#include <boost/serialization/config.hpp>\n#include <boost/archive/detail/basic_iserializer.hpp>\n\nnamespace boost {\nnamespace archive {\nnamespace detail {\n\nBOOST_ARCHIVE_DECL \nbasic_iserializer::basic_iserializer(\n    const boost::serialization::extended_type_info & eti\n) :\n    basic_serializer(eti), \n    m_bpis(NULL)\n{}\n\nBOOST_ARCHIVE_DECL \nbasic_iserializer::~basic_iserializer(){}\n\n} // namespace detail\n} // namespace archive\n} // namespace boost\n"
  },
  {
    "path": "src/basic_oarchive.cpp",
    "content": "/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// basic_oarchive.cpp:\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com . \n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for updates, documentation, and revision history.\n\n#include <boost/config.hpp> // msvc 6.0 needs this for warning suppression\n\n#include <boost/assert.hpp>\n#include <set>\n#include <cstddef> // NULL\n\n#include <boost/limits.hpp>\n\n// including this here to work around an ICC in intel 7.0\n// normally this would be part of basic_oarchive.hpp below.\n#define BOOST_ARCHIVE_SOURCE\n// include this to prevent linker errors when the\n// same modules are marked export and import.\n#define BOOST_SERIALIZATION_SOURCE\n#include <boost/serialization/config.hpp>\n#include <boost/serialization/state_saver.hpp>\n#include <boost/serialization/throw_exception.hpp>\n#include <boost/serialization/extended_type_info.hpp>\n\n#include <boost/archive/detail/decl.hpp>\n#include <boost/archive/basic_archive.hpp>\n#include <boost/archive/detail/basic_oserializer.hpp>\n#include <boost/archive/detail/basic_pointer_oserializer.hpp>\n#include <boost/archive/detail/basic_oarchive.hpp>\n#include <boost/archive/archive_exception.hpp>\n\n#ifdef BOOST_MSVC\n#  pragma warning(push)\n#  pragma warning(disable : 4251 4231 4660 4275)\n#endif\n\nusing namespace boost::serialization;\n\nnamespace boost {\nnamespace archive {\nnamespace detail {\n\nclass basic_oarchive_impl {\n    friend class basic_oarchive;\n    unsigned int m_flags;\n\n    //////////////////////////////////////////////////////////////////////\n    // information about each serialized object saved\n    // keyed on address, class_id\n    struct aobject\n    {\n        const void * address;\n        class_id_type class_id;\n        object_id_type object_id;\n\n        bool operator<(const aobject &rhs) const\n        {\n            BOOST_ASSERT(NULL != address);\n            BOOST_ASSERT(NULL != rhs.address);\n            if( address < rhs.address )\n                return true;\n            if( address > rhs.address )\n                return false;\n            return class_id < rhs.class_id;\n        }\n        aobject(\n            const void *a,\n            class_id_type class_id_,\n            object_id_type object_id_\n        ) :\n            address(a),\n            class_id(class_id_),\n            object_id(object_id_)\n        {}\n        aobject() : address(NULL){}\n    };\n    // keyed on class_id, address\n    typedef std::set<aobject> object_set_type;\n    object_set_type object_set;\n\n    //////////////////////////////////////////////////////////////////////\n    // information about each serialized class saved\n    // keyed on type_info\n    struct cobject_type\n    {\n        const basic_oserializer * m_bos_ptr;\n        const class_id_type m_class_id;\n        bool m_initialized;\n        cobject_type(\n            std::size_t class_id,\n            const basic_oserializer & bos\n        ) :\n            m_bos_ptr(& bos),\n            m_class_id(class_id),\n            m_initialized(false)\n        {}\n        cobject_type(const basic_oserializer & bos) :\n            m_bos_ptr(& bos),\n            m_initialized(false)\n        {}\n        cobject_type(\n            const cobject_type & rhs\n        ) :\n            m_bos_ptr(rhs.m_bos_ptr),\n            m_class_id(rhs.m_class_id),\n            m_initialized(rhs.m_initialized)\n        {}\n        // the following cannot be defined because of the const\n        // member.  This will generate a link error if an attempt\n        // is made to assign.  This should never be necessary\n        // use this only for lookup argument \n        cobject_type & operator=(const cobject_type &rhs);\n        bool operator<(const cobject_type &rhs) const {\n            return *m_bos_ptr < *(rhs.m_bos_ptr);\n        }\n    };\n    // keyed on type_info\n    typedef std::set<cobject_type> cobject_info_set_type;\n    cobject_info_set_type cobject_info_set;\n\n    // list of objects initially stored as pointers - used to detect errors\n    // keyed on object id\n    std::set<object_id_type> stored_pointers;\n\n    // address of the most recent object serialized as a pointer\n    // whose data itself is now pending serialization\n    const void * pending_object;\n    const basic_oserializer * pending_bos;\n\n    basic_oarchive_impl(unsigned int flags) :\n        m_flags(flags),\n        pending_object(NULL),\n        pending_bos(NULL)\n    {}\n\n    const cobject_type &\n    find(const basic_oserializer & bos);\n    const basic_oserializer *  \n    find(const serialization::extended_type_info &ti) const;\n\n//public:\n    const cobject_type &\n    register_type(const basic_oserializer & bos);\n    void save_object(\n        basic_oarchive & ar,\n        const void *t,\n        const basic_oserializer & bos\n    );\n    void save_pointer(\n        basic_oarchive & ar,\n        const void * t, \n        const basic_pointer_oserializer * bpos\n    );\n};\n\n//////////////////////////////////////////////////////////////////////\n// basic_oarchive implementation functions\n\n// given a type_info - find its bos\n// return NULL if not found\ninline const basic_oserializer *\nbasic_oarchive_impl::find(const serialization::extended_type_info & ti) const {\n    #ifdef BOOST_MSVC\n    #  pragma warning(push)\n    #  pragma warning(disable : 4511 4512)\n    #endif\n    class bosarg : \n        public basic_oserializer\n    {\n        bool class_info() const BOOST_OVERRIDE {\n            BOOST_ASSERT(false); \n            return false;\n        }\n        // returns true if objects should be tracked\n        bool tracking(const unsigned int) const BOOST_OVERRIDE {\n            BOOST_ASSERT(false);\n            return false;\n        }\n        // returns class version\n        version_type version() const BOOST_OVERRIDE {\n            BOOST_ASSERT(false);\n            return version_type(0);\n        }\n        // returns true if this class is polymorphic\n        bool is_polymorphic() const BOOST_OVERRIDE {\n            BOOST_ASSERT(false);\n            return false;\n        }\n        void save_object_data(      \n            basic_oarchive & /*ar*/, const void * /*x*/\n        ) const BOOST_OVERRIDE {\n            BOOST_ASSERT(false);\n        }\n    public:\n        bosarg(const serialization::extended_type_info & eti) :\n          boost::archive::detail::basic_oserializer(eti)\n        {}\n    };\n    #ifdef BOOST_MSVC\n    #pragma warning(pop)\n    #endif\n    bosarg bos(ti);\n    cobject_info_set_type::const_iterator cit \n        = cobject_info_set.find(cobject_type(bos));\n    // it should already have been \"registered\" - see below\n    if(cit == cobject_info_set.end()){\n        // if an entry is not found in the table it is because a pointer\n        // of a derived class has been serialized through its base class\n        // but the derived class hasn't been \"registered\" \n        return NULL;\n    }\n    // return pointer to the real class\n    return cit->m_bos_ptr;\n}\n\ninline const basic_oarchive_impl::cobject_type &\nbasic_oarchive_impl::find(const basic_oserializer & bos)\n{\n    std::pair<cobject_info_set_type::iterator, bool> cresult = \n        cobject_info_set.insert(cobject_type(cobject_info_set.size(), bos));\n    return *(cresult.first);\n}\n\ninline const basic_oarchive_impl::cobject_type &\nbasic_oarchive_impl::register_type(\n    const basic_oserializer & bos\n){\n    cobject_type co(cobject_info_set.size(), bos);\n    std::pair<cobject_info_set_type::const_iterator, bool>\n        result = cobject_info_set.insert(co);\n    return *(result.first);\n}\n\ninline void\nbasic_oarchive_impl::save_object(\n    basic_oarchive & ar,\n    const void *t,\n    const basic_oserializer & bos\n){\n    // if its been serialized through a pointer and the preamble's been done\n    if(t == pending_object && pending_bos == & bos){\n        // just save the object data\n        ar.end_preamble();\n        (bos.save_object_data)(ar, t);\n        return;\n    }\n\n    // get class information for this object\n    const cobject_type & co = register_type(bos);\n    if(bos.class_info()){\n        if( ! co.m_initialized){\n            ar.vsave(class_id_optional_type(co.m_class_id));\n            ar.vsave(tracking_type(bos.tracking(m_flags)));\n            ar.vsave(version_type(bos.version()));\n            (const_cast<cobject_type &>(co)).m_initialized = true;\n        }\n    }\n\n    // we're not tracking this type of object\n    if(! co.m_bos_ptr->tracking(m_flags)){\n        // just windup the preamble - no object id to write\n        ar.end_preamble();\n        // and save the data\n        (co.m_bos_ptr->save_object_data)(ar, t);\n        return;\n    }\n\n    // look for an existing object id\n    object_id_type oid(object_set.size());\n    // lookup to see if this object has already been written to the archive\n    basic_oarchive_impl::aobject ao(t, co.m_class_id, oid);\n    std::pair<basic_oarchive_impl::object_set_type::const_iterator, bool>\n        aresult = object_set.insert(ao);\n    oid = aresult.first->object_id;\n\n    // if its a new object\n    if(aresult.second){\n        // write out the object id\n        ar.vsave(oid);\n        ar.end_preamble();\n        // and data\n        (co.m_bos_ptr->save_object_data)(ar, t);\n        return;\n    }\n\n    // check that it wasn't originally stored through a pointer\n    if(stored_pointers.end() != stored_pointers.find(oid)){\n        // this has to be a user error.  loading such an archive\n        // would create duplicate objects\n        boost::serialization::throw_exception(\n            archive_exception(archive_exception::pointer_conflict)\n        );\n    }\n    // just save the object id\n    ar.vsave(object_reference_type(oid));\n    ar.end_preamble();\n}\n\n// colle\ninline void\nbasic_oarchive_impl::save_pointer(\n    basic_oarchive & ar,\n    const void * t, \n    const basic_pointer_oserializer * bpos_ptr\n){\n    const basic_oserializer & bos = bpos_ptr->get_basic_serializer();\n    std::size_t original_count = cobject_info_set.size();\n    const cobject_type & co = register_type(bos);\n    if(! co.m_initialized){\n        ar.vsave(co.m_class_id);\n        // if its a previously unregistered class \n        if((cobject_info_set.size() > original_count)){\n            if(bos.is_polymorphic()){\n                const serialization::extended_type_info *eti = & bos.get_eti();\n                const char * key = NULL;\n                if(NULL != eti)\n                    key = eti->get_key();\n                if(NULL != key){\n                    // the following is required by IBM C++ compiler which\n                    // makes a copy when passing a non-const to a const.  This\n                    // is permitted by the standard but rarely seen in practice\n                    const class_name_type cn(key);\n                    if(cn.size() > (BOOST_SERIALIZATION_MAX_KEY_SIZE - 1))\n                        boost::serialization::throw_exception(\n                            boost::archive::archive_exception(\n                                boost::archive::archive_exception::\n                                    invalid_class_name)\n                            );\n                    // write out the external class identifier\n                    ar.vsave(cn);\n                }\n                else\n                    // without an external class name\n                    // we won't be able to de-serialize it so bail now\n                    boost::serialization::throw_exception(\n                        archive_exception(archive_exception::unregistered_class)\n                    );\n            }\n        }\n        if(bos.class_info()){\n            ar.vsave(tracking_type(bos.tracking(m_flags)));\n            ar.vsave(version_type(bos.version()));\n        }\n        (const_cast<cobject_type &>(co)).m_initialized = true;\n    }\n    else{\n        ar.vsave(class_id_reference_type(co.m_class_id));\n    }\n\n    // if we're not tracking\n    if(! co.m_bos_ptr->tracking(m_flags)){\n        // just save the data itself\n        ar.end_preamble();\n        serialization::state_saver<const void *> x(pending_object);\n        serialization::state_saver<const basic_oserializer *> y(pending_bos);\n        pending_object = t;\n        pending_bos = & bpos_ptr->get_basic_serializer();\n        bpos_ptr->save_object_ptr(ar, t);\n        return;\n    }\n\n    object_id_type oid(object_set.size());\n    // lookup to see if this object has already been written to the archive\n    basic_oarchive_impl::aobject ao(t, co.m_class_id, oid);\n    std::pair<basic_oarchive_impl::object_set_type::const_iterator, bool>\n        aresult = object_set.insert(ao);\n    oid = aresult.first->object_id;\n    // if the saved object already exists\n    if(! aresult.second){\n        // append the object id to he preamble\n        ar.vsave(object_reference_type(oid));\n        // and windup.\n        ar.end_preamble();\n        return;\n    }\n\n    // append id of this object to preamble\n    ar.vsave(oid);\n    ar.end_preamble();\n\n    // and save the object itself\n    serialization::state_saver<const void *> x(pending_object);\n    serialization::state_saver<const basic_oserializer *> y(pending_bos);\n    pending_object = t;\n    pending_bos = & bpos_ptr->get_basic_serializer();\n    bpos_ptr->save_object_ptr(ar, t);\n    // add to the set of object initially stored through pointers\n    stored_pointers.insert(oid);\n}\n\n} // namespace detail\n} // namespace archive\n} // namespace boost\n\n//////////////////////////////////////////////////////////////////////\n// implementation of basic_oarchive functions\n\nnamespace boost {\nnamespace archive {\nnamespace detail {\n\nBOOST_ARCHIVE_DECL \nbasic_oarchive::basic_oarchive(unsigned int flags)\n    : pimpl(new basic_oarchive_impl(flags))\n{}\n\nBOOST_ARCHIVE_DECL \nbasic_oarchive::~basic_oarchive()\n{}\n\nBOOST_ARCHIVE_DECL void \nbasic_oarchive::save_object(\n    const void *x, \n    const basic_oserializer & bos\n){\n    pimpl->save_object(*this, x, bos);\n}\n\nBOOST_ARCHIVE_DECL void \nbasic_oarchive::save_pointer(\n    const void * t, \n    const basic_pointer_oserializer * bpos_ptr\n){\n    pimpl->save_pointer(*this, t, bpos_ptr);\n}\n\nBOOST_ARCHIVE_DECL void \nbasic_oarchive::register_basic_serializer(const basic_oserializer & bos){\n    pimpl->register_type(bos);\n}\n\nBOOST_ARCHIVE_DECL library_version_type\nbasic_oarchive::get_library_version() const{\n    return BOOST_ARCHIVE_VERSION();\n}\n\nBOOST_ARCHIVE_DECL unsigned int\nbasic_oarchive::get_flags() const{\n    return pimpl->m_flags;\n}\n\nBOOST_ARCHIVE_DECL void \nbasic_oarchive::end_preamble(){\n}\n\nBOOST_ARCHIVE_DECL helper_collection &\nbasic_oarchive::get_helper_collection(){\n\treturn *this;\n}\n\n} // namespace detail\n} // namespace archive\n} // namespace boost\n\n#ifdef BOOST_MSVC\n#pragma warning(pop)\n#endif\n"
  },
  {
    "path": "src/basic_oserializer.cpp",
    "content": "/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// basic_oserializer.cpp:\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com . \n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for updates, documentation, and revision history.\n\n#include <cstddef> // NULL\n\n#define BOOST_ARCHIVE_SOURCE\n#include <boost/serialization/config.hpp>\n#include <boost/archive/detail/basic_oserializer.hpp>\n\nnamespace boost {\nnamespace archive {\nnamespace detail {\n\nBOOST_ARCHIVE_DECL \nbasic_oserializer::basic_oserializer(\n        const boost::serialization::extended_type_info & eti\n) :\n    basic_serializer(eti), \n    m_bpos(NULL)\n{}\n\nBOOST_ARCHIVE_DECL \nbasic_oserializer::~basic_oserializer(){}\n\n} // namespace detail\n} // namespace archive\n} // namespace boost\n"
  },
  {
    "path": "src/basic_pointer_iserializer.cpp",
    "content": "/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// basic_pointer_iserializer.cpp:\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com . \n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for updates, documentation, and revision history.\n\n#define BOOST_ARCHIVE_SOURCE\n#include <boost/serialization/config.hpp>\n#include <boost/archive/detail/basic_pointer_iserializer.hpp>\n\nnamespace boost {\nnamespace archive {\nnamespace detail {\n\nBOOST_ARCHIVE_DECL \nbasic_pointer_iserializer::basic_pointer_iserializer(\n    const boost::serialization::extended_type_info & eti\n) :\n    basic_serializer(eti)\n{}\n\nBOOST_ARCHIVE_DECL \nbasic_pointer_iserializer::~basic_pointer_iserializer() {}\n\n} // namespace detail\n} // namespace archive\n} // namespace boost\n"
  },
  {
    "path": "src/basic_pointer_oserializer.cpp",
    "content": "/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// basic_pointer_oserializer.cpp:\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com . \n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for updates, documentation, and revision history.\n\n#define BOOST_ARCHIVE_SOURCE\n#include <boost/serialization/config.hpp>\n#include <boost/archive/detail/basic_pointer_oserializer.hpp>\n\nnamespace boost {\nnamespace archive {\nnamespace detail {\n\nBOOST_ARCHIVE_DECL \nbasic_pointer_oserializer::basic_pointer_oserializer(\n    const boost::serialization::extended_type_info & eti\n) :\n    basic_serializer(eti)\n{}\n\nBOOST_ARCHIVE_DECL \nbasic_pointer_oserializer::~basic_pointer_oserializer() {}\n\n} // namespace detail\n} // namespace archive\n} // namespace boost\n"
  },
  {
    "path": "src/basic_serializer_map.cpp",
    "content": "/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// serializer_map.cpp:\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com . \n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for updates, documentation, and revision history.\n\n#if (defined _MSC_VER) && (_MSC_VER == 1200)\n#  pragma warning (disable : 4786) // too long name, harmless warning\n#endif\n\n#include <set>\n#include <utility>\n\n#define BOOST_ARCHIVE_SOURCE\n// include this to prevent linker errors when the\n// same modules are marked export and import.\n#define BOOST_SERIALIZATION_SOURCE\n#include <boost/serialization/config.hpp>\n#include <boost/serialization/throw_exception.hpp>\n\n#include <boost/archive/archive_exception.hpp>\n#include <boost/archive/detail/basic_serializer.hpp>\n#include <boost/archive/detail/basic_serializer_map.hpp>\n\nnamespace boost {\n    namespace serialization {\n        class extended_type_info;\n    }\nnamespace archive {\nnamespace detail {\n\nbool  \nbasic_serializer_map::type_info_pointer_compare::operator()(\n    const basic_serializer * lhs, const basic_serializer * rhs\n) const {\n    return *lhs < *rhs;\n}\n\nBOOST_ARCHIVE_DECL bool\nbasic_serializer_map::insert(const basic_serializer * bs){\n    // attempt to insert serializer into it's map\n    // the following is commented out - rather than being just\n    // deleted as a reminder not to try this.\n\n    // const std::pair<map_type::iterator, bool> result =\n        m_map.insert(bs);\n\n    // At first it seemed like a good idea.  It enforced the\n    // idea that a type be exported from at most one code module\n    // (DLL or mainline).  This would enforce a \"one definition rule\" \n    // across code modules. This seems a good idea to me.  \n    // But it seems that it's just too hard for many users to implement.\n\n    // Ideally, I would like to make this exception a warning -\n    // but there isn't anyway to do that.\n\n    // if this fails, it's because it's been instantiated\n    // in multiple modules - DLLS - a recipe for problems.\n    // So trap this here\n    // if(!result.second){\n    //     boost::serialization::throw_exception(\n    //         archive_exception(\n    //             archive_exception::multiple_code_instantiation,\n    //             bs->get_debug_info()\n    //         )\n    //     );\n    // }\n    return true;\n}\n\nBOOST_ARCHIVE_DECL void \nbasic_serializer_map::erase(const basic_serializer * bs){\n    map_type::iterator it = m_map.begin();\n    map_type::iterator it_end = m_map.end();\n\n    while(it != it_end){\n        // note item 9 from Effective STL !!! it++\n        if(*it == bs)\n            m_map.erase(it++);\n        else\n            it++;\n    }\n    // note: we can't do this since some of the eti records\n    // we're pointing to might be expired and the comparison\n    // won't work.  Leave this as a reminder not to \"optimize\" this.\n    //it = m_map.find(bs);\n    //assert(it != m_map.end());\n    //if(*it == bs)\n    //    m_map.erase(it);\n}\nBOOST_ARCHIVE_DECL const basic_serializer *\nbasic_serializer_map::find(\n    const boost::serialization::extended_type_info & eti\n) const {\n    const basic_serializer_arg bs(eti);\n    map_type::const_iterator it;\n    it = m_map.find(& bs);\n    if(it == m_map.end()){\n        BOOST_ASSERT(false);\n        return 0;\n    }\n    return *it;\n}\n\n} // namespace detail\n} // namespace archive\n} // namespace boost\n\n"
  },
  {
    "path": "src/basic_text_iprimitive.cpp",
    "content": "/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// basic_text_iprimitive.cpp:\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com . \n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for updates, documentation, and revision history.\n\n#if (defined _MSC_VER) && (_MSC_VER == 1200)\n#  pragma warning (disable : 4786) // too long name, harmless warning\n#endif\n\n#include <istream>\n\n#define BOOST_ARCHIVE_SOURCE\n#include <boost/serialization/config.hpp>\n#include <boost/archive/detail/auto_link_archive.hpp>\n#include <boost/archive/impl/basic_text_iprimitive.ipp>\n\nnamespace boost {\nnamespace archive {\n\n// explicitly instantiate for this type of text stream\ntemplate class basic_text_iprimitive<std::istream> ;\n\n} // namespace archive\n} // namespace boost\n"
  },
  {
    "path": "src/basic_text_oprimitive.cpp",
    "content": "/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// basic_text_oprimitive.cpp:\n\n// (C) Copyright 2004 Robert Ramey - http://www.rrsd.com . \n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for updates, documentation, and revision history.\n\n#if (defined _MSC_VER) && (_MSC_VER == 1200)\n#  pragma warning (disable : 4786) // too long name, harmless warning\n#endif\n\n#include <ostream>\n\n#define BOOST_ARCHIVE_SOURCE\n#include <boost/serialization/config.hpp>\n#include <boost/archive/detail/auto_link_archive.hpp>\n#include <boost/archive/impl/basic_text_oprimitive.ipp>\n\nnamespace boost {\nnamespace archive {\n\n// explicitly instantiate for this type of text stream\ntemplate class basic_text_oprimitive<std::ostream> ;\n\n} // namespace archive\n} // namespace boost\n"
  },
  {
    "path": "src/basic_text_wiprimitive.cpp",
    "content": "/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// basic_text_wiprimitive.cpp:\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com . \n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for updates, documentation, and revision history.\n\n#include <istream>\n\n#include <boost/config.hpp>\n\n#ifdef BOOST_NO_STD_WSTREAMBUF\n#error \"wide char i/o not supported on this platform\"\n#else\n\n#if (defined _MSC_VER) && (_MSC_VER == 1200)\n#  pragma warning (disable : 4786) // too long name, harmless warning\n#endif\n\n#define BOOST_WARCHIVE_SOURCE\n#include <boost/serialization/config.hpp>\n#include <boost/archive/detail/auto_link_warchive.hpp>\n#include <boost/archive/impl/basic_text_iprimitive.ipp>\n\nnamespace boost {\nnamespace archive {\n\ntemplate class basic_text_iprimitive<std::wistream> ;\n\n} // namespace archive\n} // namespace boost\n\n#endif // BOOST_NO_STD_WSTREAMBUF\n"
  },
  {
    "path": "src/basic_text_woprimitive.cpp",
    "content": "/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// basic_text_woprimitive.cpp:\n\n// (C) Copyright 2004 Robert Ramey - http://www.rrsd.com . \n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for updates, documentation, and revision history.\n\n#include <ostream>\n\n#include <boost/config.hpp>\n\n#ifdef BOOST_NO_STD_WSTREAMBUF\n#error \"wide char i/o not supported on this platform\"\n#else\n\n#if (defined _MSC_VER) && (_MSC_VER == 1200)\n#  pragma warning (disable : 4786) // too long name, harmless warning\n#endif\n\n#define BOOST_WARCHIVE_SOURCE\n#include <boost/serialization/config.hpp>\n#include <boost/archive/detail/auto_link_warchive.hpp>\n#include <boost/archive/impl/basic_text_oprimitive.ipp>\n\nnamespace boost {\nnamespace archive {\n\ntemplate class basic_text_oprimitive<std::wostream> ;\n\n} // namespace archive\n} // namespace boost\n\n#endif // BOOST_NO_STD_WSTREAMBUF\n"
  },
  {
    "path": "src/basic_xml_archive.cpp",
    "content": "/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// basic_xml_archive.cpp:\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com . \n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for updates, documentation, and revision history.\n\n#define BOOST_ARCHIVE_SOURCE\n#include <boost/serialization/config.hpp>\n#include <boost/archive/basic_xml_archive.hpp>\n\nnamespace boost {\nnamespace archive {\n\nBOOST_SYMBOL_VISIBLE const char *\nBOOST_ARCHIVE_XML_OBJECT_ID(){\n    return \"object_id\";\n}\nBOOST_SYMBOL_VISIBLE const char *\nBOOST_ARCHIVE_XML_OBJECT_REFERENCE(){\n    return \"object_id_reference\";\n}\nBOOST_SYMBOL_VISIBLE const char *\nBOOST_ARCHIVE_XML_CLASS_ID(){\n    return \"class_id\";\n}\nBOOST_SYMBOL_VISIBLE const char *\nBOOST_ARCHIVE_XML_CLASS_ID_REFERENCE(){\n    return \"class_id_reference\";\n}\nBOOST_SYMBOL_VISIBLE const char *\nBOOST_ARCHIVE_XML_CLASS_NAME(){\n    return \"class_name\";\n}\nBOOST_SYMBOL_VISIBLE const char *\nBOOST_ARCHIVE_XML_TRACKING(){\n    return \"tracking_level\";\n}\nBOOST_SYMBOL_VISIBLE const char *\nBOOST_ARCHIVE_XML_VERSION(){\n    return \"version\";\n}\nBOOST_SYMBOL_VISIBLE const char *\nBOOST_ARCHIVE_XML_SIGNATURE(){\n    return \"signature\";\n}\n\n}// namespace archive\n}// namespace boost\n"
  },
  {
    "path": "src/basic_xml_grammar.ipp",
    "content": "/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// basic_xml_grammar.ipp:\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com . \n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for updates, documentation, and revision history.\n\n#if (defined _MSC_VER) && (_MSC_VER == 1200)\n#  pragma warning (disable : 4786) // too long name, harmless warning\n#endif\n\n#include <istream>\n#include <algorithm>\n#include <boost/config.hpp> // typename\n\n#ifdef BOOST_MSVC\n#  pragma warning(push)\n#  pragma warning(disable : 4244 4511 4512)\n#endif\n\n#include <cerrno>   // errno\n#include <cstring>  // strerror(errno)\n\n// spirit stuff\n#include <boost/spirit/include/classic_operators.hpp>\n#include <boost/spirit/include/classic_actions.hpp>\n#include <boost/spirit/include/classic_numerics.hpp>\n\n#ifdef BOOST_MSVC\n#pragma warning(pop)\n#endif\n\n// for head_iterator test\n#include <boost/function.hpp>\n\n#include <boost/io/ios_state.hpp>\n#include <boost/serialization/throw_exception.hpp>\n#include <boost/archive/impl/basic_xml_grammar.hpp>\n#include <boost/archive/xml_archive_exception.hpp>\n#include <boost/archive/basic_xml_archive.hpp>\n#include <boost/archive/iterators/xml_unescape.hpp>\n\nusing namespace boost::spirit::classic;\n\nnamespace boost {\nnamespace archive {\n\n/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// template code for basic_xml_grammar of both wchar_t and char types\n\nnamespace xml { // anonymous\n\n#ifdef BOOST_MSVC\n#  pragma warning(push)\n#  pragma warning(disable : 4511 4512)\n#endif\n\ntemplate<class T>\nstruct assign_impl {\n    T & m_t;\n    void operator()(const T & rhs) const {\n        m_t = rhs;\n    }\n    assign_impl(T &  rhs)\n        : m_t(rhs)\n    {}\n};\n\ntemplate<>\nstruct assign_impl<std::string> {\n    std::string & m_t;\n    void operator()(\n        std::string::const_iterator b, \n        std::string::const_iterator e\n    ) const {\n        m_t.resize(0);\n        while(b != e){\n            m_t += * b;\n            ++b;\n        }\n    }\n    assign_impl(const assign_impl & rhs)\n        : m_t(rhs.m_t)\n    {}\n    assign_impl & operator=(assign_impl & rhs);\n    assign_impl(std::string & rhs)\n        : m_t(rhs)\n    {}\n};\n\n#ifndef BOOST_NO_STD_WSTRING\ntemplate<>\nstruct assign_impl<std::wstring> {\n    std::wstring & m_t;\n    void operator()(\n        std::wstring::const_iterator b, \n        std::wstring::const_iterator e\n    ) const {\n        m_t.resize(0);\n        while(b != e){\n            m_t += * b;\n            ++b;\n        }\n    }\n    assign_impl(std::wstring & rhs)\n        : m_t(rhs)\n    {}\n};\n#endif\n\ntemplate<class T>\nassign_impl<T> assign_object(T &t){\n    return assign_impl<T>(t);\n} \n\nstruct assign_level {\n    tracking_type & tracking_level;\n    void operator()(const unsigned int tracking_level_) const {\n        tracking_level = (0 == tracking_level_) ? false : true;\n    }\n    assign_level(tracking_type &  tracking_level_)\n        : tracking_level(tracking_level_)\n    {}\n};\n\ntemplate<class String, class Iterator>\nstruct append_string {\n    String & contents;\n    void operator()(Iterator start, Iterator end) const {\n    #if 0\n        typedef boost::archive::iterators::xml_unescape<Iterator> translator;\n        contents.append(\n            translator(BOOST_MAKE_PFTO_WRAPPER(start)), \n            translator(BOOST_MAKE_PFTO_WRAPPER(end))\n        );\n    #endif\n        contents.append(start, end);\n    }\n    append_string(String & contents_)\n        : contents(contents_)\n    {}\n};\n\ntemplate<class String>\nstruct append_char {\n    String & contents;\n    void operator()(const unsigned int char_value) const {\n        contents += static_cast<typename String::value_type>(char_value);\n    }\n    append_char(String & contents_)\n        : contents(contents_)\n    {}\n};\n\ntemplate<class String, unsigned int c>\nstruct append_lit {\n    String & contents;\n    template<class X, class Y>\n    void operator()(const X & /*x*/, const Y & /*y*/) const {\n        const typename String::value_type z = c;\n        contents += z;\n    }\n    append_lit(String & contents_)\n        : contents(contents_)\n    {}\n};\n\n#ifdef BOOST_MSVC\n#pragma warning(pop)\n#endif\n\n} // namespace anonymous\n\ntemplate<class CharType>\nbool basic_xml_grammar<CharType>::my_parse(\n    typename basic_xml_grammar<CharType>::IStream & is,\n    const rule_t & rule_,\n    CharType delimiter\n) const {\n    if(is.fail()){\n        return false;\n    }\n    \n    is >> std::noskipws;\n\n    std::basic_string<CharType> arg;\n    \n    for(;;){\n        CharType result;\n        is.get(result);\n        if(is.fail()){\n            boost::serialization::throw_exception(\n                boost::archive::archive_exception(\n                    archive_exception::input_stream_error,\n                    std::strerror(errno)\n                )\n            );\n        }\n        if(is.eof())\n            return false;\n        arg += result;\n        if(result == delimiter)\n            break;\n    }\n\n    // read just one more character.  This will be the newline after the tag\n    // this is so that the next operation will return fail if the archive\n    // is terminated.  This will permit the archive to be used for debug\n    // and transaction data logging in the standard way.\n    \n    parse_info<typename std::basic_string<CharType>::iterator> \n        result = boost::spirit::classic::parse(arg.begin(), arg.end(), rule_);\n    return result.hit;\n}\n\ntemplate<class CharType>\nbool basic_xml_grammar<CharType>::parse_start_tag(\n    typename basic_xml_grammar<CharType>::IStream & is\n){\n    rv.class_name.resize(0);\n    return my_parse(is, STag);\n}\n\ntemplate<class CharType>\nbool basic_xml_grammar<CharType>::parse_end_tag(IStream & is) const {\n    return my_parse(is, ETag);\n}\n\ntemplate<class CharType>\nbool basic_xml_grammar<CharType>::parse_string(IStream & is, StringType & s){\n    rv.contents.resize(0);\n    bool result = my_parse(is, content, '<');\n    // note: unget caused a problem with dinkumware.  replace with\n // is.unget();\n    // putback another delimiter instead\n    is.putback('<');\n    if(result)\n        s = rv.contents;\n    return result;\n}\n\ntemplate<class CharType>\nbasic_xml_grammar<CharType>::basic_xml_grammar(){\n    init_chset();\n\n    S =\n        +(Sch)\n    ;\n\n    // refactoring to workaround template depth on darwin\n    NameHead = (Letter | '_' | ':');\n    NameTail = *NameChar ;\n    Name =\n      NameHead >> NameTail\n    ;\n\n    Eq =\n        !S >> '=' >> !S\n    ;\n\n    AttributeList = \n        *(S >> Attribute)\n    ;\n    \n    STag =\n        !S\n        >> '<'\n        >> Name  [xml::assign_object(rv.object_name)]\n        >> AttributeList\n        >> !S\n        >> '>'\n    ;\n\n    ETag =\n        !S\n        >> \"</\"\n        >> Name [xml::assign_object(rv.object_name)]\n        >> !S \n        >> '>'\n    ;\n\n    // refactoring to workaround template depth on darwin\n    CharDataChars = +(anychar_p - chset_p(L\"&<\"));\n    CharData =  \n        CharDataChars [\n            xml::append_string<\n                StringType, \n                typename std::basic_string<CharType>::const_iterator\n            >(rv.contents)\n        ]\n    ;\n\n    // slight factoring works around ICE in msvc 6.0\n    CharRef1 = \n        str_p(L\"&#\") >> uint_p [xml::append_char<StringType>(rv.contents)] >> L';'\n    ;\n    CharRef2 =\n        str_p(L\"&#x\") >> hex_p [xml::append_char<StringType>(rv.contents)] >> L';'\n    ;\n    CharRef = CharRef1 | CharRef2 ;\n\n    AmpRef = str_p(L\"&amp;\")[xml::append_lit<StringType, L'&'>(rv.contents)];\n    LTRef = str_p(L\"&lt;\")[xml::append_lit<StringType, L'<'>(rv.contents)];\n    GTRef = str_p(L\"&gt;\")[xml::append_lit<StringType, L'>'>(rv.contents)];\n    AposRef = str_p(L\"&apos;\")[xml::append_lit<StringType, L'\\''>(rv.contents)];\n    QuoteRef = str_p(L\"&quot;\")[xml::append_lit<StringType, L'\"'>(rv.contents)];\n\n    Reference =\n        AmpRef\n        | LTRef\n        | GTRef\n        | AposRef\n        | QuoteRef\n        | CharRef\n    ;\n\n    content = \n        L\"<\" // should be end_p\n        | +(Reference | CharData) >> L\"<\"\n    ;\n\n    ClassIDAttribute = \n        str_p(BOOST_ARCHIVE_XML_CLASS_ID()) >> NameTail\n        >> Eq \n        >> L'\"'\n        >> int_p [xml::assign_object(rv.class_id)]\n        >> L'\"'\n      ;\n\n    ObjectIDAttribute = (\n        str_p(BOOST_ARCHIVE_XML_OBJECT_ID()) \n        | \n        str_p(BOOST_ARCHIVE_XML_OBJECT_REFERENCE()) \n        )\n        >> NameTail\n        >> Eq \n        >> L'\"'\n        >> L'_'\n        >> uint_p [xml::assign_object(rv.object_id)]\n        >> L'\"'\n    ;\n        \n    AmpName = str_p(L\"&amp;\")[xml::append_lit<StringType, L'&'>(rv.class_name)];\n    LTName = str_p(L\"&lt;\")[xml::append_lit<StringType, L'<'>(rv.class_name)];\n    GTName = str_p(L\"&gt;\")[xml::append_lit<StringType, L'>'>(rv.class_name)];\n    ClassNameChar = \n        AmpName\n        | LTName\n        | GTName\n        | (anychar_p - chset_p(L\"\\\"\")) [xml::append_char<StringType>(rv.class_name)]\n    ;\n    \n    ClassName =\n        * ClassNameChar\n    ;\n    \n    ClassNameAttribute = \n        str_p(BOOST_ARCHIVE_XML_CLASS_NAME()) \n        >> Eq \n        >> L'\"'\n        >> ClassName\n        >> L'\"'\n    ;\n\n    TrackingAttribute = \n        str_p(BOOST_ARCHIVE_XML_TRACKING())\n        >> Eq\n        >> L'\"'\n        >> uint_p [xml::assign_level(rv.tracking_level)]\n        >> L'\"'\n    ;\n\n    VersionAttribute = \n        str_p(BOOST_ARCHIVE_XML_VERSION())\n        >> Eq\n        >> L'\"'\n        >> uint_p [xml::assign_object(rv.version)]\n        >> L'\"'\n    ;\n\n    UnusedAttribute = \n        Name\n        >> Eq\n        >> L'\"'\n        >> !CharData\n        >> L'\"'\n    ;\n\n    Attribute =\n        ClassIDAttribute\n        | ObjectIDAttribute\n        | ClassNameAttribute\n        | TrackingAttribute\n        | VersionAttribute\n        | UnusedAttribute\n    ;\n\n    XMLDeclChars = *(anychar_p - chset_p(L\"?>\"));\n    XMLDecl =\n        !S\n        >> str_p(L\"<?xml\")\n        >> S\n        >> str_p(L\"version\")\n        >> Eq\n        >> str_p(L\"\\\"1.0\\\"\")\n        >> XMLDeclChars\n        >> !S\n        >> str_p(L\"?>\")\n    ;\n\n    DocTypeDeclChars = *(anychar_p - chset_p(L\">\"));\n    DocTypeDecl =\n        !S\n        >> str_p(L\"<!DOCTYPE\")\n        >> DocTypeDeclChars\n        >> L'>'\n    ;\n\n    SignatureAttribute = \n        str_p(L\"signature\") \n        >> Eq \n        >> L'\"'\n        >> Name [xml::assign_object(rv.class_name)]\n        >> L'\"'\n    ;\n    \n    SerializationWrapper =\n        !S\n        >> str_p(L\"<boost_serialization\")\n        >> S\n        >> ( (SignatureAttribute >> S >> VersionAttribute)\n           | (VersionAttribute >> S >> SignatureAttribute)\n           )\n        >> !S\n        >> L'>'\n    ;\n}\n\ntemplate<class CharType>\nvoid basic_xml_grammar<CharType>::init(IStream & is){\n    init_chset();\n    if(! my_parse(is, XMLDecl))\n        boost::serialization::throw_exception(\n            xml_archive_exception(xml_archive_exception::xml_archive_parsing_error)\n        );\n    if(! my_parse(is, DocTypeDecl))\n        boost::serialization::throw_exception(\n            xml_archive_exception(xml_archive_exception::xml_archive_parsing_error)\n        );\n    if(! my_parse(is, SerializationWrapper))\n        boost::serialization::throw_exception(\n            xml_archive_exception(xml_archive_exception::xml_archive_parsing_error)\n        );\n    if(! std::equal(rv.class_name.begin(), rv.class_name.end(), BOOST_ARCHIVE_SIGNATURE()))\n        boost::serialization::throw_exception(\n            archive_exception(archive_exception::invalid_signature)\n        );\n}\n\ntemplate<class CharType>\nbool basic_xml_grammar<CharType>::windup(IStream & is) {\n    return my_parse(is, ETag);\n}\n\n} // namespace archive\n} // namespace boost\n"
  },
  {
    "path": "src/binary_iarchive.cpp",
    "content": "/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// binary_iarchive.cpp:\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com . \n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for updates, documentation, and revision history.\n\n#include <istream>\n\n#define BOOST_ARCHIVE_SOURCE\n#include <boost/serialization/config.hpp>\n#include <boost/archive/binary_iarchive.hpp>\n#include <boost/archive/detail/archive_serializer_map.hpp>\n\n#include <boost/archive/impl/archive_serializer_map.ipp>\n#include <boost/archive/impl/basic_binary_iprimitive.ipp>\n#include <boost/archive/impl/basic_binary_iarchive.ipp>\n\nnamespace boost {\nnamespace archive {\n\n// explicitly instantiate for this type of stream\ntemplate class detail::archive_serializer_map<binary_iarchive>;\ntemplate class basic_binary_iprimitive<\n    binary_iarchive,\n    std::istream::char_type, \n    std::istream::traits_type\n>;\ntemplate class basic_binary_iarchive<binary_iarchive> ;\ntemplate class binary_iarchive_impl<\n    binary_iarchive, \n    std::istream::char_type, \n    std::istream::traits_type\n>;\n\n} // namespace archive\n} // namespace boost\n"
  },
  {
    "path": "src/binary_oarchive.cpp",
    "content": "/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// binary_oarchive.cpp:\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com . \n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for updates, documentation, and revision history.\n\n#include <ostream>\n\n#define BOOST_ARCHIVE_SOURCE\n#include <boost/serialization/config.hpp>\n#include <boost/archive/binary_oarchive.hpp>\n#include <boost/archive/detail/archive_serializer_map.hpp>\n\n// explicitly instantiate for this type of binary stream\n#include <boost/archive/impl/archive_serializer_map.ipp>\n#include <boost/archive/impl/basic_binary_oprimitive.ipp>\n#include <boost/archive/impl/basic_binary_oarchive.ipp>\n\nnamespace boost {\nnamespace archive {\n\ntemplate class detail::archive_serializer_map<binary_oarchive>;\ntemplate class basic_binary_oprimitive<\n    binary_oarchive, \n    std::ostream::char_type, \n    std::ostream::traits_type\n>;\ntemplate class basic_binary_oarchive<binary_oarchive> ;\ntemplate class binary_oarchive_impl<\n    binary_oarchive, \n    std::ostream::char_type, \n    std::ostream::traits_type\n>;\n\n} // namespace archive\n} // namespace boost\n"
  },
  {
    "path": "src/binary_wiarchive.cpp",
    "content": "/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// binary_wiarchive.cpp:\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com . \n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for updates, documentation, and revision history.\n\n#include <boost/config.hpp>\n\n#ifdef BOOST_NO_STD_WSTREAMBUF\n#error \"wide char i/o not supported on this platform\"\n#else\n\n#define BOOST_WARCHIVE_SOURCE\n#include <boost/archive/binary_wiarchive.hpp>\n#include <boost/archive/detail/archive_serializer_map.hpp>\n\n// explicitly instantiate for this type of text stream\n#include <boost/archive/impl/archive_serializer_map.ipp>\n#include <boost/archive/impl/basic_binary_iprimitive.ipp>\n#include <boost/archive/impl/basic_binary_iarchive.ipp>\n\nnamespace boost {\nnamespace archive {\n\n// explicitly instantiate for this type of text stream\ntemplate class detail::archive_serializer_map<binary_wiarchive>;\ntemplate class basic_binary_iprimitive<\n    binary_wiarchive,\n    wchar_t, \n    std::char_traits<wchar_t> \n>;\ntemplate class basic_binary_iarchive<binary_wiarchive> ;\ntemplate class binary_iarchive_impl<\n    binary_wiarchive, \n    wchar_t, \n    std::char_traits<wchar_t> \n>;\n\n} // namespace archive\n} // namespace boost\n\n#endif  // BOOST_NO_STD_WSTREAMBUF\n\n"
  },
  {
    "path": "src/binary_woarchive.cpp",
    "content": "/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// binary_woarchive.cpp:\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com . \n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for updates, documentation, and revision history.\n\n#include <boost/config.hpp>\n\n#ifdef BOOST_NO_STD_WSTREAMBUF\n#error \"wide char i/o not supported on this platform\"\n#else\n\n#define BOOST_WARCHIVE_SOURCE\n#include <boost/archive/binary_woarchive.hpp>\n\n// explicitly instantiate for this type of text stream\n#include <boost/archive/impl/archive_serializer_map.ipp>\n#include <boost/archive/impl/basic_binary_oprimitive.ipp>\n#include <boost/archive/impl/basic_binary_oarchive.ipp>\n\nnamespace boost {\nnamespace archive {\n\ntemplate class detail::archive_serializer_map<binary_woarchive>;\ntemplate class basic_binary_oprimitive<\n    binary_woarchive, \n    wchar_t, \n    std::char_traits<wchar_t> \n>;\ntemplate class basic_binary_oarchive<binary_woarchive> ;\ntemplate class binary_oarchive_impl<\n    binary_woarchive, \n    wchar_t, \n    std::char_traits<wchar_t> \n>;\n\n} // namespace archive\n} // namespace boost\n\n#endif // BOOST_NO_STD_WSTREAMBUF\n"
  },
  {
    "path": "src/codecvt_null.cpp",
    "content": "/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// codecvt_null.cpp\n\n// Copyright (c) 2004 Robert Ramey, Indiana University (garcia@osl.iu.edu)\n// Andrew Lumsdaine, Indiana University (lums@osl.iu.edu). \n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n#define BOOST_WARCHIVE_SOURCE\n#include <boost/serialization/config.hpp>\n#include <boost/archive/codecvt_null.hpp>\n\n// codecvt implementation for passing wchar_t objects to char output\n// without any translation whatever.  Used to implement binary output\n// of wchar_t objects.\n\nnamespace boost {\nnamespace archive {\n\nBOOST_SYMBOL_EXPORT std::codecvt_base::result\ncodecvt_null<wchar_t>::do_out(\n    std::mbstate_t & /*state*/,\n    const wchar_t * first1, \n    const wchar_t * last1,\n    const wchar_t * & next1,\n    char * first2, \n    char * last2, \n    char * & next2\n) const {\n    while(first1 != last1){\n        // Per std::22.2.1.5.2/2, we can store no more that\n        // last2-first2 characters. If we need to more encode\n        // next internal char type, return 'partial'.\n        if(static_cast<int>(sizeof(wchar_t)) > (last2 - first2)){\n            next1 = first1;\n            next2 = first2;\n            return std::codecvt_base::partial;\n        }\n        * reinterpret_cast<wchar_t *>(first2) = * first1++;\n        first2 += sizeof(wchar_t);\n\n    }\n    next1 = first1;\n    next2 = first2;\n    return std::codecvt_base::ok;\n}\n\nBOOST_SYMBOL_EXPORT std::codecvt_base::result\ncodecvt_null<wchar_t>::do_in(\n    std::mbstate_t & /*state*/,\n    const char * first1, \n    const char * last1, \n    const char * & next1,\n    wchar_t * first2,\n    wchar_t * last2,\n    wchar_t * & next2\n) const {\n    // Process input characters until we've run of them,\n    // or the number of remaining characters is not\n    // enough to construct another output character,\n    // or we've run out of place for output characters.\n    while(first2 != last2){\n        // Have we converted all input characters? \n        // Return with 'ok', if so.\n        if (first1 == last1)\n             break;\n        // Do we have less input characters than needed\n        // for a single output character?        \n        if(static_cast<int>(sizeof(wchar_t)) > (last1 - first1)){\n            next1 = first1;\n            next2 = first2;\n            return std::codecvt_base::partial; \n        }\n        *first2++ = * reinterpret_cast<const wchar_t *>(first1);\n        first1 += sizeof(wchar_t);\n    }\n    next1 = first1;\n    next2 = first2;\n    return std::codecvt_base::ok;\n}\n\nBOOST_SYMBOL_EXPORT codecvt_null<wchar_t>::codecvt_null(std::size_t no_locale_manage) :\n    std::codecvt<wchar_t, char, std::mbstate_t>(no_locale_manage)\n{}\n\nBOOST_SYMBOL_EXPORT codecvt_null<wchar_t>::~codecvt_null()\n{}\n\n} // namespace archive\n} // namespace boost\n"
  },
  {
    "path": "src/extended_type_info.cpp",
    "content": "/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// extended_type_info.cpp: implementation for portable version of type_info\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com . \n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for updates, documentation, and revision history.\n\n#if (defined _MSC_VER) && (_MSC_VER == 1200)\n#  pragma warning (disable : 4786) // too long name, harmless warning\n#endif\n\n#include <algorithm>\n#include <set>\n#include <utility>\n#include <boost/assert.hpp>\n#include <cstddef> // NULL\n\n#include <cstring>\n#if defined(BOOST_NO_STDC_NAMESPACE)\nnamespace std{ using ::strcmp; }\n#endif\n\n#include <boost/config.hpp> // msvc needs this to suppress warning\n\n#include <boost/core/no_exceptions_support.hpp>\n\n// it marks our code with proper attributes as being exported when\n// we're compiling it while marking it import when just the headers\n// is being included.\n#define BOOST_SERIALIZATION_SOURCE\n#include <boost/serialization/config.hpp>\n#include <boost/serialization/singleton.hpp>\n#include <boost/serialization/force_include.hpp>\n#include <boost/serialization/extended_type_info.hpp>\n\n#ifdef BOOST_MSVC\n#  pragma warning(push)\n#  pragma warning(disable : 4511 4512)\n#endif\n\nnamespace boost { \nnamespace serialization {\nnamespace detail {\n\nstruct key_compare\n{\n    bool\n    operator()(\n        const extended_type_info * lhs, \n        const extended_type_info * rhs\n    ) const {\n        // performance shortcut\n        if(lhs == rhs)\n            return false;\n        const char * l = lhs->get_key();\n        BOOST_ASSERT(NULL != l);\n        const char * r = rhs->get_key();\n        BOOST_ASSERT(NULL != r);\n        // performance shortcut\n        // shortcut to exploit string pooling\n        if(l == r)\n            return false;\n        // for exported types, use the string key so that\n        // multiple instances in different translation units\n        // can be matched up\n        return std::strcmp(l, r) < 0;\n    }\n};\n\ntypedef std::multiset<const extended_type_info *, key_compare> ktmap;\n\n#ifdef BOOST_MSVC\n#  pragma warning(push)\n#  pragma warning(disable : 4511 4512)\n#endif\n\nclass extended_type_info_arg : public extended_type_info\n{\n    bool\n    is_less_than(const extended_type_info & /*rhs*/) const BOOST_OVERRIDE {\n        BOOST_ASSERT(false);\n        return false;\n    }\n    bool\n    is_equal(const extended_type_info & /*rhs*/) const BOOST_OVERRIDE {\n        BOOST_ASSERT(false);\n        return false;\n    }\n    const char * get_debug_info() const BOOST_OVERRIDE {\n        return get_key();\n    }\n    void * construct(unsigned int /*count*/, ...) const BOOST_OVERRIDE {\n        BOOST_ASSERT(false);\n        return NULL;\n    }\n    void destroy(void const * const /*p*/) const BOOST_OVERRIDE {\n        BOOST_ASSERT(false);\n    }\npublic:\n    extended_type_info_arg(const char * key) :\n        extended_type_info(0, key)\n    {}\n\n    ~extended_type_info_arg() BOOST_OVERRIDE {}\n};\n\n#ifdef BOOST_MSVC\n#  pragma warning(pop)\n#endif\n\n} // namespace detail\n\nBOOST_SERIALIZATION_DECL void  \nextended_type_info::key_register() const{\n    if(NULL == get_key())\n        return;\n    singleton<detail::ktmap>::get_mutable_instance().insert(this);\n}\n\nBOOST_SERIALIZATION_DECL void  \nextended_type_info::key_unregister() const{\n    if(NULL == get_key())\n        return;\n    // note: it's been discovered that at least one platform is not guaranteed\n    // to destroy singletons reverse order of construction.  So we can't\n    // use a runtime assert here.  Leave this in a reminder not to do this!\n    // BOOST_ASSERT(! singleton<detail::ktmap>::is_destroyed());\n    if(! singleton<detail::ktmap>::is_destroyed()){\n        detail::ktmap & x = singleton<detail::ktmap>::get_mutable_instance();\n        detail::ktmap::iterator start = x.lower_bound(this);\n        detail::ktmap::iterator end = x.upper_bound(this);\n        // remove entry in map which corresponds to this type\n        for(;start != end; ++start){\n            if(this == *start){\n                x.erase(start);\n                break;\n            }\n        }\n    }\n}\n\nBOOST_SERIALIZATION_DECL const extended_type_info *\nextended_type_info::find(const char *key) {\n    BOOST_ASSERT(NULL != key);\n    const detail::ktmap & k = singleton<detail::ktmap>::get_const_instance();\n    const detail::extended_type_info_arg eti_key(key);\n    const detail::ktmap::const_iterator it = k.find(& eti_key);\n    if(k.end() == it)\n        return NULL;\n    return *(it);\n}\n\nBOOST_SERIALIZATION_DECL\nextended_type_info::extended_type_info(\n    const unsigned int type_info_key,\n    const char * key\n) :\n    m_type_info_key(type_info_key),\n    m_key(key)\n{\n}\n\nBOOST_SERIALIZATION_DECL \nextended_type_info::~extended_type_info(){\n}\n\nBOOST_SERIALIZATION_DECL bool\nextended_type_info::operator<(const extended_type_info &rhs) const {\n    // short cut for a common cases\n    if(this == & rhs)\n        return false;\n    if(m_type_info_key == rhs.m_type_info_key){\n        return is_less_than(rhs);\n    }\n    if(m_type_info_key < rhs.m_type_info_key)\n        return true;\n    return false;\n}\n\nBOOST_SERIALIZATION_DECL bool\nextended_type_info::operator==(const extended_type_info &rhs) const {\n    // short cut for a common cases\n    if(this == & rhs)\n        return true;\n    if(m_type_info_key != rhs.m_type_info_key){\n        return false;\n    }\n    return is_equal(rhs);\n}\n\n} // namespace serialization\n} // namespace boost\n"
  },
  {
    "path": "src/extended_type_info_no_rtti.cpp",
    "content": "/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// extended_type_info_no_rtti.cpp: specific implementation of type info\n// that is NOT based on typeid\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com . \n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for updates, documentation, and revision history.\n\n#include <cstring>\n#include <cstddef> // NULL\n#include <boost/assert.hpp>\n\n#include <boost/config.hpp>\n#if defined(BOOST_NO_STDC_NAMESPACE)\nnamespace std{ using ::strcmp; }\n#endif\n\n// it marks our code with proper attributes as being exported when\n// we're compiling it while marking it import when just the headers\n// is being included.\n#define BOOST_SERIALIZATION_SOURCE\n#include <boost/serialization/config.hpp>\n#include <boost/serialization/extended_type_info_no_rtti.hpp>\n\n#define EXTENDED_TYPE_INFO_NO_RTTI_KEY 2\n\nnamespace boost { \nnamespace serialization { \nnamespace no_rtti_system { \n\nBOOST_SERIALIZATION_DECL  \nextended_type_info_no_rtti_0::extended_type_info_no_rtti_0(\n    const char * key\n) :\n    extended_type_info(EXTENDED_TYPE_INFO_NO_RTTI_KEY, key)\n{}\n\nBOOST_SERIALIZATION_DECL bool\nextended_type_info_no_rtti_0::is_less_than(\n    const boost::serialization::extended_type_info &rhs) const \n{\n    // shortcut for common case\n    if(this == & rhs)\n        return false;\n    const char * l = get_key();\n    const char * r = rhs.get_key();\n    // if this assertion is triggered, it could mean one of the following\n    // a) This class was never exported - make sure all calls which use\n    // this method of type id are in fact exported.\n    // b) This class was used (e.g. serialized through a pointer) before\n    // it was exported.  Make sure that classes which use this method\n    // of type id are NOT \"automatically\" registered by serializing \n    // through a pointer to the most derived class.  OR make sure\n    // that the BOOST_CLASS_EXPORT is included in every file\n    // which does this.\n    BOOST_ASSERT(NULL != l);\n    BOOST_ASSERT(NULL != r);\n    return std::strcmp(l, r) < 0;\n}\n\nBOOST_SERIALIZATION_DECL bool\nextended_type_info_no_rtti_0::is_equal(\n    const boost::serialization::extended_type_info &rhs) const \n{\n    // shortcut for common case\n    if(this == & rhs)\n        return true;\n    // null keys don't match with anything\n    const char * l = get_key();\n    BOOST_ASSERT(NULL != l);\n    if(NULL == l)\n        return false;\n    const char * r = rhs.get_key();\n    BOOST_ASSERT(NULL != r);\n    if(NULL == r)\n        return false;\n    return 0 == std::strcmp(l, r);\n}\n\nBOOST_SERIALIZATION_DECL  \nextended_type_info_no_rtti_0::~extended_type_info_no_rtti_0()\n{}\n\n} // namespace detail\n} // namespace serialization\n} // namespace boost\n"
  },
  {
    "path": "src/extended_type_info_typeid.cpp",
    "content": "/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// extended_type_info_typeid.cpp: specific implementation of type info\n// that is based on typeid\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com . \n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for updates, documentation, and revision history.\n\n#include <algorithm>\n#include <cstddef> // NULL\n#include <set>\n#include <typeinfo>\n\n#include <boost/assert.hpp>\n#include <boost/core/no_exceptions_support.hpp>\n\n// it marks our code with proper attributes as being exported when\n// we're compiling it while marking it import when just the headers\n// is being included.\n#define BOOST_SERIALIZATION_SOURCE\n#include <boost/serialization/config.hpp>\n#include <boost/serialization/singleton.hpp>\n#include <boost/serialization/extended_type_info_typeid.hpp>\n\nnamespace boost { \nnamespace serialization { \nnamespace typeid_system {\n\n#define EXTENDED_TYPE_INFO_TYPE_KEY 1\n\nstruct type_compare\n{\n    bool\n    operator()(\n        const extended_type_info_typeid_0 * lhs,\n        const extended_type_info_typeid_0 * rhs\n    ) const {\n        return lhs->is_less_than(*rhs);\n    }\n};\n\ntypedef std::multiset<\n    const extended_type_info_typeid_0 *,\n    type_compare\n> tkmap;\n    \nBOOST_SERIALIZATION_DECL bool\nextended_type_info_typeid_0::is_less_than(\n    const boost::serialization::extended_type_info & rhs\n) const {\n    // shortcut for common case\n    if(this == & rhs)\n        return false;\n    return 0 != m_ti->before(\n        *(static_cast<const extended_type_info_typeid_0 &>(rhs).m_ti)\n    );\n}\n\nBOOST_SERIALIZATION_DECL bool\nextended_type_info_typeid_0::is_equal(\n    const boost::serialization::extended_type_info & rhs\n) const {\n    return \n        // note: std::type_info == operator returns an int !!!\n        // the following permits conversion to bool without a warning.\n        ! (\n        * m_ti \n        != *(static_cast<const extended_type_info_typeid_0 &>(rhs).m_ti)\n        )\n    ;\n}\n\nBOOST_SERIALIZATION_DECL\nextended_type_info_typeid_0::extended_type_info_typeid_0(\n    const char * key\n) :\n    extended_type_info(EXTENDED_TYPE_INFO_TYPE_KEY, key),\n    m_ti(NULL)\n{}\n\nBOOST_SERIALIZATION_DECL\nextended_type_info_typeid_0::~extended_type_info_typeid_0()\n{}\n\nBOOST_SERIALIZATION_DECL void \nextended_type_info_typeid_0::type_register(const std::type_info & ti){\n    m_ti = & ti;\n    singleton<tkmap>::get_mutable_instance().insert(this);\n}\n\nBOOST_SERIALIZATION_DECL void \nextended_type_info_typeid_0::type_unregister()\n{\n    if(NULL != m_ti){\n        // note: previously this conditional was a runtime assertion with\n        // BOOST_ASSERT.  We've changed it because we've discovered that at\n        // least one platform is not guaranteed to destroy singletons in\n        // reverse order of destruction.\n        // BOOST_ASSERT(! singleton<tkmap>::is_destroyed());\n        if(! singleton<tkmap>::is_destroyed()){\n            tkmap & x = singleton<tkmap>::get_mutable_instance();\n\n            // remove all entries in map which corresponds to this type\n            // make sure that we don't use any invalidated iterators\n            while(true){\n                const tkmap::iterator & it = x.find(this);\n                if(it == x.end())\n                    break;\n                x.erase(it);\n            }\n        }\n    }\n    m_ti = NULL;\n}\n\n#ifdef BOOST_MSVC\n#  pragma warning(push)\n#  pragma warning(disable : 4511 4512)\n#endif\n\n// this derivation is used for creating search arguments\nclass extended_type_info_typeid_arg : \n    public extended_type_info_typeid_0\n{\n    void * construct(unsigned int /*count*/, ...) const BOOST_OVERRIDE {\n        BOOST_ASSERT(false);\n        return NULL;\n    }\n    void destroy(void const * const /*p*/) const BOOST_OVERRIDE {\n        BOOST_ASSERT(false);\n    }\npublic:\n    extended_type_info_typeid_arg(const std::type_info & ti) :\n        extended_type_info_typeid_0(NULL)\n    { \n        // note absence of self register and key as this is used only as\n        // search argument given a type_info reference and is not to \n        // be added to the map.\n        m_ti = & ti;\n    }\n    ~extended_type_info_typeid_arg() BOOST_OVERRIDE {\n        m_ti = NULL;\n    }\n};\n\n#ifdef BOOST_MSVC\n#  pragma warning(pop)\n#endif\n\nBOOST_SERIALIZATION_DECL const extended_type_info *\nextended_type_info_typeid_0::get_extended_type_info(\n    const std::type_info & ti\n) const {\n    typeid_system::extended_type_info_typeid_arg etia(ti);\n    const tkmap & t = singleton<tkmap>::get_const_instance();\n    const tkmap::const_iterator it = t.find(& etia);\n    if(t.end() == it)\n        return NULL;\n    return *(it);\n}\n\n} // namespace detail\n} // namespace serialization\n} // namespace boost\n"
  },
  {
    "path": "src/polymorphic_binary_iarchive.cpp",
    "content": "/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// polymorphic_binary_iarchive.cpp:\n\n// (C) Copyright 2018 Robert Ramey - http://www.rrsd.com .\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for updates, documentation, and revision history.\n\n#if (defined _MSC_VER) && (_MSC_VER == 1200)\n#  pragma warning (disable : 4786) // too long name, harmless warning\n#endif\n\n#define BOOST_ARCHIVE_SOURCE\n#include <boost/serialization/config.hpp>\n#include <boost/archive/polymorphic_binary_iarchive.hpp>\n\n// explicitly instantiate for this type of text stream\n#include <boost/archive/impl/archive_serializer_map.ipp>\n\nnamespace boost {\nnamespace archive {\nnamespace detail {\n\ntemplate class archive_serializer_map<polymorphic_binary_iarchive>;\n\n} // detail\n} // archive\n} // boost\n"
  },
  {
    "path": "src/polymorphic_binary_oarchive.cpp",
    "content": "/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// polymorphic_binary_oarchive.cpp:\n\n// (C) Copyright 2018 Robert Ramey - http://www.rrsd.com .\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for updates, documentation, and revision history.\n\n#if (defined _MSC_VER) && (_MSC_VER == 1200)\n#  pragma warning (disable : 4786) // too long name, harmless warning\n#endif\n\n#define BOOST_ARCHIVE_SOURCE\n#include <boost/serialization/config.hpp>\n#include <boost/archive/polymorphic_binary_oarchive.hpp>\n\n// explicitly instantiate for this type of text stream\n#include <boost/archive/impl/archive_serializer_map.ipp>\n\nnamespace boost {\nnamespace archive {\nnamespace detail {\n\ntemplate class detail::archive_serializer_map<polymorphic_binary_oarchive>;\n\n} // detail\n} // archive\n} // boost\n"
  },
  {
    "path": "src/polymorphic_iarchive.cpp",
    "content": "/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// polymorphic_iarchive.cpp:\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com . \n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for updates, documentation, and revision history.\n\n#if (defined _MSC_VER) && (_MSC_VER == 1200)\n#  pragma warning (disable : 4786) // too long name, harmless warning\n#endif\n\n#define BOOST_ARCHIVE_SOURCE\n#include <boost/serialization/config.hpp>\n#include <boost/archive/detail/archive_serializer_map.hpp>\n\n#include <boost/archive/impl/archive_serializer_map.ipp>\n#include <boost/archive/polymorphic_iarchive.hpp>\n\nnamespace boost {\nnamespace archive {\nnamespace detail {\n\ntemplate class archive_serializer_map<polymorphic_iarchive>;\n\n} // detail\n} // archive\n} // boost\n"
  },
  {
    "path": "src/polymorphic_oarchive.cpp",
    "content": "/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// polymorphic_oarchive.cpp:\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com . \n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for updates, documentation, and revision history.\n\n#if (defined _MSC_VER) && (_MSC_VER == 1200)\n#  pragma warning (disable : 4786) // too long name, harmless warning\n#endif\n\n#define BOOST_ARCHIVE_SOURCE\n#include <boost/serialization/config.hpp>\n#include <boost/archive/detail/archive_serializer_map.hpp>\n\n#include <boost/archive/impl/archive_serializer_map.ipp>\n#include <boost/archive/polymorphic_oarchive.hpp>\n\nnamespace boost {\nnamespace archive {\nnamespace detail {\n\ntemplate class archive_serializer_map<polymorphic_oarchive>;\n\n} // detail\n} // archive\n} // boost\n"
  },
  {
    "path": "src/polymorphic_text_iarchive.cpp",
    "content": "/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// polymorphic_text_iarchive.cpp:\n\n// (C) Copyright 2018 Robert Ramey - http://www.rrsd.com .\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for updates, documentation, and revision history.\n\n#if (defined _MSC_VER) && (_MSC_VER == 1200)\n#  pragma warning (disable : 4786) // too long name, harmless warning\n#endif\n\n#define BOOST_ARCHIVE_SOURCE\n#include <boost/serialization/config.hpp>\n#include <boost/archive/polymorphic_text_iarchive.hpp>\n\n// explicitly instantiate for this type of text stream\n#include <boost/archive/impl/archive_serializer_map.ipp>\n\nnamespace boost {\nnamespace archive {\nnamespace detail {\n\ntemplate class archive_serializer_map<polymorphic_text_iarchive>;\n\n} // detail\n} // archive\n} // boost\n"
  },
  {
    "path": "src/polymorphic_text_oarchive.cpp",
    "content": "/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// polymorphic_text_oarchive.cpp:\n\n// (C) Copyright 2018 Robert Ramey - http://www.rrsd.com .\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for updates, documentation, and revision history.\n\n#if (defined _MSC_VER) && (_MSC_VER == 1200)\n#  pragma warning (disable : 4786) // too long name, harmless warning\n#endif\n\n#define BOOST_ARCHIVE_SOURCE\n#include <boost/serialization/config.hpp>\n#include <boost/archive/polymorphic_text_oarchive.hpp>\n\n// explicitly instantiate for this type of text stream\n#include <boost/archive/impl/archive_serializer_map.ipp>\n\nnamespace boost {\nnamespace archive {\nnamespace detail {\n\ntemplate class detail::archive_serializer_map<polymorphic_text_oarchive>;\n\n} // detail\n} // archive\n} // boost\n"
  },
  {
    "path": "src/polymorphic_text_wiarchive.cpp",
    "content": "/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// polymorphic_text_wiarchive.cpp:\n\n// (C) Copyright 2018 Robert Ramey - http://www.rrsd.com .\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for updates, documentation, and revision history.\n\n#if (defined _MSC_VER) && (_MSC_VER == 1200)\n#  pragma warning (disable : 4786) // too long name, harmless warning\n#endif\n\n#define BOOST_ARCHIVE_SOURCE\n#include <boost/serialization/config.hpp>\n#include <boost/archive/polymorphic_text_wiarchive.hpp>\n\n// explicitly instantiate for this type of text stream\n#include <boost/archive/impl/archive_serializer_map.ipp>\n\nnamespace boost {\nnamespace archive {\nnamespace detail {\n\ntemplate class archive_serializer_map<polymorphic_text_wiarchive>;\n\n} // detail\n} // archive\n} // boost\n"
  },
  {
    "path": "src/polymorphic_text_woarchive.cpp",
    "content": "/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// polymorphic_text_woarchive.cpp:\n\n// (C) Copyright 2018 Robert Ramey - http://www.rrsd.com .\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for updates, documentation, and revision history.\n\n#if (defined _MSC_VER) && (_MSC_VER == 1200)\n#  pragma warning (disable : 4786) // too long name, harmless warning\n#endif\n\n#define BOOST_ARCHIVE_SOURCE\n#include <boost/serialization/config.hpp>\n#include <boost/archive/polymorphic_text_woarchive.hpp>\n\n// explicitly instantiate for this type of text stream\n#include <boost/archive/impl/archive_serializer_map.ipp>\n\nnamespace boost {\nnamespace archive {\nnamespace detail {\n\ntemplate class detail::archive_serializer_map<polymorphic_text_woarchive>;\n\n} // detail\n} // archive\n} // boost\n"
  },
  {
    "path": "src/polymorphic_xml_iarchive.cpp",
    "content": "/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// polymorphic_xml_iarchive.cpp:\n\n// (C) Copyright 2018 Robert Ramey - http://www.rrsd.com .\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for updates, documentation, and revision history.\n\n#if (defined _MSC_VER) && (_MSC_VER == 1200)\n#  pragma warning (disable : 4786) // too long name, harmless warning\n#endif\n\n#define BOOST_ARCHIVE_SOURCE\n#include <boost/serialization/config.hpp>\n#include <boost/archive/polymorphic_xml_iarchive.hpp>\n\n// explicitly instantiate for this type of text stream\n#include <boost/archive/impl/archive_serializer_map.ipp>\n\nnamespace boost {\nnamespace archive {\nnamespace detail {\n\ntemplate class archive_serializer_map<polymorphic_xml_iarchive>;\n\n} // detail\n} // archive\n} // boost\n"
  },
  {
    "path": "src/polymorphic_xml_oarchive.cpp",
    "content": "/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// polymorphic_xml_oarchive.cpp:\n\n// (C) Copyright 2018 Robert Ramey - http://www.rrsd.com .\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for updates, documentation, and revision history.\n\n#if (defined _MSC_VER) && (_MSC_VER == 1200)\n#  pragma warning (disable : 4786) // too long name, harmless warning\n#endif\n\n#define BOOST_ARCHIVE_SOURCE\n#include <boost/serialization/config.hpp>\n#include <boost/archive/polymorphic_xml_oarchive.hpp>\n\n// explicitly instantiate for this type of text stream\n#include <boost/archive/impl/archive_serializer_map.ipp>\n\nnamespace boost {\nnamespace archive {\nnamespace detail {\n\ntemplate class detail::archive_serializer_map<polymorphic_xml_oarchive>;\n\n} // detail\n} // archive\n} // boost\n"
  },
  {
    "path": "src/polymorphic_xml_wiarchive.cpp",
    "content": "/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// polymorphic_xml_wiarchive.cpp:\n\n// (C) Copyright 2018 Robert Ramey - http://www.rrsd.com .\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for updates, documentation, and revision history.\n\n#if (defined _MSC_VER) && (_MSC_VER == 1200)\n#  pragma warning (disable : 4786) // too long name, harmless warning\n#endif\n\n#define BOOST_ARCHIVE_SOURCE\n#include <boost/serialization/config.hpp>\n#include <boost/archive/polymorphic_xml_wiarchive.hpp>\n\n// explicitly instantiate for this type of text stream\n#include <boost/archive/impl/archive_serializer_map.ipp>\n\nnamespace boost {\nnamespace archive {\nnamespace detail {\n\ntemplate class archive_serializer_map<polymorphic_xml_wiarchive>;\n\n} // detail\n} // archive\n} // boost\n"
  },
  {
    "path": "src/polymorphic_xml_woarchive.cpp",
    "content": "/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// polymorphic_xml_woarchive.cpp:\n\n// (C) Copyright 2018 Robert Ramey - http://www.rrsd.com .\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for updates, documentation, and revision history.\n\n#if (defined _MSC_VER) && (_MSC_VER == 1200)\n#  pragma warning (disable : 4786) // too long name, harmless warning\n#endif\n\n#define BOOST_ARCHIVE_SOURCE\n#include <boost/serialization/config.hpp>\n#include <boost/archive/polymorphic_xml_woarchive.hpp>\n\n// explicitly instantiate for this type of text stream\n#include <boost/archive/impl/archive_serializer_map.ipp>\n\nnamespace boost {\nnamespace archive {\nnamespace detail {\n\ntemplate class detail::archive_serializer_map<polymorphic_xml_woarchive>;\n\n} // detail\n} // archive\n} // boost\n"
  },
  {
    "path": "src/stl_port.cpp",
    "content": "/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// stl_port.cpp: implementation of run-time casting of void pointers\n\n// (C) Copyright 2005 Robert Ramey - http://www.rrsd.com . \n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for updates, documentation, and revision history.\n\n#if (defined _MSC_VER) && (_MSC_VER == 1200)\n# pragma warning (disable : 4786) // too long name, harmless warning\n#endif\n\n// this befuddles the msvc 6 compiler so we can't use it\n#if ! ((defined _MSC_VER) && (_MSC_VER <= 1300)) \n\n#include <boost/config.hpp>\n\n#if defined(__SGI_STL_PORT) && (__SGI_STL_PORT < 0x500)\n\n#include <boost/archive/codecvt_null.hpp>\n\n// explicit instantiation\n\nnamespace std {\n\ntemplate\nlocale::locale(\n    const locale& __loc, boost::archive::codecvt_null<char> * __f\n);\n\ntemplate\nlocale::locale(\n    const locale& __loc, boost::archive::codecvt_null<wchar_t> * __f\n);\n\n} // namespace std\n\n#endif\n\n#endif\n"
  },
  {
    "path": "src/text_iarchive.cpp",
    "content": "/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// text_iarchive.cpp:\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com . \n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for updates, documentation, and revision history.\n\n#if (defined _MSC_VER) && (_MSC_VER == 1200)\n#  pragma warning (disable : 4786) // too long name, harmless warning\n#endif\n\n#define BOOST_ARCHIVE_SOURCE\n#include <boost/serialization/config.hpp>\n#include <boost/archive/text_iarchive.hpp>\n#include <boost/archive/detail/archive_serializer_map.hpp>\n\n// explicitly instantiate for this type of text stream\n#include <boost/archive/impl/archive_serializer_map.ipp>\n#include <boost/archive/impl/basic_text_iarchive.ipp>\n#include <boost/archive/impl/text_iarchive_impl.ipp>\n\nnamespace boost {\nnamespace archive {\n\ntemplate class detail::archive_serializer_map<text_iarchive>;\ntemplate class basic_text_iarchive<text_iarchive> ;\ntemplate class text_iarchive_impl<text_iarchive> ;\n\n} // namespace archive\n} // namespace boost\n"
  },
  {
    "path": "src/text_oarchive.cpp",
    "content": "/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// text_oarchive.cpp:\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com . \n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for updates, documentation, and revision history.\n\n#if (defined _MSC_VER) && (_MSC_VER == 1200)\n#  pragma warning (disable : 4786) // too long name, harmless warning\n#endif\n\n#define BOOST_ARCHIVE_SOURCE\n#include <boost/serialization/config.hpp>\n#include <boost/archive/text_oarchive.hpp>\n#include <boost/archive/detail/archive_serializer_map.hpp>\n\n// explicitly instantiate for this type of text stream\n#include <boost/archive/impl/archive_serializer_map.ipp>\n#include <boost/archive/impl/basic_text_oarchive.ipp>\n#include <boost/archive/impl/text_oarchive_impl.ipp>\n\nnamespace boost {\nnamespace archive {\n\n//template class basic_text_oprimitive<std::ostream> ;\ntemplate class detail::archive_serializer_map<text_oarchive>;\ntemplate class basic_text_oarchive<text_oarchive> ;\ntemplate class text_oarchive_impl<text_oarchive> ;\n\n} // namespace serialization\n} // namespace boost\n"
  },
  {
    "path": "src/text_wiarchive.cpp",
    "content": "/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// text_wiarchive.cpp:\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com . \n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for updates, documentation, and revision history.\n\n#include <boost/config.hpp>\n\n#ifdef BOOST_NO_STD_WSTREAMBUF\n#error \"wide char i/o not supported on this platform\"\n#else\n\n#define BOOST_WARCHIVE_SOURCE\n#include <boost/serialization/config.hpp>\n#include <boost/archive/text_wiarchive.hpp>\n#include <boost/archive/detail/archive_serializer_map.hpp>\n\n// explicitly instantiate for this type of text stream\n#include <boost/archive/impl/archive_serializer_map.ipp>\n#include <boost/archive/impl/basic_text_iarchive.ipp>\n#include <boost/archive/impl/text_wiarchive_impl.ipp>\n\nnamespace boost {\nnamespace archive {\n\ntemplate class detail::archive_serializer_map<text_wiarchive>;\ntemplate class basic_text_iarchive<text_wiarchive> ;\ntemplate class text_wiarchive_impl<text_wiarchive> ;\n\n} // namespace archive\n} // namespace boost\n\n#endif // BOOST_NO_STD_WSTREAMBUF\n\n"
  },
  {
    "path": "src/text_woarchive.cpp",
    "content": "/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// text_woarchive.cpp:\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com . \n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for updates, documentation, and revision history.\n\n#include <boost/config.hpp>\n#ifdef BOOST_NO_STD_WSTREAMBUF\n#error \"wide char i/o not supported on this platform\"\n#else\n\n#define BOOST_WARCHIVE_SOURCE\n#include <boost/serialization/config.hpp>\n#include <boost/archive/text_woarchive.hpp>\n#include <boost/archive/detail/archive_serializer_map.hpp>\n\n// explicitly instantiate for this type of text stream\n#include <boost/archive/impl/archive_serializer_map.ipp>\n#include <boost/archive/impl/basic_text_oarchive.ipp>\n#include <boost/archive/impl/text_woarchive_impl.ipp>\n\nnamespace boost {\nnamespace archive {\n\ntemplate class detail::archive_serializer_map<text_woarchive>;\ntemplate class basic_text_oarchive<text_woarchive> ;\ntemplate class text_woarchive_impl<text_woarchive> ;\n\n} // namespace archive\n} // namespace boost\n\n#endif // BOOST_NO_STD_WSTREAMBUF\n"
  },
  {
    "path": "src/utf8_codecvt_facet.cpp",
    "content": "// Copyright Vladimir Prus 2004.\n// Distributed under the Boost Software License, Version 1.0.\n// (See accompanying file LICENSE_1_0.txt\n// or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n#include <boost/config.hpp>\n\n#ifdef BOOST_NO_STD_WSTREAMBUF\n#error \"wide char i/o not supported on this platform\"\n#endif\n\n// include boost implementation of utf8 codecvt facet\n# define BOOST_ARCHIVE_SOURCE\n#include <boost/archive/detail/decl.hpp>\n#define BOOST_UTF8_BEGIN_NAMESPACE \\\n     namespace boost { namespace archive { namespace detail {\n#define BOOST_UTF8_DECL BOOST_ARCHIVE_DECL\n#define BOOST_UTF8_END_NAMESPACE }}}\n#include <boost/detail/utf8_codecvt_facet.ipp>\n#undef BOOST_UTF8_END_NAMESPACE\n#undef BOOST_UTF8_DECL\n#undef BOOST_UTF8_BEGIN_NAMESPACE\n"
  },
  {
    "path": "src/void_cast.cpp",
    "content": "/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// void_cast.cpp: implementation of run-time casting of void pointers\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com . \n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n// <gennadiy.rozental@tfn.com>\n\n//  See http://www.boost.org for updates, documentation, and revision history.\n\n#if (defined _MSC_VER) && (_MSC_VER == 1200)\n# pragma warning (disable : 4786) // too long name, harmless warning\n#endif\n\n// STL\n#include <set>\n#include <functional>\n#include <algorithm>\n#include <cstddef> // NULL\n#ifdef BOOST_SERIALIZATION_LOG\n#include <iostream>\n#endif\n\n// BOOST\n#include <boost/config.hpp>\n#include <boost/assert.hpp>\n\n#define BOOST_SERIALIZATION_SOURCE\n#include <boost/serialization/config.hpp>\n// it marks our code with proper attributes as being exported when\n// we're compiling it while marking it import when just the headers\n// is being included.\n#include <boost/serialization/singleton.hpp>\n#include <boost/serialization/extended_type_info.hpp>\n#include <boost/serialization/void_cast.hpp>\n\nnamespace boost { \nnamespace serialization {\nnamespace void_cast_detail {\n\n// note that void_casters are keyed on value of\n// member extended type info records - NOT their\n// addresses.  This is necessary in order for the\n// void cast operations to work across dll and exe\n// module boundaries.\nbool void_caster::operator<(const void_caster & rhs) const {\n    // include short cut to save time and eliminate\n    // problems when when base class aren't virtual\n    if(m_derived != rhs.m_derived){\n        if(*m_derived < *rhs.m_derived)\n            return true;\n        if(*rhs.m_derived < *m_derived)\n            return false;\n    }\n    // m_derived == rhs.m_derived\n    if(m_base != rhs.m_base)\n        return *m_base < *rhs.m_base;\n    else\n        return false;\n}\n\nstruct void_caster_compare {\n    bool operator()(const void_caster * lhs, const void_caster * rhs) const {\n        return *lhs < *rhs;\n    }\n};\n\ntypedef std::set<const void_caster *, void_caster_compare> set_type;\ntypedef boost::serialization::singleton<set_type> void_caster_registry;\n\n#ifdef BOOST_MSVC\n#  pragma warning(push)\n#  pragma warning(disable : 4511 4512)\n#endif\n\n// implementation of shortcut void caster\nclass void_caster_shortcut : public void_caster\n{\n    bool m_includes_virtual_base;\n\n    void const * \n    vbc_upcast(\n        void const * const t\n    ) const;\n    void const *\n    vbc_downcast(\n        void const * const t\n    ) const;\n    void const *\n    upcast(void const * const t) const BOOST_OVERRIDE {\n        if(m_includes_virtual_base)\n            return vbc_upcast(t);\n        return static_cast<const char *> ( t ) - m_difference;\n    }\n    void const *\n    downcast(void const * const t) const BOOST_OVERRIDE {\n        if(m_includes_virtual_base)\n            return vbc_downcast(t);\n        return static_cast<const char *> ( t ) + m_difference;\n    }\n    virtual bool is_shortcut() const {\n        return true;\n    }\n    bool has_virtual_base() const BOOST_OVERRIDE {\n        return m_includes_virtual_base;\n    }\npublic:\n    void_caster_shortcut(\n        extended_type_info const * derived,\n        extended_type_info const * base,\n        std::ptrdiff_t difference,\n        bool includes_virtual_base,\n        void_caster const * const parent\n    ) :\n        void_caster(derived, base, difference, parent),\n        m_includes_virtual_base(includes_virtual_base)\n    {\n        recursive_register(includes_virtual_base);\n    }\n    ~void_caster_shortcut() BOOST_OVERRIDE {\n        recursive_unregister();\n    }\n};\n\n#ifdef BOOST_MSVC\n#  pragma warning(pop)\n#endif\n\nvoid const * \nvoid_caster_shortcut::vbc_downcast(\n    void const * const t\n) const {\n    // try to find a chain that gives us what we want\n    const void_cast_detail::set_type & s\n        = void_cast_detail::void_caster_registry::get_const_instance();\n    void_cast_detail::set_type::const_iterator it;\n    for(it = s.begin(); it != s.end(); ++it){\n        // if the current candidate casts to the desired target type\n        if ((*it)->m_derived == m_derived){\n            // and if it's not us\n            if ((*it)->m_base != m_base){\n                // try to cast from the candidate base to our base\n                const void * t_new;\n                t_new = void_downcast(*(*it)->m_base, *m_base, t);\n                // if we were successful\n                if(NULL != t_new){\n                    // recast to our derived\n                    const void_caster * vc = *it;\n                    return vc->downcast(t_new);\n                }\n            }\n        }\n    }\n    return NULL;\n}\n\nvoid const * \nvoid_caster_shortcut::vbc_upcast(\n    void const * const t\n) const {\n    // try to find a chain that gives us what we want\n    const void_cast_detail::set_type & s\n        = void_cast_detail::void_caster_registry::get_const_instance();\n    void_cast_detail::set_type::const_iterator it;\n    for(it = s.begin(); it != s.end(); ++it){\n        // if the current candidate casts from the desired base type\n        if((*it)->m_base == m_base){\n            // and if it's not us\n            if ((*it)->m_derived != m_derived){\n                // try to cast from the candidate derived to our our derived\n                const void * t_new;\n                t_new = void_upcast(*m_derived, *(*it)->m_derived, t);\n                if(NULL != t_new)\n                    return (*it)->upcast(t_new);\n            }\n        }\n    }\n    return NULL;\n}\n\n#ifdef BOOST_MSVC\n#  pragma warning(push)\n#  pragma warning(disable : 4511 4512)\n#endif\n\n// just used as a search key\nclass void_caster_argument : public void_caster\n{\n    void const *\n    upcast(void const * const /*t*/) const BOOST_OVERRIDE {\n        BOOST_ASSERT(false);\n        return NULL;\n    }\n    void const *\n    downcast( void const * const /*t*/) const BOOST_OVERRIDE {\n        BOOST_ASSERT(false);\n        return NULL;\n    }\n    bool has_virtual_base() const BOOST_OVERRIDE {\n        BOOST_ASSERT(false);\n        return false;\n    }\npublic:\n    void_caster_argument(\n        extended_type_info const * derived,\n        extended_type_info const * base\n    ) :\n        void_caster(derived, base)\n    {}\n    ~void_caster_argument() BOOST_OVERRIDE {}\n};\n\n#ifdef BOOST_MSVC\n#  pragma warning(pop)\n#endif\n\n// implementation of void caster base class\nBOOST_SERIALIZATION_DECL void\nvoid_caster::recursive_register(bool includes_virtual_base) const {\n    void_cast_detail::set_type & s\n        = void_cast_detail::void_caster_registry::get_mutable_instance();\n\n    #ifdef BOOST_SERIALIZATION_LOG\n    std::clog << \"recursive_register\\n\";\n    std::clog << m_derived->get_debug_info();\n    std::clog << \"<-\";\n    std::clog << m_base->get_debug_info();\n    std::clog << \"\\n\";\n    #endif\n\n    std::pair<void_cast_detail::set_type::const_iterator, bool> result;\n    // comment this out for now.  \n    result = s.insert(this);\n    //assert(result.second);\n\n    // generate all implied void_casts.\n    void_cast_detail::set_type::const_iterator it;\n    for(it = s.begin(); it != s.end(); ++it){\n        if(* m_derived == * (*it)->m_base){\n            const void_caster_argument vca(\n                (*it)->m_derived, \n                m_base\n            );\n            void_cast_detail::set_type::const_iterator i;\n            i = s.find(& vca);\n            if(i == s.end()){\n                new void_caster_shortcut(\n                    (*it)->m_derived, \n                    m_base,\n                    m_difference + (*it)->m_difference,\n                    (*it)->has_virtual_base() || includes_virtual_base,\n                    this\n                );\n            }\n        }\n        if(* (*it)->m_derived == * m_base){\n            const void_caster_argument vca(\n                m_derived, \n                (*it)->m_base\n            );\n            void_cast_detail::set_type::const_iterator i;\n            i = s.find(& vca);\n            if(i == s.end()){\n                new void_caster_shortcut(\n                    m_derived, \n                    (*it)->m_base, \n                    m_difference + (*it)->m_difference,\n                    (*it)->has_virtual_base() || includes_virtual_base,\n                    this\n                );\n            }\n        }\n    }\n}\n\nBOOST_SERIALIZATION_DECL void\nvoid_caster::recursive_unregister() const {\n    // note: it's been discovered that at least one platform is not guaranteed\n    // to destroy singletons reverse order of construction.  So we can't\n    // use a runtime assert here.  Leave this in a reminder not to do this!\n    // BOOST_ASSERT(! void_caster_registry::is_destroyed());\n    if(void_caster_registry::is_destroyed())\n        return;\n\n    #ifdef BOOST_SERIALIZATION_LOG\n    std::clog << \"recursive_unregister\\n\";\n    std::clog << m_derived->get_debug_info();\n    std::clog << \"<-\";\n    std::clog << m_base->get_debug_info();\n    std::clog << \"\\n\";\n    #endif\n\n    void_cast_detail::set_type & s \n        = void_caster_registry::get_mutable_instance();\n\n    // delete all shortcuts which use this primitive\n    void_cast_detail::set_type::iterator it;\n    for(it = s.begin(); it != s.end();){\n        const void_caster * vc = *it;\n        if(vc == this){\n            s.erase(it++);\n        }\n        else\n        if(vc->m_parent == this){\n            s.erase(it);\n            delete vc;\n            it = s.begin();\n        }\n        else\n            it++;\n    }\n}\n\n} // namespace void_cast_detail\n\nBOOST_SYMBOL_VISIBLE void const *\nvoid_upcast(\n    extended_type_info const & derived,\n    extended_type_info const & base,\n    void const * const t\n);\n\n// Given a void *, assume that it really points to an instance of one type\n// and alter it so that it would point to an instance of a related type.\n// Return the altered pointer. If there exists no sequence of casts that\n// can transform from_type to to_type, return a NULL.  \nBOOST_SERIALIZATION_DECL void const *\nvoid_upcast(\n    extended_type_info const & derived,\n    extended_type_info const & base,\n    void const * const t\n){\n    // same types - trivial case\n    if (derived == base)\n        return t;\n\n    // check to see if base/derived pair is found in the registry\n    const void_cast_detail::set_type & s\n        = void_cast_detail::void_caster_registry::get_const_instance();\n    const void_cast_detail::void_caster_argument ca(& derived, & base);\n\n    void_cast_detail::set_type::const_iterator it;\n    it = s.find(& ca);\n    if (s.end() != it)\n        return (*it)->upcast(t);\n\n    return NULL;\n}\n\nBOOST_SYMBOL_VISIBLE void const *\nvoid_downcast(\n    extended_type_info const & derived,\n    extended_type_info const & base,\n    void const * const t\n);\n\nBOOST_SERIALIZATION_DECL void const *\nvoid_downcast(\n    extended_type_info const & derived,\n    extended_type_info const & base,\n    void const * const t\n){\n    // same types - trivial case\n    if (derived == base)\n        return t;\n\n    // check to see if base/derived pair is found in the registry\n    const void_cast_detail::set_type & s\n        = void_cast_detail::void_caster_registry::get_const_instance();\n    const void_cast_detail::void_caster_argument ca(& derived, & base);\n\n    void_cast_detail::set_type::const_iterator it;\n    it = s.find(&ca);\n    if (s.end() != it)\n        return(*it)->downcast(t);\n\n    return NULL;\n}\n\n} // namespace serialization\n} // namespace boost\n"
  },
  {
    "path": "src/xml_archive_exception.cpp",
    "content": "/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// xml_archive_exception.cpp:\n\n// (C) Copyright 2009 Robert Ramey - http://www.rrsd.com . \n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for updates, documentation, and revision history.\n\n#if (defined _MSC_VER) && (_MSC_VER == 1200)\n#  pragma warning (disable : 4786) // too long name, harmless warning\n#endif\n\n\n#include <exception>\n#include <string>\n\n#include <boost/assert.hpp>\n\n#define BOOST_ARCHIVE_SOURCE\n#include <boost/serialization/config.hpp>\n#include <boost/archive/xml_archive_exception.hpp>\n\nnamespace boost {\nnamespace archive {\n\nBOOST_ARCHIVE_DECL\nxml_archive_exception::xml_archive_exception(\n        exception_code c, \n        const char * e1,\n        const char * e2\n    ) : \n        archive_exception(other_exception, e1, e2)\n    {\n        switch(c){\n        case xml_archive_parsing_error:\n            archive_exception::append(0, \"unrecognized XML syntax\");\n            break;\n        case xml_archive_tag_mismatch:{\n            unsigned int l;\n            l = archive_exception::append(0, \"XML start/end tag mismatch\");\n            if(NULL != e1){\n                l = archive_exception::append(l, \" - \");\n                archive_exception::append(l, e1);\n            }    \n            break;\n        }\n        case xml_archive_tag_name_error:\n            archive_exception::append(0, \"Invalid XML tag name\");\n            break;\n        default:\n            BOOST_ASSERT(false);\n            archive_exception::append(0, \"programming error\");\n            break;\n        }\n    }\n    \nBOOST_ARCHIVE_DECL\nxml_archive_exception::xml_archive_exception(xml_archive_exception const & oth) :\n \tarchive_exception(oth)\n\t{\n\t}\n\t\nBOOST_ARCHIVE_DECL xml_archive_exception::~xml_archive_exception() BOOST_NOEXCEPT_OR_NOTHROW {}\n\n} // archive\n} // boost\n"
  },
  {
    "path": "src/xml_grammar.cpp",
    "content": "/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// xml_grammar.cpp:\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com . \n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for updates, documentation, and revision history.\n\n#if (defined _MSC_VER) && (_MSC_VER == 1200)\n#  pragma warning (disable : 4786) // too long name, harmless warning\n#endif\n\n#include <boost/config.hpp>\n\n#define BOOST_ARCHIVE_SOURCE\n#include <boost/serialization/config.hpp>\n#include <boost/archive/impl/basic_xml_grammar.hpp>\n\nusing namespace boost::spirit::classic;\n\n// fixup for borland\n// The following code will be put into Boost.Config in a later revision\n#if ! defined(__SGI_STL_PORT) \\\n&& defined(BOOST_RWSTD_VER) && BOOST_RWSTD_VER<=0x020101\n#include <string>\nnamespace std {\n    template<>\n    inline string & \n    string::replace (\n        char * first1, \n        char * last1,\n        const char * first2,\n        const char * last2\n    ){\n        replace(first1-begin(),last1-first1,first2,last2-first2,0,last2-first2);\n        return *this;\n    }\n} // namespace std\n#endif\n\nnamespace boost {\nnamespace archive {\n\ntypedef basic_xml_grammar<char> xml_grammar;\n\n/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// specific definitions for char based XML\n\ntemplate<>\nvoid xml_grammar::init_chset(){\n    Char = chset_t(\"\\x9\\xA\\xD\\x20-\\x7f\\x80\\x81-\\xFF\"); \n    Letter = chset_t(\"\\x41-\\x5A\\x61-\\x7A\\xC0-\\xD6\\xD8-\\xF6\\xF8-\\xFF\");\n    Digit = chset_t(\"0-9\");\n    Extender = chset_t('\\xB7');\n    Sch = chset_t(\"\\x20\\x9\\xD\\xA\");\n    NameChar = Letter | Digit | chset_p(\"._:-\") | Extender ;\n}\n\n} // namespace archive\n} // namespace boost\n\n#include \"basic_xml_grammar.ipp\"\n\nnamespace boost {\nnamespace archive {\n\n// explicit instantiation of xml for 8 bit characters\ntemplate class basic_xml_grammar<char>;\n\n} // namespace archive\n} // namespace boost\n\n"
  },
  {
    "path": "src/xml_iarchive.cpp",
    "content": "/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// xml_iarchive.cpp:\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com . \n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for updates, documentation, and revision history.\n\n#if (defined _MSC_VER) && (_MSC_VER == 1200)\n#  pragma warning (disable : 4786) // too long name, harmless warning\n#endif\n\n#define BOOST_ARCHIVE_SOURCE\n#include <boost/serialization/config.hpp>\n#include <boost/archive/xml_iarchive.hpp>\n#include <boost/archive/detail/archive_serializer_map.hpp>\n\n// explicitly instantiate for this type of xml stream\n#include <boost/archive/impl/archive_serializer_map.ipp>\n#include <boost/archive/impl/basic_xml_iarchive.ipp>\n#include <boost/archive/impl/xml_iarchive_impl.ipp>\n\nnamespace boost {\nnamespace archive {\n\ntemplate class detail::archive_serializer_map<xml_iarchive>;\ntemplate class basic_xml_iarchive<xml_iarchive> ;\ntemplate class xml_iarchive_impl<xml_iarchive> ;\n\n} // namespace archive\n} // namespace boost\n"
  },
  {
    "path": "src/xml_oarchive.cpp",
    "content": "/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// xml_oarchive.cpp:\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com . \n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for updates, documentation, and revision history.\n\n#if (defined _MSC_VER) && (_MSC_VER == 1200)\n#  pragma warning (disable : 4786) // too long name, harmless warning\n#endif\n\n#define BOOST_ARCHIVE_SOURCE\n#include <boost/serialization/config.hpp>\n#include <boost/archive/xml_oarchive.hpp>\n#include <boost/archive/detail/archive_serializer_map.hpp>\n\n// explicitly instantiate for this type of xml stream\n#include <boost/archive/impl/archive_serializer_map.ipp>\n#include <boost/archive/impl/basic_xml_oarchive.ipp>\n#include <boost/archive/impl/xml_oarchive_impl.ipp>\n\nnamespace boost {\nnamespace archive {\n\ntemplate class detail::archive_serializer_map<xml_oarchive>;\ntemplate class basic_xml_oarchive<xml_oarchive> ;\ntemplate class xml_oarchive_impl<xml_oarchive> ;\n\n} // namespace archive\n} // namespace boost\n"
  },
  {
    "path": "src/xml_wgrammar.cpp",
    "content": "/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// xml_wgrammar.cpp:\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com . \n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for updates, documentation, and revision history.\n\n#include <boost/config.hpp>\n\n#ifdef BOOST_NO_STD_WSTREAMBUF\n#error \"wide char i/o not supported on this platform\"\n#else\n\n#define BOOST_WARCHIVE_SOURCE\n#include <boost/serialization/config.hpp>\n#include <boost/archive/impl/basic_xml_grammar.hpp>\n\nusing namespace boost::spirit::classic;\n\n// fixup for RogueWave\n#if ! defined(__SGI_STL_PORT) \\\n&& defined(BOOST_RWSTD_VER) && BOOST_RWSTD_VER<=0x020101\n#include <string>\nnamespace std {\n    template<>\n    inline wstring & \n    wstring::replace (\n        wchar_t * first1, \n        wchar_t * last1,\n        const wchar_t * first2,\n        const wchar_t * last2\n    ){\n        replace(first1-begin(),last1-first1,first2,last2-first2,0,last2-first2);\n        return *this;\n    }\n} // namespace std\n#endif\n\nnamespace boost {\nnamespace archive {\n\ntypedef basic_xml_grammar<wchar_t> xml_wgrammar;\n\n/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// specific definitions for wchar_t based XML\n\ntemplate<>\nvoid xml_wgrammar::init_chset(){\n    Char = chset_t(\n        #if defined(__GNUC__) && defined(linux)\n            L\"\\x9\\xA\\xD\\x20-\\xD7FF\\xE000-\\xFFFD\\x10000-\\x10FFFF\"\n        #else\n            L\"\\x9\\xA\\xD\\x20-\\xD7FF\\xE000-\\xFFFD\"\n        #endif\n    );\n\n    Sch = chset_t(L\"\\x20\\x9\\xD\\xA\");\n\n    BaseChar = chset_t(\n        L\"\\x41-\\x5A\\x61-\\x7A\\xC0-\\xD6\\xD8-\\xF6\\xF8-\\xFF\\x100-\\x131\\x134-\\x13E\"\n        L\"\\x141-\\x148\\x14A-\\x17E\\x180-\\x1C3\\x1CD-\\x1F0\\x1F4-\\x1F5\\x1FA-\\x217\"\n        L\"\\x250-\\x2A8\\x2BB-\\x2C1\\x386\\x388-\\x38A\\x38C\\x38E-\\x3A1\\x3A3-\\x3CE\"\n        L\"\\x3D0-\\x3D6\\x3DA\\x3DC\\x3DE\\x3E0\\x3E2-\\x3F3\\x401-\\x40C\\x40E-\\x44F\"\n        L\"\\x451-\\x45C\\x45E-\\x481\\x490-\\x4C4\\x4C7-\\x4C8\\x4CB-\\x4CC\\x4D0-\\x4EB\"\n        L\"\\x4EE-\\x4F5\\x4F8-\\x4F9\\x531-\\x556\\x559\\x561-\\x586\\x5D0-\\x5EA\"\n        L\"\\x5F0-\\x5F2\\x621-\\x63A\\x641-\\x64A\\x671-\\x6B7\\x6BA-\\x6BE\\x6C0-\\x6CE\"\n        L\"\\x6D0-\\x6D3\\x6D5\\x6E5-\\x6E6\\x905-\\x939\\x93D\\x958-\\x961\\x985-\\x98C\"\n        L\"\\x98F-\\x990\\x993-\\x9A8\\x9AA-\\x9B0\\x9B2\\x9B6-\\x9B9\\x9DC-\\x9DD\"\n        L\"\\x9DF-\\x9E1\\x9F0-\\x9F1\\xA05-\\xA0A\\xA0F-\\xA10\\xA13-\\xA28\\xA2A-\\xA30\"\n        L\"\\xA32-\\xA33\\xA35-\\xA36\\xA38-\\xA39\\xA59-\\xA5C\\xA5E\\xA72-\\xA74\"\n        L\"\\xA85-\\xA8B\\xA8D\\xA8F-\\xA91\\xA93-\\xAA8\\xAAA-\\xAB0\\xAB2-\\xAB3\"\n        L\"\\xAB5-\\xAB9\\xABD\\xAE0\\xB05-\\xB0C\\xB0F-\\xB10\\xB13-\\xB28\\xB2A-\\xB30\"\n        L\"\\xB32-\\xB33\\xB36-\\xB39\\xB3D\\xB5C-\\xB5D\\xB5F-\\xB61\\xB85-\\xB8A\"\n        L\"\\xB8E-\\xB90\\xB92-\\xB95\\xB99-\\xB9A\\xB9C\\xB9E-\\xB9F\\xBA3-\\xBA4\"\n        L\"\\xBA8-\\xBAA\\xBAE-\\xBB5\\xBB7-\\xBB9\\xC05-\\xC0C\\xC0E-\\xC10\\xC12-\\xC28\"\n        L\"\\xC2A-\\xC33\\xC35-\\xC39\\xC60-\\xC61\\xC85-\\xC8C\\xC8E-\\xC90\\xC92-\\xCA8\"\n        L\"\\xCAA-\\xCB3\\xCB5-\\xCB9\\xCDE\\xCE0-\\xCE1\\xD05-\\xD0C\\xD0E-\\xD10\"\n        L\"\\xD12-\\xD28\\xD2A-\\xD39\\xD60-\\xD61\\xE01-\\xE2E\\xE30\\xE32-\\xE33\"\n        L\"\\xE40-\\xE45\\xE81-\\xE82\\xE84\\xE87-\\xE88\\xE8A\\xE8D\\xE94-\\xE97\"\n        L\"\\xE99-\\xE9F\\xEA1-\\xEA3\\xEA5\\xEA7\\xEAA-\\xEAB\\xEAD-\\xEAE\\xEB0\"\n        L\"\\xEB2-\\xEB3\\xEBD\\xEC0-\\xEC4\\xF40-\\xF47\\xF49-\\xF69\\x10A0-\\x10C5\"\n        L\"\\x10D0-\\x10F6\\x1100\\x1102-\\x1103\\x1105-\\x1107\\x1109\\x110B-\\x110C\"\n        L\"\\x110E-\\x1112\\x113C\\x113E\\x1140\\x114C\\x114E\\x1150\\x1154-\\x1155\"\n        L\"\\x1159\\x115F-\\x1161\\x1163\\x1165\\x1167\\x1169\\x116D-\\x116E\"\n        L\"\\x1172-\\x1173\\x1175\\x119E\\x11A8\\x11AB\\x11AE-\\x11AF\\x11B7-\\x11B8\"\n        L\"\\x11BA\\x11BC-\\x11C2\\x11EB\\x11F0\\x11F9\\x1E00-\\x1E9B\\x1EA0-\\x1EF9\"\n        L\"\\x1F00-\\x1F15\\x1F18-\\x1F1D\\x1F20-\\x1F45\\x1F48-\\x1F4D\\x1F50-\\x1F57\"\n        L\"\\x1F59\\x1F5B\\x1F5D\\x1F5F-\\x1F7D\\x1F80-\\x1FB4\\x1FB6-\\x1FBC\\x1FBE\"\n        L\"\\x1FC2-\\x1FC4\\x1FC6-\\x1FCC\\x1FD0-\\x1FD3\\x1FD6-\\x1FDB\\x1FE0-\\x1FEC\"\n        L\"\\x1FF2-\\x1FF4\\x1FF6-\\x1FFC\\x2126\\x212A-\\x212B\\x212E\\x2180-\\x2182\"\n        L\"\\x3041-\\x3094\\x30A1-\\x30FA\\x3105-\\x312C\\xAC00-\\xD7A3\"\n    );\n\n    Ideographic = chset_t(L\"\\x4E00-\\x9FA5\\x3007\\x3021-\\x3029\");\n\n    Letter = BaseChar | Ideographic;\n\n    CombiningChar = chset_t(\n        L\"\\x0300-\\x0345\\x0360-\\x0361\\x0483-\\x0486\\x0591-\\x05A1\\x05A3-\\x05B9\"\n        L\"\\x05BB-\\x05BD\\x05BF\\x05C1-\\x05C2\\x05C4\\x064B-\\x0652\\x0670\"\n        L\"\\x06D6-\\x06DC\\x06DD-\\x06DF\\x06E0-\\x06E4\\x06E7-\\x06E8\\x06EA-\\x06ED\"\n        L\"\\x0901-\\x0903\\x093C\\x093E-\\x094C\\x094D\\x0951-\\x0954\\x0962-\\x0963\"\n        L\"\\x0981-\\x0983\\x09BC\\x09BE\\x09BF\\x09C0-\\x09C4\\x09C7-\\x09C8\"\n        L\"\\x09CB-\\x09CD\\x09D7\\x09E2-\\x09E3\\x0A02\\x0A3C\\x0A3E\\x0A3F\"\n        L\"\\x0A40-\\x0A42\\x0A47-\\x0A48\\x0A4B-\\x0A4D\\x0A70-\\x0A71\\x0A81-\\x0A83\"\n        L\"\\x0ABC\\x0ABE-\\x0AC5\\x0AC7-\\x0AC9\\x0ACB-\\x0ACD\\x0B01-\\x0B03\\x0B3C\"\n        L\"\\x0B3E-\\x0B43\\x0B47-\\x0B48\\x0B4B-\\x0B4D\\x0B56-\\x0B57\\x0B82-\\x0B83\"\n        L\"\\x0BBE-\\x0BC2\\x0BC6-\\x0BC8\\x0BCA-\\x0BCD\\x0BD7\\x0C01-\\x0C03\"\n        L\"\\x0C3E-\\x0C44\\x0C46-\\x0C48\\x0C4A-\\x0C4D\\x0C55-\\x0C56\\x0C82-\\x0C83\"\n        L\"\\x0CBE-\\x0CC4\\x0CC6-\\x0CC8\\x0CCA-\\x0CCD\\x0CD5-\\x0CD6\\x0D02-\\x0D03\"\n        L\"\\x0D3E-\\x0D43\\x0D46-\\x0D48\\x0D4A-\\x0D4D\\x0D57\\x0E31\\x0E34-\\x0E3A\"\n        L\"\\x0E47-\\x0E4E\\x0EB1\\x0EB4-\\x0EB9\\x0EBB-\\x0EBC\\x0EC8-\\x0ECD\"\n        L\"\\x0F18-\\x0F19\\x0F35\\x0F37\\x0F39\\x0F3E\\x0F3F\\x0F71-\\x0F84\"\n        L\"\\x0F86-\\x0F8B\\x0F90-\\x0F95\\x0F97\\x0F99-\\x0FAD\\x0FB1-\\x0FB7\\x0FB9\"\n        L\"\\x20D0-\\x20DC\\x20E1\\x302A-\\x302F\\x3099\\x309A\"\n    );\n\n    Digit = chset_t(\n        L\"\\x0030-\\x0039\\x0660-\\x0669\\x06F0-\\x06F9\\x0966-\\x096F\\x09E6-\\x09EF\"\n        L\"\\x0A66-\\x0A6F\\x0AE6-\\x0AEF\\x0B66-\\x0B6F\\x0BE7-\\x0BEF\\x0C66-\\x0C6F\"\n        L\"\\x0CE6-\\x0CEF\\x0D66-\\x0D6F\\x0E50-\\x0E59\\x0ED0-\\x0ED9\\x0F20-\\x0F29\"\n    );\n\n    Extender = chset_t(\n        L\"\\x00B7\\x02D0\\x02D1\\x0387\\x0640\\x0E46\\x0EC6\\x3005\\x3031-\\x3035\"\n        L\"\\x309D-\\x309E\\x30FC-\\x30FE\"\n    );\n\n    NameChar =\n        Letter \n        | Digit \n        | L'.'\n        | L'-'\n        | L'_'\n        | L':'\n        | CombiningChar \n        | Extender\n    ;\n}\n} // namespace archive\n} // namespace boost\n\n#include \"basic_xml_grammar.ipp\"\n\nnamespace boost {\nnamespace archive {\n\n// explicit instantiation of xml for wide characters\ntemplate class basic_xml_grammar<wchar_t>;\n\n} // namespace archive\n} // namespace boost\n\n#endif\n"
  },
  {
    "path": "src/xml_wiarchive.cpp",
    "content": "/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// xml_wiarchive.cpp:\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com . \n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for updates, documentation, and revision history.\n\n#if (defined _MSC_VER) && (_MSC_VER == 1200)\n#  pragma warning (disable : 4786) // too long name, harmless warning\n#endif\n\n#include <boost/config.hpp>\n#ifdef BOOST_NO_STD_WSTREAMBUF\n#error \"wide char i/o not supported on this platform\"\n#else\n\n#define BOOST_WARCHIVE_SOURCE\n#include <boost/serialization/config.hpp>\n#include <boost/archive/xml_wiarchive.hpp>\n#include <boost/archive/detail/archive_serializer_map.hpp>\n\n// explicitly instantiate for this type of xml stream\n#include <boost/archive/impl/archive_serializer_map.ipp>\n#include <boost/archive/impl/basic_xml_iarchive.ipp>\n#include <boost/archive/impl/xml_wiarchive_impl.ipp>\n\nnamespace boost {\nnamespace archive {\n\ntemplate class detail::archive_serializer_map<xml_wiarchive>;\ntemplate class basic_xml_iarchive<xml_wiarchive> ;\ntemplate class xml_wiarchive_impl<xml_wiarchive> ;\n\n} // namespace archive\n} // namespace boost\n\n#endif // BOOST_NO_STD_WSTREAMBUF\n"
  },
  {
    "path": "src/xml_woarchive.cpp",
    "content": "/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// xml_woarchive.cpp:\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com . \n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for updates, documentation, and revision history.\n\n#if (defined _MSC_VER) && (_MSC_VER == 1200)\n#  pragma warning (disable : 4786) // too long name, harmless warning\n#endif\n\n#include <boost/config.hpp>\n#ifdef BOOST_NO_STD_WSTREAMBUF\n#error \"wide char i/o not supported on this platform\"\n#else\n\n#define BOOST_WARCHIVE_SOURCE\n#include <boost/serialization/config.hpp>\n#include <boost/archive/xml_woarchive.hpp>\n#include <boost/archive/detail/archive_serializer_map.hpp>\n\n// explicitly instantiate for this type of text stream\n#include <boost/archive/impl/archive_serializer_map.ipp>\n#include <boost/archive/impl/basic_xml_oarchive.ipp>\n#include <boost/archive/impl/xml_woarchive_impl.ipp>\n\nnamespace boost {\nnamespace archive {\n\ntemplate class detail::archive_serializer_map<xml_woarchive>;\ntemplate class basic_xml_oarchive<xml_woarchive> ;\ntemplate class xml_woarchive_impl<xml_woarchive> ;\n\n} // namespace archive\n} // namespace boost\n\n#endif // BOOST_NO_STD_WSTREAMBUF\n"
  },
  {
    "path": "test/A.cpp",
    "content": "/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// A.cpp    simple class test\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for updates, documentation, and revision history.\n\n#include <cassert>\n#include <cstdlib> // rand()\n#include <cstddef> // size_t\n\n\n#include <boost/config.hpp>\n#if BOOST_CXX_VERSION > 199711L // only include floating point if C++ version >= C++11\n#include <boost/math/special_functions/next.hpp>\n#endif\n#if defined(BOOST_NO_STDC_NAMESPACE)\nnamespace std{\n    using ::rand;\n    using ::size_t;\n}\n#endif\n\n#include <boost/detail/workaround.hpp>\n#if BOOST_WORKAROUND(BOOST_DINKUMWARE_STDLIB, == 1)\n#include <boost/archive/dinkumware.hpp>\n#endif\n\n#include \"A.hpp\"\n\ntemplate<class S>\nvoid randomize(S &x)\n{\n    assert(0 == x.size());\n    for(;;){\n        unsigned int i = std::rand() % 27;\n        if(0 == i)\n            break;\n        x += static_cast<typename S::value_type>('a' - 1 + i);\n    }\n}\n\ntemplate<class T>\nvoid accumulate(std::size_t & s, const T & t){\n    const char * tptr = (const char *)(& t);\n    unsigned int count = sizeof(t);\n    while(count-- > 0){\n        s += *tptr++;\n    }\n}\nA_DLL_DECL\nA::operator std::size_t () const {\n    std::size_t retval = 0;\n    accumulate(retval, b);\n    #ifndef BOOST_NO_INT64_T\n    accumulate(retval, f);\n    accumulate(retval, g);\n    #endif\n    accumulate(retval, l);\n    accumulate(retval, m);\n    accumulate(retval, n);\n    accumulate(retval, o);\n    accumulate(retval, p);\n    accumulate(retval, q);\n    #ifndef BOOST_NO_CWCHAR\n    accumulate(retval, r);\n    #endif\n    accumulate(retval, c);\n    accumulate(retval, s);\n    accumulate(retval, t);\n    accumulate(retval, u);\n    accumulate(retval, v);\n    return retval;\n}\n\n#if defined(_MSC_VER)\n#pragma warning(push) // Save warning settings.\n#pragma warning(disable : 4244) // Disable possible loss of data warning\n#endif\n\nA_DLL_DECL\nA::A() :\n    b(true),\n    #ifndef BOOST_NO_INT64_T\n    f(static_cast<boost::int64_t>(std::rand()) * static_cast<boost::int64_t>(std::rand())),\n    g(static_cast<boost::uint64_t>(std::rand()) * static_cast<boost::uint64_t>(std::rand())),\n    #endif\n    l(static_cast<enum h>(std::rand() % 3)),\n    m(std::rand()),\n    n(std::rand()),\n    o(std::rand()),\n    p(std::rand()),\n    q(std::rand()),\n    #ifndef BOOST_NO_CWCHAR\n    r(std::rand()),\n    #endif\n    c(0xff & std::rand()),\n    s(0xff & std::rand()),\n    t(0xff & std::rand()),\n    u(std::rand()),\n    v(std::rand()),\n    w((float)std::rand()),\n    x((double)std::rand())\n{\n    randomize(y);\n    #ifndef BOOST_NO_STD_WSTRING\n    randomize(z);\n    #endif\n}\n\n#if defined(_MSC_VER)\n#pragma warning(pop) // Restore warnings to previous state.\n#endif\n\nA_DLL_DECL bool\nA::operator==(const A &rhs) const {\n    if(b != rhs.b)\n        return false;\n    if(l != rhs.l)\n        return false;\n    #ifndef BOOST_NO_INT64_T\n    if(f != rhs.f)\n        return false;\n    if(g != rhs.g)\n        return false;\n    #endif\n    if(m != rhs.m)\n        return false;\n    if(n != rhs.n)\n        return false;\n    if(o != rhs.o)\n        return false;\n    if(p != rhs.p)\n        return false;\n    if(q != rhs.q)\n        return false;\n    #ifndef BOOST_NO_CWCHAR\n    if(r != rhs.r)\n        return false;\n    #endif\n    if(c != rhs.c)\n        return false;\n    if(s != rhs.s)\n        return false;\n    if(t != rhs.t)\n        return false;\n    if(u != rhs.u)\n        return false;\n    if(v != rhs.v)\n        return false;\n    #if BOOST_CXX_VERSION > 199711L // only include floating point if C++ version >= C++11\n        if(std::abs( boost::math::float_distance(w, rhs.w)) > 1)\n            return false;\n        if(std::abs( boost::math::float_distance(x, rhs.x)) > 1)\n            return false;\n    #endif\n    if(0 != y.compare(rhs.y))\n\n        return false;\n    #ifndef BOOST_NO_STD_WSTRING\n    if(0 != z.compare(rhs.z))\n        return false;\n    #endif\n    return true;\n}\n\nA_DLL_DECL bool\nA::operator!=(const A &rhs) const {\n    return ! (*this == rhs);\n}\n\nA_DLL_DECL bool\nA::operator<(const A &rhs) const {\n    if(b != rhs.b)\n        return b < rhs.b;\n    #ifndef BOOST_NO_INT64_T\n    if(f != rhs.f)\n        return f < rhs.f;\n    if(g != rhs.g)\n        return g < rhs.g;\n    #endif\n    if(l != rhs.l )\n        return l < rhs.l;\n    if(m != rhs.m )\n        return m < rhs.m;\n    if(n != rhs.n )\n        return n < rhs.n;\n    if(o != rhs.o )\n        return o < rhs.o;\n    if(p != rhs.p )\n        return p < rhs.p;\n    if(q != rhs.q )\n        return q < rhs.q;\n    #ifndef BOOST_NO_CWCHAR\n    if(r != rhs.r )\n        return r < rhs.r;\n    #endif\n    if(c != rhs.c )\n        return c < rhs.c;\n    if(s != rhs.s )\n        return s < rhs.s;\n    if(t != rhs.t )\n        return t < rhs.t;\n    if(u != rhs.u )\n        return u < rhs.u;\n    if(v != rhs.v )\n        return v < rhs.v;\n    if(w != rhs.w )\n        return w < rhs.w;\n    if(x != rhs.x )\n        return x < rhs.x;\n    int i = y.compare(rhs.y);\n    if(i !=  0 )\n        return i < 0;\n    #ifndef BOOST_NO_STD_WSTRING\n    int j = z.compare(rhs.z);\n    if(j !=  0 )\n        return j < 0;\n    #endif\n    return false;\n}\n"
  },
  {
    "path": "test/A.hpp",
    "content": "#ifndef BOOST_SERIALIZATION_TEST_A_HPP\n#define BOOST_SERIALIZATION_TEST_A_HPP\n\n// MS compatible compilers support #pragma once\n#if defined(_MSC_VER)\n# pragma once\n#endif\n\n/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// A.hpp    simple class test\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for updates, documentation, and revision history.\n\n#include <ostream> // for friend output operators\n#include <cstddef> // size_t\n#include <boost/config.hpp>\n\n#if defined(BOOST_NO_STDC_NAMESPACE)\nnamespace std{\n    using ::size_t;\n}\n#endif\n\n#include <boost/limits.hpp>\n#include <boost/cstdint.hpp>\n\n#include <boost/serialization/access.hpp>\n#include <boost/serialization/string.hpp>\n\n#if defined(A_IMPORT)\n    #define A_DLL_DECL BOOST_SYMBOL_IMPORT\n    #pragma message(\"A imported\")\n#elif defined(A_EXPORT)\n    #define A_DLL_DECL BOOST_SYMBOL_EXPORT\n    #pragma message (\"A exported\")\n#endif\n\n#ifndef A_DLL_DECL\n    #define A_DLL_DECL\n#endif\n\nclass A_DLL_DECL A {\nprivate:\n    friend class boost::serialization::access;\n    template<class Archive>\n    void serialize(\n        Archive &ar,\n        const unsigned int /* file_version */\n    );\n    bool b;\n    #ifndef BOOST_NO_INT64_T\n    boost::int64_t f;\n    boost::uint64_t g;\n    #endif\n    enum h {\n        i = 0,\n        j,\n        k\n    } l;\n    std::size_t m;\n    signed long n;\n    unsigned long o;\n    signed  short p;\n    unsigned short q;\n    #ifndef BOOST_NO_CWCHAR\n    wchar_t r;\n    #endif\n    char c;\n    signed char s;\n    unsigned char t;\n    signed int u;\n    unsigned int v;\n    float w;\n    double x;\n    std::string y;\n    #ifndef BOOST_NO_STD_WSTRING\n    std::wstring z;\n    #endif\npublic:\n    A();\n    bool check_equal(const A &rhs) const;\n    bool operator==(const A &rhs) const;\n    bool operator!=(const A &rhs) const;\n    bool operator<(const A &rhs) const; // used by less\n    // hash function for class A\n    operator std::size_t () const;\n    friend std::ostream & operator<<(std::ostream & os, A const & a);\n};\n\n#endif // BOOST_SERIALIZATION_TEST_A_HPP\n"
  },
  {
    "path": "test/A.ipp",
    "content": "/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// A.ipp    simple class test\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com . \n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for updates, documentation, and revision history.\n\n#if BOOST_WORKAROUND(BOOST_DINKUMWARE_STDLIB, == 1)\n#include <boost/archive/dinkumware.hpp>\n#endif\n\n#include <boost/serialization/nvp.hpp>\n#include \"A.hpp\"\n\ntemplate<class Archive>\nvoid A::serialize(\n    Archive &ar,\n    const unsigned int /* file_version */\n){\n    ar & BOOST_SERIALIZATION_NVP(b);\n    #ifndef BOOST_NO_INT64_T\n    ar & BOOST_SERIALIZATION_NVP(f);\n    ar & BOOST_SERIALIZATION_NVP(g);\n    #endif\n    #if BOOST_WORKAROUND(BOOST_BORLANDC,  <= 0x551 )\n        int i;\n        if(BOOST_DEDUCED_TYPENAME Archive::is_saving::value){\n            i = l;\n            ar & BOOST_SERIALIZATION_NVP(i);\n        }\n        else{\n            ar & BOOST_SERIALIZATION_NVP(i);\n            l = i;\n        }\n    #else\n        ar & BOOST_SERIALIZATION_NVP(l);\n    #endif\n    ar & BOOST_SERIALIZATION_NVP(m);\n    ar & BOOST_SERIALIZATION_NVP(n);\n    ar & BOOST_SERIALIZATION_NVP(o);\n    ar & BOOST_SERIALIZATION_NVP(p);\n    ar & BOOST_SERIALIZATION_NVP(q);\n    #ifndef BOOST_NO_CWCHAR\n    ar & BOOST_SERIALIZATION_NVP(r);\n    #endif\n    ar & BOOST_SERIALIZATION_NVP(c);\n    ar & BOOST_SERIALIZATION_NVP(s);\n    ar & BOOST_SERIALIZATION_NVP(t);\n    ar & BOOST_SERIALIZATION_NVP(u);\n    ar & BOOST_SERIALIZATION_NVP(v);\n    ar & BOOST_SERIALIZATION_NVP(w);\n    ar & BOOST_SERIALIZATION_NVP(x);\n    ar & BOOST_SERIALIZATION_NVP(y);\n    #ifndef BOOST_NO_STD_WSTRING\n    ar & BOOST_SERIALIZATION_NVP(z);\n    #endif\n}\n"
  },
  {
    "path": "test/B.hpp",
    "content": "#ifndef BOOST_SERIALIZATION_TEST_B_HPP\n#define BOOST_SERIALIZATION_TEST_B_HPP\n\n// MS compatible compilers support #pragma once\n#if defined(_MSC_VER)\n# pragma once\n#endif\n\n/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// B.hpp\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for updates, documentation, and revision history.\n\n#include <cstdlib> // for rand()\n#include <cmath>\n#include <boost/config.hpp>\n\n#if defined(BOOST_NO_STDC_NAMESPACE)\nnamespace std{\n    using ::rand;\n}\n#endif\n\n#include <boost/serialization/version.hpp>\n#include <boost/serialization/split_member.hpp>\n#include <boost/serialization/base_object.hpp>\n\n#include \"A.hpp\"\n\n///////////////////////////////////////////////////////\n// Derived class test\nclass B : public A\n{\nprivate:\n    friend class boost::serialization::access;\n    template<class Archive>\n    void save(Archive &ar, const unsigned int /* file_version */) const\n    {\n        // write any base class info to the archive\n        ar << BOOST_SERIALIZATION_BASE_OBJECT_NVP(A);\n    }\n\n    template<class Archive>\n    void load(Archive & ar, const unsigned int file_version)\n    {\n        // read any base class info to the archive\n        ar >> BOOST_SERIALIZATION_BASE_OBJECT_NVP(A);\n    }\n\n    BOOST_SERIALIZATION_SPLIT_MEMBER()\n    signed char s;\n    unsigned char t;\n    signed int u;\n    unsigned int v;\n    float w;\n    double x;\npublic:\n    B();\n    virtual ~B(){};\n    bool operator==(const B &rhs) const;\n};\n\nB::B()\n{\n}\n\nBOOST_CLASS_VERSION(B, 2)\n\ninline bool B::operator==(const B &rhs) const\n{\n    return A::operator==(rhs);\n}\n\n#endif // BOOST_SERIALIZATION_TEST_B_HPP\n"
  },
  {
    "path": "test/C.hpp",
    "content": "#ifndef BOOST_SERIALIZATION_TEST_A_HPP\n#define BOOST_SERIALIZATION_TEST_A_HPP\n\n// MS compatible compilers support #pragma once\n#if defined(_MSC_VER)\n# pragma once\n#endif\n\n/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// C.hpp\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for updates, documentation, and revision history.\n\n#include <boost/config.hpp>\n#include <boost/serialization/traits.hpp>\n#include <boost/serialization/split.hpp>\n\n#include \"B.hpp\"\n\n///////////////////////////////////////////////////////\n// Contained class\nclass C\n{\nprivate:\n    friend class boost::serialization::access;\n    template<class Archive>\n    void save(Archive &ar, boost::archive::version_type file_version) const;\n    template<class Archive>\n    void load(Archive & ar, boost::archive::version_type file_version);\n    BOOST_SERIALIZATION_MEMBER_SPLIT()\n    B b;\npublic:\n    bool operator==(const C &rhs) const;\n};\n\nBOOST_CLASS_VERSION(C, 1)\n\ninline bool C::operator==(const C &rhs) const\n{\n    return b == rhs.b;\n}\n\ntemplate<class Archive>\ninline void save(Archive &ar, boost::archive::version_type file_version) const\n{\n    ar << b;\n}\n\ntemplate<class Archive>\ninline void load(Archive & ar, boost::archive::version_type file_version){\n{\n    switch(file_version){\n    case 1:\n        ar >> b;\n        break;\n    case 2:\n    default:\n        assert(false);\n        break;\n    }\n}\n\n#endif // BOOST_SERIALIZATION_TEST_C_HPP\n"
  },
  {
    "path": "test/D.hpp",
    "content": "#ifndef BOOST_SERIALIZATION_TEST_D_HPP\n#define BOOST_SERIALIZATION_TEST_D_HPP\n\n// MS compatible compilers support #pragma once\n#if defined(_MSC_VER)\n# pragma once\n#endif\n\n/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// D.hpp\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for updates, documentation, and revision history.\n\n#include <cstddef> // NULL\n\n#include \"test_tools.hpp\"\n#include <boost/core/no_exceptions_support.hpp>\n#include <boost/serialization/throw_exception.hpp>\n#include <boost/serialization/split_member.hpp>\n\n#include \"B.hpp\"\n\n///////////////////////////////////////////////////////\n// Contained class with multiple identical pointers\nclass D\n{\nprivate:\n    friend class boost::serialization::access;\n    B *b1;\n    B *b2;\n    template<class Archive>\n    void save(Archive &ar, const unsigned int file_version) const{\n        ar << BOOST_SERIALIZATION_NVP(b1);\n        ar << BOOST_SERIALIZATION_NVP(b2);\n    }\n\n    template<class Archive>\n    void load(Archive & ar, const unsigned int file_version){\n        BOOST_TRY {\n            ar >> boost::serialization::make_nvp(\"b\", b1);\n            ar >> boost::serialization::make_nvp(\"b\", b2);\n        }\n        BOOST_CATCH (...){\n            // eliminate invalid pointers\n            b1 = NULL;\n            b2 = NULL;\n            BOOST_FAIL( \"multiple identical pointers failed to load\" );\n        }\n        BOOST_CATCH_END\n        // check that loading was correct\n        BOOST_CHECK(b1 == b2);\n    }\n\n    BOOST_SERIALIZATION_SPLIT_MEMBER()\npublic:\n    D();\n    ~D();\n    bool operator==(const D &rhs) const;\n};\n\nBOOST_CLASS_VERSION(D, 3)\n\nD::D()\n{\n    b1 = new B();\n    b2 = b1;\n}\n\nD::~D()\n{\n    delete b1;\n}\n\nbool D::operator==(const D &rhs) const\n{\n    if(! (*b1 == *(rhs.b1)) )\n        return false;\n    if(! (*b2 == *(rhs.b2)) )\n        return false;\n    return true;\n}\n\n#endif // BOOST_SERIALIZATION_TEST_D_HPP\n"
  },
  {
    "path": "test/J.hpp",
    "content": "#ifndef BOOST_SERIALIZATION_TEST_J_HPP\n#define BOOST_SERIALIZATION_TEST_J_HPP\n\n// MS compatible compilers support #pragma once\n#if defined(_MSC_VER)\n# pragma once\n#endif\n\n/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// J.hpp    simple class test\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for updates, documentation, and revision history.\n\n#include <boost/serialization/base_object.hpp>\n\n#include \"A.hpp\"\n\n///////////////////////////////////////////////////////\n// class with a member which refers to itself\nclass J : public A\n{\nprivate:\n    friend class boost::serialization::access;\n    template<class Archive>\n    void serialize(\n        Archive &ar,\n        const unsigned int /* file_version */\n    ){\n        ar & BOOST_SERIALIZATION_BASE_OBJECT_NVP(A);\n        ar & BOOST_SERIALIZATION_NVP(j);\n    }\npublic:\n    bool operator==(const J &rhs) const;\n    J *j;\n    J(J *_j) : j(_j) {}\n    J() : j(NULL){}\n};\n\nBOOST_CLASS_VERSION(J, 6)\n\nbool J::operator==(const J &rhs) const\n{\n    return static_cast<const A &>(*this) == static_cast<const A &>(rhs);\n}\n\n#endif // BOOST_SERIALIZATION_TEST_J_HPP\n"
  },
  {
    "path": "test/Jamfile.v2",
    "content": "# Boost serialization Library test Jamfile\n\n#  (C) Copyright Robert Ramey 2002-2004.\n#  Use, modification, and distribution are subject to the\n#  Boost Software License, Version 1.0. (See accompanying file\n#  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n#\n\nproject\n    : id serialization_test\n    : requirements <library>/boost/filesystem//boost_filesystem\n        <library>/boost/math//boost_math_tr1\n    ;\n\n# import rules for testing conditional on config file variables\nimport-search /boost/config/checks ;\nimport config : requires ;\n\n# import rules from the boost serialization test\nimport ../util/test :\n    run-template\n    run-invoke\n    run-winvoke\n    test-bsl-run-no-lib\n    test-bsl-run\n    test-bsl-run_archive\n    test-bsl-run_files\n    test-bsl-run_polymorphic_files\n;\n\nBOOST_ARCHIVE_LIST = [ modules.peek : BOOST_ARCHIVE_LIST ] ;\n\nlib dll_a\n    :\n        dll_a.cpp\n        ../build//boost_serialization\n    :\n        <link>shared\n    ;\n\nlib dll_polymorphic_base\n    :\n        dll_polymorphic_base.cpp\n        ../build//boost_serialization\n    :\n        <link>shared\n    ;\n\nlib dll_polymorphic_derived2\n    :\n        dll_polymorphic_derived2.cpp\n        dll_polymorphic_base\n        ../build//boost_serialization\n    :\n        <link>shared\n    ;\n\ntest-suite \"serialization\" :\n     [ test-bsl-run_files test_array : A : :  [ requires cxx11_hdr_array ] ] # BOOST_NO_CXX11_HDR_ARRAY\n     [ test-bsl-run_files test_boost_array : A ]\n     [ test-bsl-run_files test_native_array : A ]\n     [ test-bsl-run_files test_binary ]\n     [ test-bsl-run_files test_class_info_save ]\n     [ test-bsl-run_files test_class_info_load ]\n     [ test-bsl-run_files test_bitset ]\n     [ test-bsl-run_files test_complex ]\n     [ test-bsl-run_files test_contained_class : A ]\n     [ test-bsl-run_files test_cyclic_ptrs : A ]\n     [ test-bsl-run_files test_delete_pointer ]\n     [ test-bsl-run_files test_deque : A ]\n     [ test-bsl-run_files test_derived ]\n     [ test-bsl-run_files test_derived_class : A ]\n     [ test-bsl-run_files test_derived_class_ptr : A ]\n     [ test-bsl-run_files test_diamond ]\n     [ test-bsl-run_files test_diamond_complex ]\n     [ test-bsl-run_files test_forward_list : A  : :  [ requires cxx11_hdr_forward_list ] ] # BOOST_NO_CXX11_HDR_FORWARD_LIST\n     [ test-bsl-run_files test_forward_list_ptrs : A  : :  [ requires cxx11_hdr_forward_list ] ] # BOOST_NO_CXX11_HDR_FORWARD_LIST\n     [ test-bsl-run_files test_helper_support : : : [ requires std_wstreambuf ] ]\n     [ test-bsl-run_files test_interrupts ]\n     [ test-bsl-run_files test_list : A ]\n     [ test-bsl-run_files test_list_ptrs : A ]\n     [ test-bsl-run_files test_map : A ]\n     [ test-bsl-run_files test_map_hashed : A : : [ requires hash ] ] # BOOST_HAS_HASH\n     [ test-bsl-run_files test_mi ]\n     [ test-bsl-run_files test_multiple_ptrs : A ]\n     [ test-bsl-run_files test_multiple_inheritance ]\n     [ test-bsl-run_files test_new_operator : A ]\n     [ test-bsl-run_files test_optional ]\n     [ test-bsl-run_files test_non_intrusive ]\n     [ test-bsl-run_files test_non_default_ctor ]\n     [ test-bsl-run_files test_non_default_ctor2 ]\n     [ test-bsl-run_files test_null_ptr ]\n     [ test-bsl-run_files test_nvp : A ]\n     [ test-bsl-run_files test_object ]\n     [ test-bsl-run_files test_primitive ]\n     [ test-bsl-run_files test_priority_queue : A ]\n     [ test-bsl-run_files test_queue : A ]\n     [ test-bsl-run_files test_recursion : A ]\n     [ test-bsl-run_files test_registered ]\n     [ test-bsl-run_files test_set : A ]\n     [ test-bsl-run_files test_set_hashed : A : : [ requires hash ] ] # BOOST_HAS_HASH\n     [ test-bsl-run_files test_simple_class : A ]\n     [ test-bsl-run_files test_simple_class_ptr : A ]\n     [ test-bsl-run_files test_slist : A : : [ requires slist ] ] # BOOST_HAS_SLIST ]\n     [ test-bsl-run_files test_slist_ptrs : A : : [ requires slist ] ] # BOOST_HAS_SLIST ] ]\n     [ test-bsl-run_files test_split ]\n     [ test-bsl-run_files test_stack : A ]\n     [ test-bsl-run_files test_tracking ]\n     [ test-bsl-run_files test_unregistered ]\n     [ test-bsl-run_files test_unique_ptr ]\n     [ test-bsl-run_files test_valarray ]\n     [ test-bsl-run_files test_variant : A ]\n     [ test-bsl-run_files test_vector : A ]\n     [ test-bsl-run_files test_shared_ptr ]\n     [ test-bsl-run_files test_shared_ptr_multi_base ]\n     [ test-bsl-run_files test_shared_ptr_132 : : : [ requires auto_ptr  ] ] # BOOST_NO_AUTO_PTR\n\n     [ test-bsl-run_polymorphic_files test_polymorphic : test_polymorphic_A A ]\n     [ test-bsl-run_polymorphic_files test_polymorphic2 : test_polymorphic2imp ]\n     [ test-bsl-run_polymorphic_files test_p_helper : : : [ requires std_wstreambuf ] ]\n\n     # this test should pass with both shared and static linking.  But B2 get's mixed up with static linking\n     # so we'll just run the shared version of the test, which is the one that we're most interested\n     # in anyway.\n     [ test-bsl-run_polymorphic_files test_dll_exported : polymorphic_derived1 :  dll_polymorphic_base dll_polymorphic_derived2  : <link>static:<build>no ]\n\n     [ test-bsl-run_polymorphic_files test_no_rtti : polymorphic_base polymorphic_derived1 polymorphic_derived2 ]\n     [ test-bsl-run_polymorphic_files test_exported : polymorphic_base polymorphic_derived1 polymorphic_derived2 ]\n\n     # should compile\n     [ compile test_strong_typedef.cpp ]\n    ;\n\nif ! $(BOOST_ARCHIVE_LIST) {\n    test-suite \"serialization2\" :\n        [ test-bsl-run test_inclusion ]\n        [ test-bsl-run test_inclusion2 ]\n\n        # boost build has the feature that the building if libraries vs dll is automatic\n        # in that dependent libraries are built the same way - shared/static - that\n        # the application is.  On some platforms (e.g windows) this is required to avoid\n        # problems of linking incompatible versions of the runtime library.  So\n        # we suppress tests of our dlls when using static libraries\n\n        [ test-bsl-run test_dll_simple   : : dll_a :  <link>static:<build>no ]\n        # [ test-bsl-run test_dll_plugin : : dll_derived2 : <link>static:<build>no <target-os>linux:<linkflags>-ldl ]\n\n        [ test-bsl-run test_private_ctor ]\n        [ test-bsl-run test_reset_object_address : A ]\n        [ test-bsl-run test_void_cast ]\n        [ test-bsl-run test_mult_archive_types : : : [ requires std_wstreambuf ] ]\n        [ test-bsl-run test_iterators : : : [ requires std_wstreambuf ] ]\n        [ test-bsl-run test_iterators_base64 ]\n        [ test-bsl-run test_smart_cast ]\n        [ test-bsl-run test_codecvt_null ]\n        [ test-bsl-run test_singleton ]\n        [ test-bsl-run test_singleton_inherited ]\n        [ test-bsl-run test_singleton_plain ]\n\n        # [ test-bsl-run test_z ]\n\n        # should fail compilation\n        [ compile-fail test_not_serializable.cpp ]\n        [ compile-fail test_traits_fail.cpp ]\n        [ compile-fail test_const_load_fail1.cpp ]\n        [ compile-fail test_const_load_fail2.cpp ]\n        [ compile-fail test_const_load_fail3.cpp ]\n        [ compile-fail test_const_load_fail1_nvp.cpp ]\n        [ compile-fail test_const_load_fail2_nvp.cpp ]\n        [ compile-fail test_const_load_fail3_nvp.cpp ]\n        [ compile-fail test_check.cpp ]\n\n        # should compile with a warning message\n        [ compile test_static_warning.cpp ]\n        [ compile test_const_save_warn1.cpp ]\n        [ compile test_const_save_warn2.cpp ]\n        [ compile test_const_save_warn3.cpp ]\n\n        # note - library unable to detect these errors for now\n        #[ compile test_const_save_warn1_nvp.cpp ]\n        #[ compile test_const_save_warn2_nvp.cpp ]\n        #[ compile test_const_save_warn3_nvp.cpp ]\n\n        # should compile\n        [ compile test_traits_pass.cpp ]\n        [ compile test_const_pass.cpp ]\n    ;\n}\n"
  },
  {
    "path": "test/base.hpp",
    "content": "#ifndef BOOST_SERIALIZATION_TEST_BASE_HPP\n#define BOOST_SERIALIZATION_TEST_BASE_HPP\n\n// MS compatible compilers support #pragma once\n#if defined(_MSC_VER)\n# pragma once\n#endif\n\n/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// base.hpp    simple class test\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for updates, documentation, and revision history.\n\n#include <boost/config.hpp>\n\n#include <boost/serialization/access.hpp>\n#include <boost/serialization/assume_abstract.hpp>\n#include <boost/preprocessor/facilities/empty.hpp>\n\n#if defined(BASE_IMPORT)\n    #define DLL_DECL BOOST_SYMBOL_IMPORT\n#elif defined(BASE_EXPORT)\n    #define DLL_DECL BOOST_SYMBOL_EXPORT\n#else\n    #define DLL_DECL\n#endif\n\nclass DLL_DECL base\n{\n    friend class boost::serialization::access;\n    template<class Archive>\n    void serialize(Archive & /* ar */, const unsigned int /* file_version */);\npublic:\n    virtual ~base(){};\n};\n\nBOOST_SERIALIZATION_ASSUME_ABSTRACT(base)\n\n#undef  DLL_DECL\n\n#endif // BOOST_SERIALIZATION_TEST_BASE_HPP\n"
  },
  {
    "path": "test/binary_archive.hpp",
    "content": "// (C) Copyright 2002-4 Robert Ramey - http://www.rrsd.com .\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for updates, documentation, and revision history.\n// (C) Copyright 2002-4 Robert Ramey - http://www.rrsd.com .\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for updates, documentation, and revision history.\n\n// binary_archive\n#include <boost/archive/binary_oarchive.hpp>\ntypedef boost::archive::binary_oarchive test_oarchive;\ntypedef std::ofstream test_ostream;\n\n#include <boost/archive/binary_iarchive.hpp>\ntypedef boost::archive::binary_iarchive test_iarchive;\ntypedef std::ifstream test_istream;\n\n//#define TEST_STREAM_FLAGS (std::ios::binary | std::ios::in | std::ios::out)\n#define TEST_STREAM_FLAGS (std::ios::binary)\n"
  },
  {
    "path": "test/binary_warchive.hpp",
    "content": "// (C) Copyright 2002-4 Robert Ramey - http://www.rrsd.com .\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for updates, documentation, and revision history.\n// binary_warchive\n#include <boost/archive/binary_woarchive.hpp>\ntypedef boost::archive::binary_woarchive test_oarchive;\ntypedef std::wofstream test_ostream;\n#include <boost/archive/binary_wiarchive.hpp>\ntypedef boost::archive::binary_wiarchive test_iarchive;\ntypedef std::wifstream test_istream;\n#define TEST_STREAM_FLAGS std::wios::binary\n"
  },
  {
    "path": "test/config_test.cpp",
    "content": "#include \"../../../boost/config.hpp\"\n\n#if defined(__clang__)\n#pragma message \"__clang__ defined\"\n#endif\n\n#if defined(BOOST_CLANG)\n#pragma message \"BOOST_CLANG defined\"\n#endif\n\n#if defined(__GNUC__)\n#pragma message \"__GNUC__ defined\"\n#endif\n\n#include \"../../../boost/mpl/print.hpp\"\n\ntypedef int x;\n"
  },
  {
    "path": "test/derived2.hpp",
    "content": "#ifndef BOOST_SERIALIZATION_TEST_DERIVED2_HPP\n#define BOOST_SERIALIZATION_TEST_DERIVED2_HPP\n\n// MS compatible compilers support #pragma once\n#if defined(_MSC_VER)\n# pragma once\n#endif\n\n/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// derived2.hpp    simple class test\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for updates, documentation, and revision history.\n\n#include <boost/config.hpp>\n\n#include <boost/serialization/export.hpp>\n#include <boost/serialization/access.hpp>\n\n#define BASE_IMPORT\n#include \"base.hpp\"\n\n#if defined(DERIVED2_IMPORT)\n    #define DLL_DECL BOOST_SYMBOL_IMPORT\n#elif defined(DERIVED2_EXPORT)\n    #define DLL_DECL BOOST_SYMBOL_EXPORT\n#else\n    #define DLL_DECL\n#endif\n\nclass DLL_DECL derived2 :\n    public base\n{\n    friend class boost::serialization::access;\n    template<class Archive>\n    void serialize(Archive &ar, const unsigned int /* file_version */);\npublic:\n    ~derived2(){}\n};\n\n#undef DLL_DECL\n\n// MWerks users can do this to make their code work\nBOOST_SERIALIZATION_MWERKS_BASE_AND_DERIVED(base, derived2)\n\n#endif // BOOST_SERIALIZATION_TEST_DERIVED2_HPP\n"
  },
  {
    "path": "test/dll_a.cpp",
    "content": "\n/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// dll_a.cpp\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n// Build a dll which contains the serialization for a class A\n// used in testing distribution of serialization code in DLLS\n\n#define A_EXPORT\n#include \"A.hpp\"\n#include \"A.ipp\"\n#include \"A.cpp\"\n\n// instantiate code for text archives\n\n#include <boost/archive/text_oarchive.hpp>\n#include <boost/archive/text_iarchive.hpp>\n\ntemplate\nA_DLL_DECL void A::serialize(\n    boost::archive::text_oarchive &ar,\n    const unsigned int /* file_version */\n);\ntemplate\nA_DLL_DECL void A::serialize(\n    boost::archive::text_iarchive &ar,\n    const unsigned int /* file_version */\n);\n\n// instantiate code for polymorphic archives\n\n#include <boost/archive/polymorphic_oarchive.hpp>\n#include <boost/archive/polymorphic_iarchive.hpp>\n\ntemplate\nA_DLL_DECL void A::serialize(\n    boost::archive::polymorphic_oarchive &,\n    const unsigned int /* file_version */\n);\ntemplate\nA_DLL_DECL void A::serialize(\n    boost::archive::polymorphic_iarchive &,\n    const unsigned int /* file_version */\n);\n\n"
  },
  {
    "path": "test/dll_base.cpp",
    "content": "/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// dll_base.cpp\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n// Build a dll which contains the serialization for a class A\n// used in testing distribution of serialization code in DLLS\n#include <boost/serialization/export.hpp>\n\n#define BASE_EXPORT\n#include \"base.hpp\"\n\ntemplate<class Archive>\nvoid base::serialize(\n    Archive &ar,\n    const unsigned int /* file_version */){\n}\n\n// for some reason this is required at least by MSVC\n// given that its declared virtual .. = 0;  This\n// seems wrong to me but here it is.\n//polymorphic_base::~polymorphic_base(){}\n\n// instantiate code for text archives\n#include <boost/archive/text_oarchive.hpp>\n#include <boost/archive/text_iarchive.hpp>\n\n// instantiate code for polymorphic archives\n#include <boost/archive/polymorphic_oarchive.hpp>\n#include <boost/archive/polymorphic_iarchive.hpp>\n\n// note: BOOST_CLASS_EXPORT cannot be used to instantiate\n// serialization code for an abstract base class.  So use\n// explicit instantiation in this case.\n//BOOST_CLASS_EXPORT(polymorphic_base)\n\ntemplate BOOST_SYMBOL_EXPORT void base::serialize(\n    boost::archive::text_oarchive & ar,\n    const unsigned int version\n);\ntemplate BOOST_SYMBOL_EXPORT void base::serialize(\n    boost::archive::text_iarchive & ar,\n    const unsigned int version\n);\ntemplate BOOST_SYMBOL_EXPORT void base::serialize(\n    boost::archive::polymorphic_oarchive & ar,\n    const unsigned int version\n);\ntemplate BOOST_SYMBOL_EXPORT void base::serialize(\n    boost::archive::polymorphic_iarchive & ar,\n    const unsigned int version\n);\n"
  },
  {
    "path": "test/dll_derived2.cpp",
    "content": "/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// dll_derived2.cpp\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n// Build a dll which contains the serialization for a class A\n// used in testing distribution of serialization code in DLLS\n\n#include <boost/config.hpp>\n\n#include <boost/serialization/nvp.hpp>\n\n#define DERIVED2_EXPORT\n#include \"derived2.hpp\"\n\ntemplate<class Archive>\nvoid derived2::serialize(\n    Archive &ar,\n    const unsigned int /* file_version */\n){\n    ar & BOOST_SERIALIZATION_BASE_OBJECT_NVP(base);\n}\n\n// instantiate code for text archives\n#include <boost/archive/text_oarchive.hpp>\n#include <boost/archive/text_iarchive.hpp>\n\ntemplate BOOST_SYMBOL_EXPORT void derived2::serialize(\n    boost::archive::text_oarchive & ar,\n    const unsigned int version\n);\ntemplate BOOST_SYMBOL_EXPORT void derived2::serialize(\n    boost::archive::text_iarchive & ar,\n    const unsigned int version\n);\n\n#include <boost/archive/polymorphic_oarchive.hpp>\n#include <boost/archive/polymorphic_iarchive.hpp>\n\ntemplate BOOST_SYMBOL_EXPORT void derived2::serialize(\n    boost::archive::polymorphic_oarchive & ar,\n    const unsigned int version\n);\ntemplate BOOST_SYMBOL_EXPORT void derived2::serialize(\n    boost::archive::polymorphic_iarchive & ar,\n    const unsigned int version\n);\n\n// note: export has to be AFTER #includes for all archive classes\n\n#include <boost/serialization/factory.hpp>\nBOOST_SERIALIZATION_FACTORY_0(derived2)\nBOOST_CLASS_EXPORT(derived2)\n"
  },
  {
    "path": "test/dll_polymorphic_base.cpp",
    "content": "/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// dll_polymorphic_base.cpp\n\n// (C) Copyright 2018 Robert Ramey - http://www.rrsd.com .\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for updates, documentation, and revision history.\n\n#define POLYMORPHIC_BASE_EXPORT\n#include \"polymorphic_base.cpp\"\n"
  },
  {
    "path": "test/dll_polymorphic_derived2.cpp",
    "content": "/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// polymorphic_derived2.cpp\n\n// (C) Copyright 2018 Robert Ramey - http://www.rrsd.com .\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for updates, documentation, and revision history.\n\n#define POLYMORPHIC_BASE_IMPORT\n#define POLYMORPHIC_DERIVED2_EXPORT\n#include \"polymorphic_derived2.cpp\"\n"
  },
  {
    "path": "test/multi_shared1.cpp",
    "content": "/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// test_multi_shared_lib.cpp: test that implementation of extented_type_info\n//\t\tworks when using multiple shared libraries\n\n// (C) Copyright 2018 Alexander Grund\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n#include <boost/archive/text_oarchive.hpp>\n#include <iostream>\n\nstruct X1{\n  template<class Archive>\n  void serialize(Archive &, const unsigned int){}\n};\n\nBOOST_CLASS_IMPLEMENTATION(X1, boost::serialization::object_class_info)\n\nBOOST_SYMBOL_EXPORT bool f(){\n  boost::archive::text_oarchive(std::cout) & X1();\n  return true;\n}\n"
  },
  {
    "path": "test/multi_shared2.cpp",
    "content": "/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// multi_shared2.cpp: library simply using extended_type_info_typeid\n\n// (C) Copyright 2018 Alexander Grund\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n#include <boost/archive/text_oarchive.hpp>\n#include <iostream>\n\nstruct X2{\n  template<class Archive>\n  void serialize(Archive &, const unsigned int){}\n};\n\nBOOST_CLASS_IMPLEMENTATION(X2, boost::serialization::object_class_info)\n\nBOOST_SYMBOL_EXPORT bool g(){\n  boost::archive::text_oarchive(std::cout) & X2();\n  return true;\n}\n"
  },
  {
    "path": "test/polymorphic_array_binary_archive.hpp",
    "content": "// (C) Copyright 2002-4 Robert Ramey - http://www.rrsd.com .\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for updates, documentation, and revision history.\n#include <boost/archive/polymorphic_binary_oarchive.hpp>\ntypedef boost::archive::polymorphic_binary_oarchive test_oarchive;\ntypedef std::ofstream test_ostream;\n#include <boost/archive/polymorphic_binary_iarchive.hpp>\ntypedef boost::archive::polymorphic_binary_iarchive test_iarchive;\ntypedef std::ifstream test_istream;\n#define TEST_STREAM_FLAGS std::ios::binary\n"
  },
  {
    "path": "test/polymorphic_base.cpp",
    "content": "/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// polymorphic_base.cpp\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for updates, documentation, and revision history.\n\n#include <boost/serialization/export.hpp>\n\n#include \"polymorphic_base.hpp\"\n\ntemplate<class Archive>\nPOLYMORPHIC_BASE_DLL_DECL void polymorphic_base::serialize(\n    Archive &ar,\n    const unsigned int /* file_version */\n){}\n\nPOLYMORPHIC_BASE_DLL_DECL\npolymorphic_base::polymorphic_base(){}\nPOLYMORPHIC_BASE_DLL_DECL\npolymorphic_base::~polymorphic_base(){}\n\n#include <boost/archive/polymorphic_oarchive.hpp>\n#include <boost/archive/polymorphic_iarchive.hpp>\n\ntemplate\nPOLYMORPHIC_BASE_DLL_DECL void polymorphic_base::serialize(\n    boost::archive::polymorphic_oarchive &,\n    const unsigned int /* file_version */\n);\ntemplate POLYMORPHIC_BASE_DLL_DECL void polymorphic_base::serialize(\n    boost::archive::polymorphic_iarchive &,\n    const unsigned int\n);\nBOOST_CLASS_EXPORT_IMPLEMENT(polymorphic_base)\n"
  },
  {
    "path": "test/polymorphic_base.hpp",
    "content": "#ifndef POLYMORPHIC_BASE_HPP\n#define POLYMORPHIC_BASE_HPP\n\n// MS compatible compilers support #pragma once\n#if defined(_MSC_VER)\n# pragma once\n#endif\n\n/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// polymorphic_base.hpp    simple class test\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for updates, documentation, and revision history.\n\n#include <boost/config.hpp>\n\n#include <boost/serialization/access.hpp>\n#include <boost/serialization/assume_abstract.hpp>\n#include <boost/serialization/export.hpp>\n#include <boost/serialization/type_info_implementation.hpp>\n#include <boost/serialization/extended_type_info_no_rtti.hpp>\n\n#if defined(POLYMORPHIC_BASE_IMPORT)\n    #define POLYMORPHIC_BASE_DLL_DECL BOOST_SYMBOL_IMPORT\n    #pragma message (\"polymorphic_base imported\")\n#elif defined(POLYMORPHIC_BASE_EXPORT)\n    #define POLYMORPHIC_BASE_DLL_DECL BOOST_SYMBOL_EXPORT\n    #pragma message (\"polymorphic_base exported\")\n#endif\n\n#ifndef POLYMORPHIC_BASE_DLL_DECL\n    #define POLYMORPHIC_BASE_DLL_DECL\n#endif\n\nclass BOOST_SYMBOL_VISIBLE polymorphic_base\n{\n    friend class boost::serialization::access;\n    template<class Archive>\n    POLYMORPHIC_BASE_DLL_DECL void serialize(\n        Archive & /* ar */,\n        const unsigned int /* file_version */\n    );\npublic:\n    // note that since this class uses the \"no_rtti\"\n    // extended_type_info implementation, it MUST\n    // implement this function\n    virtual const char * get_key() const = 0;\n    POLYMORPHIC_BASE_DLL_DECL polymorphic_base();\n    POLYMORPHIC_BASE_DLL_DECL virtual ~polymorphic_base();\n};\n\nBOOST_SERIALIZATION_ASSUME_ABSTRACT(polymorphic_base)\n\n// the no_rtti system requires this !!!\nBOOST_CLASS_EXPORT_KEY(polymorphic_base)\n\nBOOST_CLASS_TYPE_INFO(\n    polymorphic_base,\n    extended_type_info_no_rtti<polymorphic_base>\n)\n\n#endif // POLYMORPHIC_BASE_HPP\n"
  },
  {
    "path": "test/polymorphic_binary_archive.hpp",
    "content": "// (C) Copyright 2002-4 Robert Ramey - http://www.rrsd.com .\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for updates, documentation, and revision history.\n#include <boost/archive/polymorphic_binary_oarchive.hpp>\ntypedef boost::archive::polymorphic_binary_oarchive test_oarchive;\ntypedef std::ofstream test_ostream;\n#include <boost/archive/polymorphic_binary_iarchive.hpp>\ntypedef boost::archive::polymorphic_binary_iarchive test_iarchive;\ntypedef std::ifstream test_istream;\n#define TEST_STREAM_FLAGS std::ios::binary\n"
  },
  {
    "path": "test/polymorphic_derived1.cpp",
    "content": "/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// polymorphic_derived1.cpp\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for updates, documentation, and revision history.\n\n#include <boost/serialization/type_info_implementation.hpp>\n#include <boost/serialization/export.hpp>\n\n#include \"polymorphic_derived1.hpp\"\n\nconst char * polymorphic_derived1::get_key() const {\n    return\n        boost::serialization::type_info_implementation<\n            polymorphic_derived1\n        >::type::get_const_instance().get_key();\n}\n\n#include <boost/archive/polymorphic_oarchive.hpp>\n#include <boost/archive/polymorphic_iarchive.hpp>\n\ntemplate\nvoid polymorphic_derived1::serialize(\n    boost::archive::polymorphic_oarchive &,\n    const unsigned int /* file_version */\n);\ntemplate\nvoid polymorphic_derived1::serialize(\n    boost::archive::polymorphic_iarchive &,\n    const unsigned int\n);\n\nBOOST_CLASS_EXPORT_IMPLEMENT(polymorphic_derived1)\n"
  },
  {
    "path": "test/polymorphic_derived1.hpp",
    "content": "#ifndef POLYMORPHIC_DERIVED1_HPP\n#define POLYMORPHIC_DERIVED1_HPP\n\n// MS compatible compilers support #pragma once\n#if defined(_MSC_VER)\n# pragma once\n#endif\n\n/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// polymorphic_derived1.hpp    simple class test\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for updates, documentation, and revision history.\n\n#include <boost/serialization/access.hpp>\n#include <boost/serialization/nvp.hpp>\n#include <boost/serialization/base_object.hpp>\n#include <boost/serialization/type_info_implementation.hpp>\n#include <boost/serialization/extended_type_info_no_rtti.hpp>\n\n#include \"polymorphic_base.hpp\"\n\nclass polymorphic_derived1 : public polymorphic_base\n{\n    friend class boost::serialization::access;\n    template<class Archive>\n    void serialize(Archive &ar, const unsigned int  /* file_version */){\n        ar & BOOST_SERIALIZATION_BASE_OBJECT_NVP(polymorphic_base);\n    }\npublic:\n    virtual const char * get_key() const ;\n};\n\nBOOST_CLASS_EXPORT_KEY(polymorphic_derived1)\n\nBOOST_CLASS_TYPE_INFO(\n    polymorphic_derived1,\n    extended_type_info_no_rtti<polymorphic_derived1>\n)\n\n#endif // POLYMORPHIC_DERIVED1_HPP\n"
  },
  {
    "path": "test/polymorphic_derived2.cpp",
    "content": "/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// polymorphic_derived2.cpp\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for updates, documentation, and revision history.\n\n#include <boost/serialization/type_info_implementation.hpp>\n#include <boost/serialization/extended_type_info_no_rtti.hpp>\n#include <boost/serialization/export.hpp>\n\n#include \"polymorphic_base.hpp\"\n#include \"polymorphic_derived2.hpp\"\n\ntemplate<class Archive>\nPOLYMORPHIC_DERIVED2_DLL_DECL void polymorphic_derived2::serialize(\n    Archive &ar,\n    const unsigned int /* file_version */\n){\n    ar & BOOST_SERIALIZATION_BASE_OBJECT_NVP(polymorphic_base);\n}\n\nconst char * polymorphic_derived2::get_key() const {\n    return \"polymorphic_derived2\";\n}\nPOLYMORPHIC_DERIVED2_DLL_DECL\npolymorphic_derived2::polymorphic_derived2(){}\nPOLYMORPHIC_DERIVED2_DLL_DECL\npolymorphic_derived2::~polymorphic_derived2(){}\n\n#include <boost/archive/polymorphic_oarchive.hpp>\n#include <boost/archive/polymorphic_iarchive.hpp>\n\ntemplate\nPOLYMORPHIC_DERIVED2_DLL_DECL void polymorphic_derived2::serialize(\n    boost::archive::polymorphic_oarchive &,\n    const unsigned int /* file_version */\n);\ntemplate\nPOLYMORPHIC_DERIVED2_DLL_DECL void polymorphic_derived2::serialize(\n    boost::archive::polymorphic_iarchive &,\n    const unsigned int\n);\n\n// MWerks users can do this to make their code work\nBOOST_SERIALIZATION_MWERKS_BASE_AND_DERIVED(polymorphic_base, polymorphic_derived2)\n\n// note: export has to be AFTER #includes for all archive classes\nBOOST_CLASS_EXPORT_IMPLEMENT(polymorphic_derived2)\n"
  },
  {
    "path": "test/polymorphic_derived2.hpp",
    "content": "#ifndef BOOST_SERIALIZATION_TEST_POLYMORPHIC_DERIVED2_HPP\n#define BOOST_SERIALIZATION_TEST_POLYMORPHIC_DERIVED2_HPP\n\n// MS compatible compilers support #pragma once\n#if defined(_MSC_VER)\n# pragma once\n#endif\n\n/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// polymorphic_derived2.hpp    simple class test\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for updates, documentation, and revision history.\n\n#include <boost/config.hpp>\n\n#include <boost/serialization/access.hpp>\n#include <boost/serialization/nvp.hpp>\n#include <boost/serialization/base_object.hpp>\n#include <boost/serialization/type_info_implementation.hpp>\n#include <boost/serialization/extended_type_info_typeid.hpp>\n\n#if defined(POLYMORPHIC_DERIVED2_IMPORT)\n    #define POLYMORPHIC_DERIVED2_DLL_DECL BOOST_SYMBOL_IMPORT\n    #pragma message (\"polymorphic_derived2 imported\")\n#elif defined(POLYMORPHIC_DERIVED2_EXPORT)\n    #define POLYMORPHIC_DERIVED2_DLL_DECL BOOST_SYMBOL_EXPORT\n    #pragma message (\"polymorphic_derived2 exported\")\n#endif\n\n#ifndef POLYMORPHIC_DERIVED2_DLL_DECL\n    #define POLYMORPHIC_DERIVED2_DLL_DECL\n#endif\n\n#define POLYMORPHIC_BASE_IMPORT\n#include \"polymorphic_base.hpp\"\n\nclass BOOST_SYMBOL_VISIBLE polymorphic_derived2 :\n    public polymorphic_base\n{\n    friend class boost::serialization::access;\n    template<class Archive>\n    POLYMORPHIC_DERIVED2_DLL_DECL void serialize(\n        Archive &ar,\n        const unsigned int /* file_version */\n    );\n    POLYMORPHIC_DERIVED2_DLL_DECL const char * get_key() const;\npublic:\n    POLYMORPHIC_DERIVED2_DLL_DECL polymorphic_derived2();\n    POLYMORPHIC_DERIVED2_DLL_DECL ~polymorphic_derived2();\n};\n\n// we use this because we want to assign a key to this type\n// but we don't want to explicitly instantiate code every time\n// we do so!!!.  If we don't do this, we end up with the same\n// code in BOTH the DLL which implements polymorphic_derived2\n// as well as the main program.\nBOOST_CLASS_EXPORT_KEY(polymorphic_derived2)\n\n// note the mixing of type_info systems is supported.\nBOOST_CLASS_TYPE_INFO(\n    polymorphic_derived2,\n    boost::serialization::extended_type_info_typeid<polymorphic_derived2>\n)\n\n#endif // BOOST_SERIALIZATION_TEST_POLYMORPHIC_DERIVED2_HPP\n\n"
  },
  {
    "path": "test/polymorphic_text_archive.hpp",
    "content": "// (C) Copyright 2002-4 Robert Ramey - http://www.rrsd.com .\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for updates, documentation, and revision history.\n#include <boost/archive/polymorphic_text_oarchive.hpp>\ntypedef boost::archive::polymorphic_text_oarchive test_oarchive;\ntypedef std::ofstream test_ostream;\n#include <boost/archive/polymorphic_text_iarchive.hpp>\ntypedef boost::archive::polymorphic_text_iarchive test_iarchive;\ntypedef std::ifstream test_istream;\n"
  },
  {
    "path": "test/polymorphic_text_warchive.hpp",
    "content": "// (C) Copyright 2002-4 Robert Ramey - http://www.rrsd.com .\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for updates, documentation, and revision history.\n#include <boost/config.hpp>\n#ifdef BOOST_NO_STD_WSTREAMBUF\n#error \"wide char i/o not supported on this platform\"\n#else\n#include <boost/archive/polymorphic_text_woarchive.hpp>\ntypedef boost::archive::polymorphic_text_woarchive test_oarchive;\ntypedef std::wofstream test_ostream;\n#include <boost/archive/polymorphic_text_wiarchive.hpp>\ntypedef boost::archive::polymorphic_text_wiarchive test_iarchive;\ntypedef std::wifstream test_istream;\n#endif\n"
  },
  {
    "path": "test/polymorphic_xml_archive.hpp",
    "content": "// (C) Copyright 2002-4 Robert Ramey - http://www.rrsd.com .\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for updates, documentation, and revision history.\n#include <boost/archive/polymorphic_xml_oarchive.hpp>\ntypedef boost::archive::polymorphic_xml_oarchive test_oarchive;\ntypedef std::ofstream test_ostream;\n#include <boost/archive/polymorphic_xml_iarchive.hpp>\ntypedef boost::archive::polymorphic_xml_iarchive test_iarchive;\ntypedef std::ifstream test_istream;\n"
  },
  {
    "path": "test/polymorphic_xml_warchive.hpp",
    "content": "// (C) Copyright 2002-4 Robert Ramey - http://www.rrsd.com .\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for updates, documentation, and revision history.\n#include <boost/archive/polymorphic_xml_woarchive.hpp>\ntypedef boost::archive::polymorphic_xml_woarchive test_oarchive;\ntypedef std::wofstream test_ostream;\n#include <boost/archive/polymorphic_xml_wiarchive.hpp>\ntypedef boost::archive::polymorphic_xml_wiarchive test_iarchive;\ntypedef std::wifstream test_istream;\n"
  },
  {
    "path": "test/portable_binary_archive.hpp",
    "content": "// (C) Copyright 2002-4 Robert Ramey - http://www.rrsd.com .\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n// See http://www.boost.org for updates, documentation, and revision history.\n// file includes for testing a custom archive.\n// as an example this tests the portable binary archive\n\n#include <fstream>\n\n// #include output archive header\n#include \"../example/portable_binary_oarchive.hpp\"\n// define output archive class to be used\ntypedef portable_binary_oarchive test_oarchive;\n// and corresponding stream\ntypedef std::ofstream test_ostream;\n\n// repeat the above for corresponding input archive\n#include \"../example/portable_binary_iarchive.hpp\"\ntypedef portable_binary_iarchive test_iarchive;\ntypedef std::ifstream test_istream;\n\n// since this archive class isn't compiled into the\n// boost serialization library, include this here\n// so that things get instantiated\n#include \"../example/portable_binary_oarchive.cpp\"\n#include \"../example/portable_binary_iarchive.cpp\"\n\n// and stream open flags\n#define TEST_STREAM_FLAGS std::ios::binary\n"
  },
  {
    "path": "test/test__helper.cpp",
    "content": "/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// test_polymorphic.cpp\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n// should pass compilation and execution\n\n#include <cstddef> // NULL\n#include <cstdio> // remove\n#include <fstream>\n\n#include <boost/config.hpp>\n#if defined(BOOST_NO_STDC_NAMESPACE)\nnamespace std{\n    using ::remove;\n}\n#endif\n\n// the following is to ensure that when one of the libraries changes\n// BJAM rebuilds and relinks the test.\n/*\n#include \"polymorphic_text_archive.hpp\"\n#include \"polymorphic_text_warchive.hpp\"\n#include \"polymorphic_binary_archive.hpp\"\n#include \"polymorphic_xml_archive.hpp\"\n#include \"polymorphic_xml_warchive.hpp\"\n*/\n\n#include <string>\n#include <vector>\n\n#include \"test_tools.hpp\"\n#include <boost/lexical_cast.hpp>\n#include <boost/serialization/split_free.hpp>\n#include <boost/serialization/vector.hpp>\n#include <boost/serialization/nvp.hpp>\n// this test uses a special string (my_string) whose contents are shared\n// and hence saved in the archive only once.  We need a helper in order\n// to convert my_string into a serializable type\n\nclass my_string:public std::string\n{\n    typedef std::string super;\n\npublic:\n    my_string(){}\n    my_string(const super & str): super(str){}\n    my_string & operator=(const super& rhs) {\n      super::operator=(rhs);\n      return *this;\n    }\n};\n\nstruct my_string_helper\n{\n  typedef std::vector<my_string> table;\n  table m_t;\n};\n\nBOOST_SERIALIZATION_SPLIT_FREE(my_string)\n\nnamespace boost {\nnamespace serialization {\n\ntemplate<class Archive>\nvoid save(Archive & ar, const my_string & str, const unsigned int /* version */)\n{\n    void (* const idx)(Archive &, const my_string &, const unsigned int) = & save;\n    void * const id = reinterpret_cast<void * const>(idx);\n    my_string_helper & msh = ar.template get_helper<my_string_helper>(id);\n\n    my_string_helper::table t = msh.m_t;\n    my_string_helper::table::iterator it = std::find(t.begin(), t.end(), str);\n    if(it == t.end()){\n        my_string_helper::table::size_type s = t.size();\n        ar << make_nvp(\"index\", s);\n        t.push_back(str);\n        ar << make_nvp(\"string\", static_cast<const std::string &>(str));\n    }\n    else{\n        my_string_helper::table::size_type s = it - t.begin();\n        ar << make_nvp(\"index\", s);\n    }\n}\n\ntemplate<class Archive>\nvoid load(Archive & ar, my_string & str, const unsigned int /* version */)\n{\n    void (* const idx)(Archive &, my_string &, const unsigned int) = & load;\n    void * const id = reinterpret_cast<void * const>(idx);\n    my_string_helper & msh = ar.template get_helper<my_string_helper>(id);\n\n    my_string_helper::table t = msh.m_t;\n\n    my_string_helper::table::size_type s;\n    ar >> make_nvp(\"index\", s);\n    t.reserve(s);\n    if(s >= t.size()){\n        std::string tmp;\n        ar >> make_nvp(\"string\", tmp);\n        str = tmp;\n        t.push_back(str);\n    }\n    else{\n        str = t[s];\n    }\n}\n\n} // namespace serialization\n} // namespace boost\n#include <boost/archive/polymorphic_oarchive.hpp>\n#include <boost/archive/polymorphic_iarchive.hpp>\n\nint test_main(int /* argc */, char * /* argv */ [])\n{\n    const char * testfile = boost::archive::tmpnam(NULL);\n    BOOST_REQUIRE(NULL != testfile);\n\n    std::vector<my_string> v1;\n    for(int i=0; i<1000; ++i){\n        v1.push_back(my_string(boost::lexical_cast<std::string>(i % 100)));\n    }\n\n    // test using using polymorphic implementation.\n    {\n        test_ostream os(testfile, TEST_STREAM_FLAGS);\n        test_oarchive oa_implementation(os, TEST_ARCHIVE_FLAGS);\n        oa_implementation << boost::serialization::make_nvp(\"vector\", v1);\n    }\n    {\n        std::vector<my_string> v2;\n        test_istream is(testfile, TEST_STREAM_FLAGS);\n        test_iarchive  ia_implementation(is, TEST_ARCHIVE_FLAGS);\n        ia_implementation >> boost::serialization::make_nvp(\"vector\", v2);\n        BOOST_CHECK(v1 == v2);\n    }\n    std::remove(testfile);\n\n    // test using using polymorphic interface.\n    {\n        test_ostream os(testfile, TEST_STREAM_FLAGS);\n        test_oarchive oa_implementation(os, TEST_ARCHIVE_FLAGS);\n        boost::archive::polymorphic_oarchive & oa_interface = oa_implementation;\n        oa_interface << boost::serialization::make_nvp(\"vector\", v1);\n    }\n    {\n        std::vector<my_string> v2;\n        test_istream is(testfile, TEST_STREAM_FLAGS);\n        test_iarchive  ia_implementation(is, TEST_ARCHIVE_FLAGS);\n        boost::archive::polymorphic_iarchive & ia_interface = ia_implementation;\n        ia_interface >> boost::serialization::make_nvp(\"vector\", v2);\n        BOOST_CHECK(v1 == v2);\n    }\n    std::remove(testfile);\n    std::remove(testfile);\n    return EXIT_SUCCESS;\n}\n"
  },
  {
    "path": "test/test_array.cpp",
    "content": "/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// test_array.cpp\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n// should pass compilation and execution\n\n#include <stdlib.h>\n\n#include <boost/config.hpp>\n#include <cstddef>\n#include <fstream>\n#include <algorithm> // equal\n#include <cstdio> // remove\n#if defined(BOOST_NO_STDC_NAMESPACE)\nnamespace std{\n    using ::remove;\n}\n#endif\n#include \"test_tools.hpp\"\n#include <boost/serialization/array.hpp>\n#include <boost/core/no_exceptions_support.hpp>\n#include <boost/archive/archive_exception.hpp>\n\n#include \"A.hpp\"\n#include \"A.ipp\"\n\ntemplate <class T>\nint test_std_array(){\n    const char * testfile = boost::archive::tmpnam(NULL);\n    BOOST_REQUIRE(NULL != testfile);\n\n    // test array of objects\n    const std::array<T, 10> a_array = {{T(),T(),T(),T(),T(),T(),T(),T(),T(),T()}};\n    {\n        test_ostream os(testfile, TEST_STREAM_FLAGS);\n        test_oarchive oa(os, TEST_ARCHIVE_FLAGS);\n        oa << boost::serialization::make_nvp(\"a_array\", a_array);\n    }\n    {\n        std::array<T, 10> a_array1;\n        test_istream is(testfile, TEST_STREAM_FLAGS);\n        {\n            test_iarchive ia(is, TEST_ARCHIVE_FLAGS);\n            ia >> boost::serialization::make_nvp(\"a_array\", a_array1);\n        }\n        BOOST_CHECK(std::equal(a_array.begin(), a_array.end(), a_array1.begin()));\n    }\n    {\n        std::array<T, 9> a_array1;\n        test_istream is(testfile, TEST_STREAM_FLAGS);\n        {\n            test_iarchive ia(is, TEST_ARCHIVE_FLAGS);\n            bool exception_invoked = false;\n            BOOST_TRY {\n                ia >> boost::serialization::make_nvp(\"a_array\", a_array1);\n            }\n            BOOST_CATCH (boost::archive::archive_exception const& ae){\n                BOOST_CHECK(\n                    boost::archive::archive_exception::array_size_too_short\n                    == ae.code\n                );\n                exception_invoked = true;\n            }\n            BOOST_CATCH_END\n            BOOST_CHECK(exception_invoked);\n        }\n        is.close();\n    }\n    std::remove(testfile);\n    return EXIT_SUCCESS;\n}\n\nint test_main( int /* argc */, char* /* argv */[] ){\n    int res;\n\n    // std array\n    res = test_std_array<A>();\n    if (res != EXIT_SUCCESS)\n        return EXIT_FAILURE;\n    // test an int array for which optimized versions should be available\n    res = test_std_array<int>();\n    if (res != EXIT_SUCCESS)\n        return EXIT_FAILURE;\n\n    return EXIT_SUCCESS;\n}\n\n// EOF\n"
  },
  {
    "path": "test/test_binary.cpp",
    "content": "/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// test_simple_class.cpp\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n// should pass compilation and execution\n\n#include <cstdlib> // for rand(), NULL, size_t\n\n#include <fstream>\n#include <boost/config.hpp>\n\n#include <cstdio> // remove\n#if defined(BOOST_NO_STDC_NAMESPACE)\nnamespace std{\n    using ::rand;\n    using ::remove;\n}\n#endif\n\n#include \"test_tools.hpp\"\n\n#include <boost/serialization/nvp.hpp>\n#include <boost/serialization/binary_object.hpp>\n\nclass A {\n    friend class boost::serialization::access;\n    char data[150];\n    // note: from an aesthetic perspective, I would much prefer to have this\n    // defined out of line.  Unfortunately, this trips a bug in the VC 6.0\n    // compiler. So hold our nose and put it her to permit running of tests.\n    template<class Archive>\n    void serialize(Archive & ar, const unsigned int /* file_version */){\n        ar & boost::serialization::make_nvp(\n            \"data\",\n            boost::serialization::make_binary_object(data, sizeof(data))\n        );\n    }\n\npublic:\n    A();\n    bool operator==(const A & rhs) const;\n};\n\nA::A(){\n    int i = sizeof(data);\n    while(i-- > 0)\n        data[i] = static_cast<char>(0xff & std::rand());\n}\n\nbool A::operator==(const A & rhs) const {\n    int i = sizeof(data);\n    while(i-- > 0)\n        if(data[i] != rhs.data[i])\n            return false;\n    return true;\n}\n\nint test_main( int /* argc */, char* /* argv */[] )\n{\n    const char * testfile = boost::archive::tmpnam(NULL);\n    BOOST_REQUIRE(NULL != testfile);\n\n    const A a;\n    char s1[] = \"a\";\n    char s2[] = \"ab\";\n    char s3[] = \"abc\";\n    char s4[] = \"abcd\";\n    const int i = 12345;\n\n    A a1;\n    char s1_1[10];\n    char s1_2[10];\n    char s1_3[10];\n    char s1_4[10];\n    int i1 = 34790;\n\n    std::memset(s1_1, '\\0', sizeof(s1_1));\n    std::memset(s1_2, '\\0', sizeof(s1_2));\n    std::memset(s1_3, '\\0', sizeof(s1_3));\n    std::memset(s1_4, '\\0', sizeof(s1_4));\n    {\n        test_ostream os(testfile, TEST_STREAM_FLAGS);\n        test_oarchive oa(os, TEST_ARCHIVE_FLAGS);\n        oa << boost::serialization::make_nvp(\n            \"s1\",\n            boost::serialization::make_binary_object(\n                s1,\n                sizeof(s1)\n            )\n        );\n        oa << boost::serialization::make_nvp(\n            \"s2\",\n            boost::serialization::make_binary_object(\n                s2,\n                sizeof(s2)\n            )\n        );\n        oa << boost::serialization::make_nvp(\n            \"s3\",\n            boost::serialization::make_binary_object(\n                s3,\n                sizeof(s3)\n            )\n        );\n        oa << boost::serialization::make_nvp(\n            \"s4\",\n            boost::serialization::make_binary_object(\n                s4,\n                sizeof(s4)\n            )\n        );\n        oa << BOOST_SERIALIZATION_NVP(a);\n        // note: add a little bit on the end of the archive to detect\n        // failure of text mode binary.\n        oa << BOOST_SERIALIZATION_NVP(i);\n    }\n    {\n        test_istream is(testfile, TEST_STREAM_FLAGS);\n        test_iarchive ia(is, TEST_ARCHIVE_FLAGS);\n        ia >> boost::serialization::make_nvp(\n            \"s1\",\n            boost::serialization::make_binary_object(\n                s1_1,\n                sizeof(s1)\n            )\n        );\n        ia >> boost::serialization::make_nvp(\n            \"s2\",\n            boost::serialization::make_binary_object(\n                s1_2,\n                sizeof(s2)\n            )\n        );\n        ia >> boost::serialization::make_nvp(\n            \"s3\",\n            boost::serialization::make_binary_object(\n                s1_3,\n                sizeof(s3)\n            )\n        );\n        ia >> boost::serialization::make_nvp(\n            \"s4\",\n            boost::serialization::make_binary_object(\n                s1_4,\n                sizeof(s4)\n            )\n        );\n        ia >> BOOST_SERIALIZATION_NVP(a1);\n        // note: add a little bit on the end of the archive to detect\n        // failure of text mode binary.\n        ia >> BOOST_SERIALIZATION_NVP(i1);\n    }\n    BOOST_CHECK(0 == std::strcmp(s1, s1_1));\n    BOOST_CHECK(0 == std::strcmp(s2, s1_2));\n    BOOST_CHECK(0 == std::strcmp(s3, s1_3));\n    BOOST_CHECK(0 == std::strcmp(s4, s1_4));\n    BOOST_CHECK(a == a1);\n    BOOST_CHECK(i == i1);\n    std::remove(testfile);\n    return EXIT_SUCCESS;\n}\n\n// EOF\n"
  },
  {
    "path": "test/test_bitset.cpp",
    "content": "//  (C) Copyright 2009 Brian Ravnsgaard and Kenneth Riddile\n//  Use, modification and distribution are subject to the\n//  Boost Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for most recent version including documentation.\n\n// Test that serialization of std::bitset works.\n// Should pass compilation and execution\n// 16.09.2004, updated 04.03.2009\n\n#include <cstddef> // NULL\n#include <cstdio> // remove\n#include <fstream>\n\n#include <boost/config.hpp>\n\n#if defined( BOOST_NO_STDC_NAMESPACE )\nnamespace std\n{\n    using ::remove;\n}\n#endif\n\n#include \"test_tools.hpp\"\n\n#include <boost/serialization/bitset.hpp>\n#include <boost/serialization/nvp.hpp>\n\nint test_main( int /* argc */, char* /* argv */[] )\n{\n    const char* testfile = boost::archive::tmpnam( NULL );\n    BOOST_REQUIRE( NULL != testfile );\n\n    std::bitset<8> bitsetA;\n    bitsetA.set( 0, false );\n    bitsetA.set( 1, true  );\n    bitsetA.set( 2, false );\n    bitsetA.set( 3, true  );\n    bitsetA.set( 4, false );\n    bitsetA.set( 5, false );\n    bitsetA.set( 6, true  );\n    bitsetA.set( 7, true  );\n\n    {\n        test_ostream os( testfile, TEST_STREAM_FLAGS );\n        test_oarchive oa( os );\n        oa << boost::serialization::make_nvp( \"bitset\", bitsetA );\n    }\n\n    std::bitset<8> bitsetB;\n    {\n        test_istream is( testfile, TEST_STREAM_FLAGS );\n        test_iarchive ia( is );\n        ia >> boost::serialization::make_nvp( \"bitset\", bitsetB );\n    }\n\n    BOOST_CHECK( bitsetA == bitsetB );\n\n    std::remove( testfile );\n    return EXIT_SUCCESS;\n}\n\n// EOF\n"
  },
  {
    "path": "test/test_boost_array.cpp",
    "content": "/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// test_array.cpp\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n// should pass compilation and execution\n\n#include <stdlib.h>\n\n#include <boost/config.hpp>\n#include <cstddef>\n#include <fstream>\n#include <algorithm> // equal\n#include <cstdio> // remove\n#if defined(BOOST_NO_STDC_NAMESPACE)\nnamespace std{\n    using ::remove;\n}\n#endif\n#include \"test_tools.hpp\"\n#include <boost/core/no_exceptions_support.hpp>\n#include <boost/archive/archive_exception.hpp>\n#include <boost/serialization/boost_array.hpp>\n\n#include \"A.hpp\"\n#include \"A.ipp\"\n\ntemplate <class T>\nint test_boost_array(){\n    const char * testfile = boost::archive::tmpnam(NULL);\n    BOOST_REQUIRE(NULL != testfile);\n\n    // test array of objects\n    const boost::array<T,10> a_array = {{T(),T(),T(),T(),T(),T(),T(),T(),T(),T()}};\n    {\n        test_ostream os(testfile, TEST_STREAM_FLAGS);\n        test_oarchive oa(os, TEST_ARCHIVE_FLAGS);\n        oa << boost::serialization::make_nvp(\"a_array\", a_array);\n    }\n    {\n        boost::array<T,10> a_array1;\n        test_istream is(testfile, TEST_STREAM_FLAGS);\n        {\n            test_iarchive ia(is, TEST_ARCHIVE_FLAGS);\n            ia >> boost::serialization::make_nvp(\"a_array\", a_array1);\n        }\n        is.close();\n        BOOST_CHECK(std::equal(a_array.begin(), a_array.end(), a_array1.begin()));\n    }\n    {\n        boost::array<T, 9> a_array1;\n        test_istream is(testfile, TEST_STREAM_FLAGS);\n        {\n            test_iarchive ia(is, TEST_ARCHIVE_FLAGS);\n            bool exception_invoked = false;\n            BOOST_TRY {\n                ia >> boost::serialization::make_nvp(\"a_array\", a_array1);\n            }\n            BOOST_CATCH (boost::archive::archive_exception const& ae){\n                BOOST_CHECK(\n                    boost::archive::archive_exception::array_size_too_short\n                    == ae.code\n                );\n                exception_invoked = true;\n            }\n            BOOST_CATCH_END\n            BOOST_CHECK(exception_invoked);\n        }\n        is.close();\n    }\n    std::remove(testfile);\n    return EXIT_SUCCESS;\n}\n\nint test_main( int /* argc */, char* /* argv */[] ){\n    int res;\n\n    // boost array\n    res = test_boost_array<A>();\n    if (res != EXIT_SUCCESS)\n        return EXIT_FAILURE;\n    // test an int array for which optimized versions should be available\n    res = test_boost_array<int>();\n    if (res != EXIT_SUCCESS)\n        return EXIT_FAILURE;\n\n    return EXIT_SUCCESS;\n}\n\n// EOF\n"
  },
  {
    "path": "test/test_check.cpp",
    "content": "//  (C) Copyright 2009 Robert Ramey\n//  Use, modification and distribution are subject to the\n//  Boost Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for most recent version including documentation.\n\n// note: this is a compile only test.\n#include <sstream>\n#include <boost/config.hpp> // BOOST_STATIC_CONST\n\n#include <boost/serialization/static_warning.hpp>\n#include <boost/serialization/tracking.hpp>\n#include <boost/serialization/level.hpp>\n#include <boost/serialization/version.hpp>\n#include <boost/serialization/nvp.hpp>\n\n#include <boost/archive/text_iarchive.hpp>\n#include <boost/archive/text_oarchive.hpp>\n\n// track_selectivly with class information in the archive\n// is unsafe when used with a pointer and should trigger a warning\nstruct check1 {\n    template<class Archive>\n    void serialize(Archive & ar, const unsigned int version);\n    check1(){}\n};\n\nBOOST_CLASS_IMPLEMENTATION(check1, boost::serialization::object_serializable)\nBOOST_CLASS_TRACKING(check1, boost::serialization::track_selectively)\n\n// the combination of versioning + no class information\n// should trigger a warning\nstruct check2 {\n    template<class Archive>\n    void serialize(Archive & ar, const unsigned int version);\n    check2(){}\n};\n\nBOOST_CLASS_IMPLEMENTATION(check2, boost::serialization::object_serializable)\nBOOST_CLASS_VERSION(check2, 1)\n// use track always to turn off warning tested above\nBOOST_CLASS_TRACKING(check2, boost::serialization::track_always)\n\n// serializing a type marked as \"track_never\" through a pointer\n// is likely an error\nstruct check3 {\n    template<class Archive>\n    void serialize(Archive & ar, const unsigned int version);\n    check3(){}\n};\n\nBOOST_CLASS_TRACKING(check3, boost::serialization::track_never)\n\ntemplate<class T>\nint f(){\n    BOOST_STATIC_WARNING(T::value);\n    BOOST_STATIC_ASSERT(T::value);\n    return 0;\n}\n\n/////////////////////////////////////////////////////////////////////////\n// compilation of this program should show a total of 10 warning messages\nint main(int /* argc */, char * /* argv */[]){\n    std::stringstream s;\n    {\n        boost::archive::text_oarchive oa(s);\n\n        check1 const c1_out;\n        oa << c1_out;\n\n        check1 c1_non_const_out;\n        oa << c1_non_const_out; // warn check_object_tracking\n\n        check1 * const c1_ptr_out = 0;\n        oa << c1_ptr_out; // warn check_pointer_level\n\n        check2 const * c2_ptr_out;\n        oa << c2_ptr_out; // error check_object_versioning\n\n        check3 * const c3_ptr_out = 0;\n        oa << c3_ptr_out; // warning check_pointer_tracking\n\n        check2 const c2_out;\n        oa << c2_out; // error check_object_versioning\n    }\n    {\n        boost::archive::text_iarchive ia(s);\n\n        check1 const c1_in;\n        ia >> c1_in; // check_const_loading\n\n        check1 * c1_ptr_in = 0;\n        ia >> c1_ptr_in; // warn check_pointer_level\n\n        check2 * c2_ptr_in;\n        ia >> c2_ptr_in; // error check_object_versioning\n\n        check3 * c3_ptr_in = 0;\n        ia >> c3_ptr_in; // warning check_pointer_tracking\n\n        check2 c2_in;\n        ia >> c2_in; // error check_object_versioning\n    }\n    {\n        boost::archive::text_oarchive oa(s);\n\n        check1 const c1_out;\n        oa << BOOST_SERIALIZATION_NVP(c1_out);\n\n        check1 c1_non_const_out;\n        oa << BOOST_SERIALIZATION_NVP(c1_non_const_out); // warn check_object_tracking\n\n        check1 * const c1_ptr_out = 0;\n        oa << BOOST_SERIALIZATION_NVP(c1_ptr_out); // warn check_pointer_level\n\n        check2 const * c2_ptr_out;\n        oa << BOOST_SERIALIZATION_NVP(c2_ptr_out); // error check_object_versioning\n\n        check3 * const c3_ptr_out = 0;\n        oa << BOOST_SERIALIZATION_NVP(c3_ptr_out); // warning check_pointer_tracking\n\n        check2 const c2_out;\n        oa << BOOST_SERIALIZATION_NVP(c2_out); // error check_object_versioning\n    }\n    {\n        boost::archive::text_iarchive ia(s);\n\n        check1 const c1_in;\n        ia >> BOOST_SERIALIZATION_NVP(c1_in); // check_const_loading\n\n        check1 * c1_ptr_in = 0;\n        ia >> BOOST_SERIALIZATION_NVP(c1_ptr_in); // warn check_pointer_level\n\n        check2 * c2_ptr_in;\n        ia >> BOOST_SERIALIZATION_NVP(c2_ptr_in); // error check_object_versioning\n\n        check3 * c3_ptr_in = 0;\n        ia >> BOOST_SERIALIZATION_NVP(c3_ptr_in); // warning check_pointer_tracking\n\n        check2 c2_in;\n        ia >> BOOST_SERIALIZATION_NVP(c2_in); // error check_object_versioning\n    }\n    return 0;\n}\n"
  },
  {
    "path": "test/test_class_info_load.cpp",
    "content": "/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// test_class_info_load.cpp: test implementation level trait\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n// test implementation level \"object_class_info\"\n// should pass compilation and execution\n\n#include <string>\n#include <fstream>\n\n#include <boost/archive/tmpdir.hpp>\n#include <boost/preprocessor/stringize.hpp>\n#include \"test_tools.hpp\"\n\n#include <boost/static_assert.hpp>\n#include <boost/serialization/level.hpp>\n#include <boost/serialization/tracking.hpp>\n#include <boost/serialization/nvp.hpp>\n\nclass A\n{\n    friend class boost::serialization::access;\n    template<class Archive>\n    void serialize(Archive & /*ar*/, const unsigned int file_version){\n        // class that don't save class info always have a version number of 0\n        BOOST_CHECK(file_version == 0);\n        BOOST_STATIC_ASSERT(0 == ::boost::serialization::version<A>::value);\n        ++count;\n    }\npublic:\n    unsigned int count;\n    A() : count(0) {}\n};\n\nBOOST_CLASS_IMPLEMENTATION(A, ::boost::serialization::object_serializable)\nBOOST_CLASS_TRACKING(A, ::boost::serialization::track_never)\n\n// second case : serialize WITH class information\nclass B\n{\n    friend class boost::serialization::access;\n    template<class Archive>\n    void serialize(Archive & /*ar*/, const unsigned int file_version){\n        // verify at execution that the version number corresponds to the saved\n        // one\n        BOOST_CHECK(file_version == 2);\n        ++count;\n    }\npublic:\n    unsigned int count;\n    B() : count(0) {}\n};\n\nBOOST_CLASS_IMPLEMENTATION(B, ::boost::serialization::object_class_info)\nBOOST_CLASS_TRACKING(B, ::boost::serialization::track_never)\nBOOST_CLASS_VERSION(B, 4)\n\nvoid in(const char *testfile, A & a, B & b)\n{\n    test_istream is(testfile, TEST_STREAM_FLAGS);\n    test_iarchive ia(is, TEST_ARCHIVE_FLAGS);\n    ia >> BOOST_SERIALIZATION_NVP(a);\n    ia >> BOOST_SERIALIZATION_NVP(a);\n    BOOST_CHECK(a.count == 2);  // no tracking => redundant loads\n    ia >> BOOST_SERIALIZATION_NVP(b);\n    ia >> BOOST_SERIALIZATION_NVP(b);\n    // note: archive was saved with tracking so that is what determines\n    // whether tracking is perform on load - regardless of the latest\n    // tracking setting.\n    BOOST_CHECK(b.count == 1);\n}\n\nint\ntest_main( int /* argc */, char* /* argv */[] )\n{\n    A a;\n    B b;\n    std::string filename;\n    filename += boost::archive::tmpdir();\n    filename += '/';\n    filename += BOOST_PP_STRINGIZE(testfile_);\n    filename += BOOST_PP_STRINGIZE(BOOST_ARCHIVE_TEST);\n    in(filename.c_str(), a, b);\n    return EXIT_SUCCESS;\n}\n\n// EOF\n"
  },
  {
    "path": "test/test_class_info_save.cpp",
    "content": "/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// test_class_info_save.cpp: test implementation level trait\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n// test implementation level \"object_class_info\"\n// should pass compilation and execution\n\n#include <fstream>\n#include <string>\n\n#include <boost/static_assert.hpp>\n#include <boost/archive/tmpdir.hpp>\n#include <boost/preprocessor/stringize.hpp>\n#include \"test_tools.hpp\"\n\n#include <boost/serialization/level.hpp>\n#include <boost/serialization/tracking.hpp>\n#include <boost/serialization/nvp.hpp>\n\n// first case : serialize WITHOUT class information\nclass A\n{\n    friend class boost::serialization::access;\n    template<class Archive>\n    void serialize(Archive & /*ar*/, const unsigned int file_version){\n        // class that don't save class info always have a version number of 0\n        BOOST_CHECK(file_version == 0);\n        BOOST_STATIC_ASSERT(0 == ::boost::serialization::version<A>::value);\n        ++count;\n    }\npublic:\n    unsigned int count;\n    A() : count(0) {}\n};\n\nBOOST_CLASS_IMPLEMENTATION(A, ::boost::serialization::object_serializable)\nBOOST_CLASS_TRACKING(A, ::boost::serialization::track_never)\n\n// second case : serialize WITH class information\n// note: GCC compile fails if this is after the class declaration\nclass B;\nBOOST_CLASS_VERSION(B, 2)\n\nclass B\n{\n    friend class boost::serialization::access;\n    template<class Archive>\n    void serialize(Archive & /*ar*/, const unsigned int file_version){\n        // verify at execution that correct version number is passed on save\n        BOOST_CHECK(\n            static_cast<const int>(file_version)\n            == ::boost::serialization::version<B>::value\n        );\n        ++count;\n    }\npublic:\n    unsigned int count;\n    B() : count(0) {}\n};\n\nBOOST_CLASS_IMPLEMENTATION(B, ::boost::serialization::object_class_info)\nBOOST_CLASS_TRACKING(B, boost::serialization::track_always)\n\n#include <iostream>\n\nvoid out(const char *testfile, const A & a, const B & b)\n{\n    test_ostream os(testfile, TEST_STREAM_FLAGS);\n    test_oarchive oa(os, TEST_ARCHIVE_FLAGS);\n    // write object twice to check tracking\n    oa << BOOST_SERIALIZATION_NVP(a);\n    oa << BOOST_SERIALIZATION_NVP(a);\n    BOOST_CHECK(a.count == 2);  // no tracking => redundant saves\n    std::cout << \"a.count=\" << a.count << '\\n' ;\n    oa << BOOST_SERIALIZATION_NVP(b);\n    oa << BOOST_SERIALIZATION_NVP(b);\n    BOOST_CHECK(b.count == 1);  // tracking => no redundant saves\n    std::cout << \"b.count=\" << b.count << '\\n' ;\n}\n\nint\ntest_main( int /* argc */, char* /* argv */[] )\n{\n    A a;\n    B b;\n    std::string filename;\n    filename += boost::archive::tmpdir();\n    filename += '/';\n    filename += BOOST_PP_STRINGIZE(testfile_);\n    filename += BOOST_PP_STRINGIZE(BOOST_ARCHIVE_TEST);\n    out(filename.c_str(), a, b);\n    return EXIT_SUCCESS;\n}\n\n// EOF\n"
  },
  {
    "path": "test/test_codecvt_null.cpp",
    "content": "/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// test_codecvt_null.cpp\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n// should pass compilation and execution.  Note: compilation with compilers\n// which use wchar_t as 2 byte objects will emit warnings.  These should be\n// ignored.\n\n#include <algorithm> // std::copy\n#include <fstream>\n#include <iostream>\n#include <iterator>\n#include <locale>\n#include <vector>\n#include <cstdio> // remove\n#include <cstddef> // NULL, size_t\n\n#include <boost/config.hpp>\n#if defined(BOOST_NO_STDC_NAMESPACE)\nnamespace std{\n    using ::remove;\n}\n#endif\n\n#include \"test_tools.hpp\"\n\n#include <boost/archive/codecvt_null.hpp>\n#include <boost/archive/iterators/ostream_iterator.hpp>\n#include <boost/archive/iterators/istream_iterator.hpp>\n\ntemplate<std::size_t S>\nstruct test_data\n{\n    static wchar_t wchar_encoding[];\n};\n\ntemplate<>\nwchar_t test_data<2>::wchar_encoding[] = {\n    (wchar_t) 0x0001,\n    (wchar_t) 0x007f,\n    (wchar_t) 0x0080,\n    (wchar_t) 0x07ff,\n    (wchar_t) 0x0800,\n    (wchar_t) 0x7fff\n};\n\ntemplate<>\nwchar_t test_data<4>::wchar_encoding[] = {\n    (wchar_t) 0x00000001,\n    (wchar_t) 0x0000007f,\n    (wchar_t) 0x00000080,\n    (wchar_t) 0x000007ff,\n    (wchar_t) 0x00000800,\n    (wchar_t) 0x0000ffff,\n    (wchar_t) 0x00010000,\n    (wchar_t) 0x0010ffff,\n    (wchar_t) 0x001fffff,\n    (wchar_t) 0x00200000,\n    (wchar_t) 0x03ffffff,\n    (wchar_t) 0x04000000,\n    (wchar_t) 0x7fffffff\n};\n\n#include <iostream>\n\nint test_main( int /* argc */, char* /* argv */[] ) {\n    const char * testfile = boost::archive::tmpnam(NULL);\n    BOOST_REQUIRE(NULL != testfile);\n\n    std::locale old_loc;\n    std::locale null_locale = std::locale(\n        old_loc,\n        new boost::archive::codecvt_null<wchar_t>\n    );\n\n    typedef test_data<sizeof(wchar_t)> td;\n    {\n        std::wofstream ofs;\n        ofs.imbue(null_locale);\n        ofs.open(testfile, std::ios::binary);\n        std::copy(\n            td::wchar_encoding,\n            td::wchar_encoding + sizeof(td::wchar_encoding)/sizeof(wchar_t),\n            boost::archive::iterators::ostream_iterator<wchar_t>(ofs)\n        );\n    }\n    bool ok = false;\n    {\n        std::wifstream ifs;\n        ifs.imbue(null_locale);\n        ifs.open(testfile, std::ios::binary);\n        ok = std::equal(\n            td::wchar_encoding,\n            td::wchar_encoding + sizeof(td::wchar_encoding)/sizeof(wchar_t),\n            boost::archive::iterators::istream_iterator<wchar_t>(ifs)\n        );\n    }\n\n    BOOST_CHECK(ok);\n    {\n        std::wofstream ofs(\"testfile2\");\n        ofs.imbue(null_locale);\n        int i = 10;\n        ofs << i << '\\n';\n        ofs.close();\n\n        std::wifstream ifs(\"testfile2\");\n        ifs.imbue(null_locale);\n        int i2;\n        ifs >> i2;\n        std::cout << \"i=\" << i << std::endl;\n        std::cout << \"i2=\" << i2 << std::endl;\n        BOOST_CHECK(i == i2);\n        ifs.close();\n    }\n\n    std::remove(testfile);\n    return EXIT_SUCCESS;\n}\n\n"
  },
  {
    "path": "test/test_complex.cpp",
    "content": "/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// test_complex.cpp\n\n// (C) Copyright 2005 Matthias Troyer .\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n// should pass compilation and execution\n\n#include <fstream>\n\n#include <cstddef> // NULL\n#include <cstdlib> // rand\n#include <cstdio> // remove\n#include <boost/config.hpp>\n#include <boost/detail/workaround.hpp>\n#if BOOST_CXX_VERSION > 199711L // only include floating point if C++ version >= C++11\n#include <boost/math/special_functions/next.hpp>\n#endif\n\n#if defined(BOOST_NO_STDC_NAMESPACE)\n#include <boost/limits.hpp>\nnamespace std{\n    using ::rand;\n    using ::remove;\n    #if BOOST_WORKAROUND(BOOST_MSVC, >= 1400) && !defined(UNDER_CE)\n        using ::numeric_limits;\n    #endif\n}\n#endif\n\n#include \"test_tools.hpp\"\n\n#include <boost/preprocessor/stringize.hpp>\n#include BOOST_PP_STRINGIZE(BOOST_ARCHIVE_TEST)\n\n#include <boost/serialization/complex.hpp>\n\n#include <iostream>\n\nint test_main( int /* argc */, char* /* argv */[] )\n{\n    const char * testfile = boost::archive::tmpnam(NULL);\n    BOOST_REQUIRE(NULL != testfile);\n\n    // test array of objects\n    std::complex<float> a(\n        static_cast<float>(std::rand()) / static_cast<float>(std::rand()),\n        static_cast<float>(std::rand()) / static_cast<float>(std::rand())\n    );\n    std::complex<double> b(\n        static_cast<double>(std::rand()) / static_cast<double>(std::rand()),\n        static_cast<double>(std::rand()) / static_cast<double>(std::rand())\n    );\n    {\n        test_ostream os(testfile, TEST_STREAM_FLAGS);\n        test_oarchive oa(os);\n        oa << boost::serialization::make_nvp(\"afloatcomplex\", a);\n        oa << boost::serialization::make_nvp(\"adoublecomplex\", b);\n    }\n    std::complex<float> a1;\n    std::complex<double> b1;\n    {\n        test_istream is(testfile, TEST_STREAM_FLAGS);\n        test_iarchive ia(is);\n        ia >> boost::serialization::make_nvp(\"afloatcomplex\", a1);\n        ia >> boost::serialization::make_nvp(\"adoublecomplex\", b1);\n    }\n\n    #if BOOST_CXX_VERSION > 199711L // only include floating point if C++ version >= C++11\n        std::cerr << \"a.real()-a1a.real() distance = \" << std::abs( boost::math::float_distance(a.real(), a1.real())) << std::endl;\n        BOOST_CHECK(std::abs(boost::math::float_distance(a.real(), a1.real())) < 2);\n        std::cerr << \"a.imag() - a1a.imag() distance = \" << std::abs( boost::math::float_distance(a.imag(), a1.imag())) << std::endl;\n        BOOST_CHECK(std::abs(boost::math::float_distance(a.imag(), a1.imag())) < 2);\n        std::cerr << \"b.real() - b1.real() distance = \" << std::abs( boost::math::float_distance(b.real(), b1.real())) << std::endl;\n        BOOST_CHECK(std::abs(boost::math::float_distance(b.real(), b1.real())) < 2);\n        std::cerr << \"b.imag() - b1.imag() distance = \" << std::abs( boost::math::float_distance(b.imag(), b1.imag())) << std::endl;\n        BOOST_CHECK(std::abs(boost::math::float_distance(b.imag(), b1.imag())) < 2);\n    #endif\n\n    std::remove(testfile);\n    return EXIT_SUCCESS;\n}\n\n// EOF\n"
  },
  {
    "path": "test/test_const_load_fail1.cpp",
    "content": "/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// test_const.cpp\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n// compile only\n\n#include <boost/archive/text_iarchive.hpp>\n\nusing namespace boost::archive;\n\nstruct A {\n    template<class Archive>\n    void serialize(Archive & ar, unsigned int version) {\n    }\n};\n\nvoid f1(text_iarchive & ia, const A & a){\n    ia >> a;\n}\n"
  },
  {
    "path": "test/test_const_load_fail1_nvp.cpp",
    "content": "/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// test_const.cpp\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n// compile only\n\n#include <boost/archive/text_iarchive.hpp>\n#include <boost/serialization/nvp.hpp>\n\nusing namespace boost::archive;\n\nstruct A {\n    template<class Archive>\n    void serialize(Archive & ar, unsigned int version) {\n    }\n};\n\nvoid f1(text_iarchive & ia, const A & a){\n    ia >> BOOST_SERIALIZATION_NVP(a);\n}\n"
  },
  {
    "path": "test/test_const_load_fail2.cpp",
    "content": "/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// test_const.cpp\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n// compile only\n\n#include <boost/archive/text_iarchive.hpp>\n\nusing namespace boost::archive;\n\nstruct A {\n    template<class Archive>\n    void serialize(Archive & ar, unsigned int version) {\n    }\n};\n\nvoid f2(text_iarchive & ia, A * const & a){\n    ia >> a;\n}\n"
  },
  {
    "path": "test/test_const_load_fail2_nvp.cpp",
    "content": "/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// test_const.cpp\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n// compile only\n\n#include <boost/archive/text_iarchive.hpp>\n#include <boost/serialization/nvp.hpp>\n\nusing namespace boost::archive;\n\nstruct A {\n    template<class Archive>\n    void serialize(Archive & ar, unsigned int version) {\n    }\n};\n\nvoid f2(text_iarchive & ia, A * const & a){\n    ia >> BOOST_SERIALIZATION_NVP(a);\n}\n\n"
  },
  {
    "path": "test/test_const_load_fail3.cpp",
    "content": "/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// test_const.cpp\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n// compile only\n\n#include <boost/archive/text_iarchive.hpp>\nusing namespace boost::archive;\n\nstruct A {\n    template<class Archive>\n    void serialize(Archive & ar, unsigned int version) {\n    }\n};\n\nvoid f2(text_iarchive & ia, const A * const & a){\n    ia >> a;\n}\n"
  },
  {
    "path": "test/test_const_load_fail3_nvp.cpp",
    "content": "/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// test_const.cpp\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n// compile only\n\n#include <boost/archive/text_iarchive.hpp>\n#include <boost/serialization/nvp.hpp>\n\nusing namespace boost::archive;\n\nstruct A {\n    template<class Archive>\n    void serialize(Archive & ar, unsigned int version) {\n    }\n};\n\nvoid f2(text_iarchive & ia, const A * const & a){\n    ia >> BOOST_SERIALIZATION_NVP(a);\n}\n"
  },
  {
    "path": "test/test_const_pass.cpp",
    "content": "/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// test_const.cpp\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n// compile only\n\n#include <boost/archive/text_oarchive.hpp>\n#include <boost/archive/text_iarchive.hpp>\n#include <boost/serialization/nvp.hpp>\n\nstruct A {\n    template<class Archive>\n    void serialize(Archive & ar, unsigned int version) {\n    }\n};\n\n// should compile w/o problem\nvoid f1(boost::archive::text_oarchive & oa, const A & a){\n    oa & a;\n    oa & BOOST_SERIALIZATION_NVP(a);\n    oa << a;\n    oa << BOOST_SERIALIZATION_NVP(a);\n}\nvoid f2(boost::archive::text_oarchive & oa, const A * const & a){\n    oa & a;\n    oa & BOOST_SERIALIZATION_NVP(a);\n    oa << a;\n    oa << BOOST_SERIALIZATION_NVP(a);\n}\nvoid f3(boost::archive::text_iarchive & ia, A & a){\n    ia & a;\n    ia & BOOST_SERIALIZATION_NVP(a);\n    ia >> a;\n    ia >> BOOST_SERIALIZATION_NVP(a);\n}\nvoid f4(boost::archive::text_iarchive & ia, A * & a){\n    ia & a;\n    ia & BOOST_SERIALIZATION_NVP(a);\n    ia >> a;\n    ia >> BOOST_SERIALIZATION_NVP(a);\n}\n#if 0\nvoid f5(boost::archive::text_oarchive & oa, const A * & a){\n    oa & a;\n    oa & BOOST_SERIALIZATION_NVP(a);\n    oa << a;\n    oa << BOOST_SERIALIZATION_NVP(a);\n}\n#endif\n\n"
  },
  {
    "path": "test/test_const_save_warn1.cpp",
    "content": "/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// test_const.cpp\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n// compile only\n\n#include <boost/archive/text_oarchive.hpp>\n\nusing namespace boost::archive;\n\nstruct A {\n    template<class Archive>\n    void serialize(Archive & ar, unsigned int version) {\n    }\n};\n\n// should fail to compile\nvoid f1(text_oarchive & oa, A  & a){\n    oa << a;\n}\n\n"
  },
  {
    "path": "test/test_const_save_warn1_nvp.cpp",
    "content": "/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// test_const.cpp\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n// compile only\n\n#include <boost/archive/text_oarchive.hpp>\n#include <boost/serialization/nvp.hpp>\n#include <boost/serialization/tracking.hpp>\n\nusing namespace boost::archive;\n\nstruct A {\n    template<class Archive>\n    void serialize(Archive & ar, unsigned int version) {\n    }\n};\n\nvoid f1(text_oarchive & oa, A & a){\n    oa << BOOST_SERIALIZATION_NVP(a);\n}\n\n"
  },
  {
    "path": "test/test_const_save_warn2.cpp",
    "content": "/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// test_const.cpp\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n// compile only\n\n#include <boost/archive/text_oarchive.hpp>\n\nusing namespace boost::archive;\n\nstruct A {\n    template<class Archive>\n    void serialize(Archive & ar, unsigned int version) {\n    }\n};\n\nvoid f2(text_oarchive & oa, A * & a){\n    oa << a;\n}\n\n"
  },
  {
    "path": "test/test_const_save_warn2_nvp.cpp",
    "content": "/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// test_const.cpp\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n// compile only\n\n#include <boost/archive/text_oarchive.hpp>\n#include <boost/serialization/nvp.hpp>\n\nusing namespace boost::archive;\n\nstruct A {\n    template<class Archive>\n    void serialize(Archive & ar, unsigned int version) {\n    }\n};\n\nvoid f2(text_oarchive & oa, A * & a){\n    oa << BOOST_SERIALIZATION_NVP(a);\n}\n\n"
  },
  {
    "path": "test/test_const_save_warn3.cpp",
    "content": "/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// test_const.cpp\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n// compile only\n\n#include <boost/archive/text_oarchive.hpp>\n\nusing namespace boost::archive;\n\nstruct A {\n    template<class Archive>\n    void serialize(Archive & ar, unsigned int version) {\n    }\n};\n\nvoid f3(text_oarchive & oa, const A * & a){\n    oa << a;\n}\n\n"
  },
  {
    "path": "test/test_const_save_warn3_nvp.cpp",
    "content": "/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// test_const.cpp\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n// compile only\n\n#include <boost/archive/text_oarchive.hpp>\n#include <boost/serialization/nvp.hpp>\n\nusing namespace boost::archive;\n\nstruct A {\n    template<class Archive>\n    void serialize(Archive & ar, unsigned int version) {\n    }\n};\n\nvoid f3(text_oarchive & oa, const A * & a){\n    oa << BOOST_SERIALIZATION_NVP(a);\n}\n\n"
  },
  {
    "path": "test/test_const_save_warn4.cpp",
    "content": "/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// test_const.cpp\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n// compile only\n\n#include <boost/archive/text_oarchive.hpp>\n#include <boost/serialization/nvp.hpp>\n\nusing namespace boost::archive;\n\nstruct A {\n    template<class Archive>\n    void serialize(Archive & ar, unsigned int version) {\n    }\n};\n\n// comment out this test case as a reminder not to keep inserting it !!!\n// we don't trap this as an error in order to permit things like\n// X * xptr;\n// save(..){\n//     ar << xptr;\n// }\n//\n// for rational - consider the following example from demo.cpp\n// std::list<pair<trip_info, bus_route_info *> > schedule\n// its not obvious to me how this can be cast to:\n// std::list<pair<trip_info, const bus_route_info * const> > schedule\n\nvoid f4(text_oarchive & oa, A * const & a){\n    oa << a;\n}\n\n"
  },
  {
    "path": "test/test_const_save_warn4_nvp.cpp",
    "content": "/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// test_const.cpp\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n// compile only\n\n#include <boost/archive/text_oarchive.hpp>\n#include <boost/serialization/nvp.hpp>\n\nusing namespace boost::archive;\n\nstruct A {\n    template<class Archive>\n    void serialize(Archive & ar, unsigned int version) {\n    }\n};\n\n// comment out this test case as a reminder not to keep inserting it !!!\n// we don't trap this as an error in order to permit things like\n// X * xptr;\n// save(..){\n//     ar << xptr;\n// }\n//\n// for rational - consider the following example from demo.cpp\n//\n// std::list<pair<trip_info, bus_route_info *> > schedule\n//\n// its not obvious to me how this can be cast to:\n//\n// std::list<pair<trip_info, const bus_route_info * const> > schedule\n\nvoid f4(text_oarchive & oa, A * const & a){\n    oa << BOOST_SERIALIZATION_NVP(a);\n}\n"
  },
  {
    "path": "test/test_contained_class.cpp",
    "content": "/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// test_contained_class.cpp\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n// should pass compilation and execution\n\n#include <cstddef>\n#include <fstream>\n\n#include <cstdio> // remove\n#include <boost/config.hpp>\n#if defined(BOOST_NO_STDC_NAMESPACE)\nnamespace std{\n    using ::remove;\n}\n#endif\n\n#include \"test_tools.hpp\"\n#include <boost/serialization/nvp.hpp>\n\n#include \"B.hpp\"\n#include \"A.ipp\"\n\n///////////////////////////////////////////////////////\n// Contained class\nclass C\n{\nprivate:\n    friend class boost::serialization::access;\n    template<class Archive>\n    void serialize(Archive & ar, const unsigned int /* file_version */){\n        ar & BOOST_SERIALIZATION_NVP(b);\n    }\n    B b;\npublic:\n    bool operator==(const C &rhs) const\n    {\n        return b == rhs.b;\n    }\n    C(){}\n};\n\nint test_main( int /* argc */, char* /* argv */[] )\n{\n    const char * testfile = boost::archive::tmpnam(NULL);\n    BOOST_REQUIRE(NULL != testfile);\n\n    const C c;\n    C c1;\n    {\n        test_ostream os(testfile, TEST_STREAM_FLAGS);\n        test_oarchive oa(os, TEST_ARCHIVE_FLAGS);\n        oa << boost::serialization::make_nvp(\"c\", c);\n    }\n    {\n        test_istream is(testfile, TEST_STREAM_FLAGS);\n        test_iarchive ia(is, TEST_ARCHIVE_FLAGS);\n        ia >> boost::serialization::make_nvp(\"c\", c1);\n    }\n    BOOST_CHECK(c == c1);\n    std::remove(testfile);\n    return EXIT_SUCCESS;\n}\n\n// EOF\n"
  },
  {
    "path": "test/test_cyclic_ptrs.cpp",
    "content": "/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// test_cyclic_ptrs.cpp\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n// should pass compilation and execution\n\n#include <cstddef> // NULL\n#include <fstream>\n\n#include <cstdio> // remove\n#include <boost/config.hpp>\n#if defined(BOOST_NO_STDC_NAMESPACE)\nnamespace std{\n    using ::remove;\n}\n#endif\n\n#include \"test_tools.hpp\"\n#include <boost/core/no_exceptions_support.hpp>\n\n#include <boost/serialization/nvp.hpp>\n#include <boost/serialization/base_object.hpp>\n\n#include \"A.hpp\"\n#include \"A.ipp\"\n\n///////////////////////////////////////////////////////\n// class with a member which refers to itself\nclass J : public A\n{\nprivate:\n    friend class boost::serialization::access;\n    template<class Archive>\n    void serialize(Archive &ar, const unsigned int /* file_version */){\n        ar & BOOST_SERIALIZATION_BASE_OBJECT_NVP(A);\n        ar & BOOST_SERIALIZATION_NVP(j);\n    }\npublic:\n    bool operator==(const J &rhs) const;\n    J *j;\n    J(J *_j) : j(_j) {}\n    J() : j(NULL){}\n};\n\nBOOST_CLASS_VERSION(J, 6)\n\nbool J::operator==(const J &rhs) const\n{\n    return static_cast<const A &>(*this) == static_cast<const A &>(rhs);\n}\n\n///////////////////////////////////////////////////////\n// class with members that refer to each other\n// this is an example of a class that, as written, cannot\n// be serialized with this system.  The problem is that the\n// serialization of the first member - j1 , provokes serialization\n// of those objects which it points to either directly or indirectly.\n// When those objects are subsequently serialized, it is discovered\n// that have already been serialized through pointers.  This is\n// detected by the system and an exception - pointer_conflict -\n// is thrown.  Permitting this to go undetected would result in the\n// creation of multiple equal objects rather than the original\n// structure.\nclass K\n{\n    J j1;\n    J j2;\n    J j3;\n    friend class boost::serialization::access;\n    template<class Archive>\n    void serialize(\n        Archive &ar,\n        const unsigned int /* file_version */\n    ){\n        ar & BOOST_SERIALIZATION_NVP(j1);\n        ar & BOOST_SERIALIZATION_NVP(j2);\n        ar & BOOST_SERIALIZATION_NVP(j3);\n    }\npublic:\n    bool operator==(const K &rhs) const;\n    K();\n};\n\nK::K()\n: j1(&j2), j2(&j3), j3(&j1)\n{\n}\n\nbool K::operator==(const K &rhs) const\n{\n    return\n        j1.j == & j2\n        && j2.j == & j3\n        && j3.j == & j1\n        && j1 == rhs.j1\n        && j2 == rhs.j2\n        && j3 == rhs.j3\n    ;\n}\n\nint test1(){\n    const char * testfile = boost::archive::tmpnam(NULL);\n    BOOST_REQUIRE(NULL != testfile);\n\n    J j1, j2;\n    {\n        test_ostream os(testfile, TEST_STREAM_FLAGS);\n        test_oarchive oa(os, TEST_ARCHIVE_FLAGS);\n        oa << BOOST_SERIALIZATION_NVP(j1);\n    }\n    {\n        // try to read the archive\n        test_istream is(testfile, TEST_STREAM_FLAGS);\n        test_iarchive ia(is, TEST_ARCHIVE_FLAGS);\n        ia >> BOOST_SERIALIZATION_NVP(j2);\n    }\n    BOOST_CHECK(j1 == j2);\n    std::remove(testfile);\n    return EXIT_SUCCESS;\n}\n\nint test2(){\n    const char * testfile = boost::archive::tmpnam(NULL);\n    BOOST_REQUIRE(NULL != testfile);\n\n    J *j1 = new J;\n    j1->j = j1;\n    J *j2 = reinterpret_cast<J *>(0xBAADF00D);\n    {\n        test_ostream os(testfile, TEST_STREAM_FLAGS);\n        test_oarchive oa(os, TEST_ARCHIVE_FLAGS);\n        oa << BOOST_SERIALIZATION_NVP(j1);\n    }\n    {\n        // try to read the archive\n        test_istream is(testfile, TEST_STREAM_FLAGS);\n        test_iarchive ia(is, TEST_ARCHIVE_FLAGS);\n        ia >> BOOST_SERIALIZATION_NVP(j2);\n    }\n    BOOST_CHECK(*j1 == *j2);\n    delete j1;\n    BOOST_CHECK(j2 == j2->j);\n    std::remove(testfile);\n    return EXIT_SUCCESS;\n}\n\nint test3(){\n    const char * testfile = boost::archive::tmpnam(NULL);\n    BOOST_REQUIRE(NULL != testfile);\n\n    K k;\n    boost::archive::archive_exception exception(\n        boost::archive::archive_exception::no_exception\n    );\n    {\n        test_ostream os(testfile, TEST_STREAM_FLAGS);\n        test_oarchive oa(os, TEST_ARCHIVE_FLAGS);\n        BOOST_TRY {\n            oa << BOOST_SERIALIZATION_NVP(k);\n        }\n        BOOST_CATCH (boost::archive::archive_exception const& ae){\n            exception = ae;\n        }\n        BOOST_CATCH_END\n        BOOST_CHECK(\n            exception.code == boost::archive::archive_exception::pointer_conflict\n        );\n    }\n    // if exception wasn't invoked\n    if(exception.code == boost::archive::archive_exception::no_exception){\n        // try to read the archive\n        test_istream is(testfile, TEST_STREAM_FLAGS);\n        test_iarchive ia(is, TEST_ARCHIVE_FLAGS);\n        exception = boost::archive::archive_exception(\n            boost::archive::archive_exception::no_exception\n        );\n        BOOST_TRY {\n            ia >> BOOST_SERIALIZATION_NVP(k);\n        }\n        BOOST_CATCH (boost::archive::archive_exception const& ae){\n            exception = ae;\n        }\n        BOOST_CATCH_END\n        BOOST_CHECK(\n            exception.code == boost::archive::archive_exception::pointer_conflict\n        );\n    }\n    std::remove(testfile);\n    return EXIT_SUCCESS;\n}\n\nint test_main( int /* argc */, char* /* argv */[] ){\n    test1();\n    test2();\n    test3();\n    return EXIT_SUCCESS;\n}\n\n// EOF\n"
  },
  {
    "path": "test/test_delete_pointer.cpp",
    "content": "/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// test_delete_pointer.cpp\n\n// (C) Copyright 2002 Vahan Margaryan.\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n#include <cstddef> // NULL\n#include <fstream>\n\n#include <cstdio> // remove\n#include <boost/config.hpp>\n#if defined(BOOST_NO_STDC_NAMESPACE)\nnamespace std{\n    using ::remove;\n}\n#endif\n\n#include \"test_tools.hpp\"\n#include <boost/core/no_exceptions_support.hpp>\n#include <boost/serialization/throw_exception.hpp>\n\n#include <boost/serialization/nvp.hpp>\n#include <boost/serialization/split_member.hpp>\n\n//A holds a pointer to another A, but doesn't own the pointer.\n//objCount\nclass A\n{\n    friend class boost::serialization::access;\n    template<class Archive>\n    void save(Archive &ar, const unsigned int /* file_version */) const\n    {\n        ar << BOOST_SERIALIZATION_NVP(next_);\n    }\n    template<class Archive>\n    void load(Archive & ar, const unsigned int /* file_version */)\n    {\n        ar >> BOOST_SERIALIZATION_NVP(next_);\n        ++loadcount;\n    }\n    BOOST_SERIALIZATION_SPLIT_MEMBER()\npublic:\n    A()\n    {\n        if(test && objcount == 3)\n            boost::serialization::throw_exception(boost::archive::archive_exception(\n                boost::archive::archive_exception::no_exception\n            ));\n        next_ = 0;\n        ++objcount;\n    }\n    ~A(){\n        delete next_;\n        --objcount;\n    }\n    A* next_;\n    static int objcount;\n    static bool test;\n    static int loadcount;\n};\n\n\nint A::objcount = 0;\nint A::loadcount = 0;\nbool A::test = false;\n\nint\ntest_main( int /* argc */, char* /* argv */[] )\n{\n\n    //fill the vector with chained A's. The vector is assumed\n    //to own the objects - we will destroy the objects through this vector.\n\n    A * head = new A;\n    A* last = head;\n    unsigned int i;\n    for(i = 1; i < 9; ++i)\n    {\n        A *a = new A;\n        last->next_ = a;\n        last = a;\n    }\n\n    const char * testfile = boost::archive::tmpnam(0);\n    BOOST_REQUIRE(NULL != testfile);\n\n    //output the list\n    {\n        test_ostream os(testfile, TEST_STREAM_FLAGS);\n        test_oarchive oa(os, TEST_ARCHIVE_FLAGS);\n        oa << BOOST_SERIALIZATION_NVP(head);\n    }\n\n    delete head;\n    BOOST_CHECK(A::objcount == 0);\n\n    head = NULL;\n    A::test = true;\n    //read the list back\n    {\n        test_istream is(testfile, TEST_STREAM_FLAGS);\n        test_iarchive ia(is, TEST_ARCHIVE_FLAGS);\n        BOOST_TRY {\n            ia >> BOOST_SERIALIZATION_NVP(head);\n        }\n        BOOST_CATCH (...){\n            ia.delete_created_pointers();\n        }\n        BOOST_CATCH_END\n    }\n\n    //identify the leaks\n    BOOST_CHECK(A::loadcount == 0);\n    std::remove(testfile);\n    return EXIT_SUCCESS;\n}\n"
  },
  {
    "path": "test/test_deque.cpp",
    "content": "/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// test_deque.cpp\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n// should pass compilation and execution\n\n#include <cstddef>\n#include <fstream>\n\n#include <cstdio> // remove\n#include <boost/config.hpp>\n#if defined(BOOST_NO_STDC_NAMESPACE)\nnamespace std{\n    using ::remove;\n}\n#endif\n\n#include <boost/archive/archive_exception.hpp>\n#include \"test_tools.hpp\"\n\n#include <boost/serialization/deque.hpp>\n\n#include \"A.hpp\"\n#include \"A.ipp\"\n\nint test_main( int /* argc */, char* /* argv */[] )\n{\n    const char * testfile = boost::archive::tmpnam(NULL);\n    BOOST_REQUIRE(NULL != testfile);\n\n    // test array of objects\n    std::deque<A> adeque, adeque1;\n    adeque.push_front(A());\n    adeque.push_front(A());\n    {\n        test_ostream os(testfile, TEST_STREAM_FLAGS);\n        test_oarchive oa(os, TEST_ARCHIVE_FLAGS);\n        oa << boost::serialization::make_nvp(\"adeque\",adeque);\n    }\n    {\n        test_istream is(testfile, TEST_STREAM_FLAGS);\n        test_iarchive ia(is, TEST_ARCHIVE_FLAGS);\n        ia >> boost::serialization::make_nvp(\"adeque\",adeque1);\n    }\n    BOOST_CHECK(adeque == adeque1);\n\n    std::remove(testfile);\n    return EXIT_SUCCESS;\n}\n\n// EOF\n"
  },
  {
    "path": "test/test_derived.cpp",
    "content": "/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// test_derived.cpp\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n// should pass compilation and execution\n\n#include <cstddef> // NULL\n#include <fstream>\n\n#include <cstdio> // remove\n#include <boost/config.hpp>\n#if defined(BOOST_NO_STDC_NAMESPACE)\nnamespace std{\n    using ::remove;\n}\n#endif\n\n#include <boost/archive/archive_exception.hpp>\n#include \"test_tools.hpp\"\n\n#include <boost/serialization/base_object.hpp>\n#include <boost/serialization/type_info_implementation.hpp>\n\nclass base\n{\n    friend class boost::serialization::access;\n    template<class Archive>\n    void serialize(Archive & /* ar */, const unsigned int /* file_version */){\n    }\npublic:\n    virtual ~base(){};\n};\n\nclass derived1 : public base\n{\n    friend class boost::serialization::access;\n    template<class Archive>\n    void serialize(Archive &ar, const unsigned int /* file_version */){\n        ar & BOOST_SERIALIZATION_BASE_OBJECT_NVP(base);\n    }\n};\n\nclass derived2 : public base\n{\n    friend class boost::serialization::access;\n    template<class Archive>\n    void serialize(Archive &ar, const unsigned int /* file_version */){\n        ar & BOOST_SERIALIZATION_BASE_OBJECT_NVP(base);\n    }\n};\n\n// save non-polymorphic classes through a base class pointer\nvoid save_derived(const char *testfile)\n{\n    test_ostream os(testfile, TEST_STREAM_FLAGS);\n    test_oarchive oa(os, TEST_ARCHIVE_FLAGS);\n\n    // registration not necessary when serializing the most derived pointer\n    derived1 *d1 = new derived1;\n    derived2 *d2 = new derived2;\n    oa << BOOST_SERIALIZATION_NVP(d1) << BOOST_SERIALIZATION_NVP(d2);\n\n    // upcasting non-polymorphic pointers may not lead to the expected\n    // result. In the current type id system\n    base *b1 = d1;\n    base *b2 = d2;\n\n    // Warning, the current type id system does not yield true\n    // type id for non-polymorphic types\n    const boost::serialization::extended_type_info & this_type\n        = boost::serialization::type_info_implementation<base>::type\n            ::get_const_instance();\n    // retrieve the true type of the object pointed to\n    const boost::serialization::extended_type_info & true_type\n        = * boost::serialization::type_info_implementation<base>::type\n            ::get_const_instance().get_derived_extended_type_info(*b1);\n\n    BOOST_WARN_MESSAGE(\n        !(this_type == true_type),\n        \"current type id system does not support non-polymorphic types\"\n    );\n\n    oa << BOOST_SERIALIZATION_NVP(b1);\n    oa << BOOST_SERIALIZATION_NVP(b2);\n\n    delete d1;\n    delete d2;\n}\n\n// save non-polymorphic classes through a base class pointer\nvoid load_derived(const char *testfile)\n{\n    test_istream is(testfile, TEST_STREAM_FLAGS);\n    test_iarchive ia(is, TEST_ARCHIVE_FLAGS);\n\n    // registration not necessary when serializing the most derived pointer\n    derived1 *d1 = NULL;\n    derived2 *d2 = NULL;\n    ia >> BOOST_SERIALIZATION_NVP(d1) >> BOOST_SERIALIZATION_NVP(d2);\n\n    // upcasting non-polymorphic pointers may not lead to the expected\n    // result. In the current type id system\n    base *b1 = NULL;\n    base *b2 = NULL;\n\n    // note: this will produce incorrect results for non-polymorphic classes\n    ia >> BOOST_SERIALIZATION_NVP(b1);\n    ia >> BOOST_SERIALIZATION_NVP(b2);\n\n    // Warning, the current type id system does not yield true\n    // type id for non-polymorphic types\n    const boost::serialization::extended_type_info & this_type\n        = boost::serialization::type_info_implementation<base>::type\n            ::get_const_instance();\n    // retrieve the true type of the object pointed to\n    const boost::serialization::extended_type_info & true_type\n        = * boost::serialization::type_info_implementation<base>::type\n            ::get_const_instance().get_derived_extended_type_info(*b1);\n\n    BOOST_WARN_MESSAGE(\n        ! (this_type == true_type),\n        \"current type id system does fails for non-polymorphic types\"\n    );\n\n    BOOST_CHECK(b1 == static_cast<base *>(d1));\n    BOOST_CHECK(b2 == static_cast<base *>(d2));\n\n    delete d1;\n    delete d2;\n}\n\nint\ntest_main( int /* argc */, char* /* argv */[] )\n{\n    const char * testfile = boost::archive::tmpnam(NULL);\n    BOOST_REQUIRE(NULL != testfile);\n\n    save_derived(testfile);\n    load_derived(testfile);\n    std::remove(testfile);\n    return EXIT_SUCCESS;\n}\n\n// EOF\n"
  },
  {
    "path": "test/test_derived_class.cpp",
    "content": "/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// test_derived_class.cpp\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n// should pass compilation and execution\n\n#include <fstream>\n\n#include <cstdio> // remove\n#include <boost/config.hpp>\n#if defined(BOOST_NO_STDC_NAMESPACE)\nnamespace std{\n    using ::remove;\n}\n#endif\n\n#include \"test_tools.hpp\"\n\n#include \"B.hpp\"\n#include \"A.ipp\"\n\nint test_main( int /*argc*/, char* /*argv*/[] )\n{\n  const char * testfile = boost::archive::tmpnam(NULL);\n\n  BOOST_REQUIRE(NULL != testfile);\n\n    B b, b1;\n\n    {\n        test_ostream os(testfile, TEST_STREAM_FLAGS);\n        test_oarchive oa(os, TEST_ARCHIVE_FLAGS);\n        oa << boost::serialization::make_nvp(\"b\", b);\n    }\n    {\n        test_istream is(testfile, TEST_STREAM_FLAGS);\n        test_iarchive ia(is, TEST_ARCHIVE_FLAGS);\n        ia >> boost::serialization::make_nvp(\"b1\", b1);\n    }\n    BOOST_CHECK(b == b1);\n    std::remove(testfile);\n    return EXIT_SUCCESS;\n}\n\n// EOF\n"
  },
  {
    "path": "test/test_derived_class_ptr.cpp",
    "content": "/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// test_deriviec_class_.cpp\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n// should pass compilation and execution\n\n#include <cstddef> // NULL\n#include <fstream>\n\n#include <cstdio> // remove\n#include <boost/config.hpp>\n#if defined(BOOST_NO_STDC_NAMESPACE)\nnamespace std{\n    using ::remove;\n}\n#endif\n\n#include \"test_tools.hpp\"\n\n#include \"B.hpp\"\n#include \"A.ipp\"\n\nint test_main( int /* argc */, char* /* argv */[] )\n{\n    const char * testfile = boost::archive::tmpnam(NULL);\n    BOOST_REQUIRE(NULL != testfile);\n\n    B * tb = new B;\n    B * tb1 = NULL;\n\n    {\n        test_ostream os(testfile, TEST_STREAM_FLAGS);\n        test_oarchive oa(os, TEST_ARCHIVE_FLAGS);\n        oa << boost::serialization::make_nvp(\"tb\", tb);\n    }\n    {\n        test_istream is(testfile, TEST_STREAM_FLAGS);\n        test_iarchive ia(is, TEST_ARCHIVE_FLAGS);\n        ia >> boost::serialization::make_nvp(\"tb\",tb1);\n    }\n    BOOST_CHECK(tb != tb1);\n    BOOST_CHECK(*tb == *tb1);\n    delete tb;\n    std::remove(testfile);\n    return EXIT_SUCCESS;\n}\n\n// EOF\n"
  },
  {
    "path": "test/test_diamond.cpp",
    "content": "/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// test_diamond.cpp\n\n// (C) Copyright 2002-2009 Vladimir Prus and Robert Ramey.\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n// test of serialization library for diamond inheritance situations\n\n#include <cstddef> // NULL\n#include <fstream>\n#include <iostream>\n\n#include <boost/config.hpp>\n#include <cstdio> // remove\n#if defined(BOOST_NO_STDC_NAMESPACE)\nnamespace std{\n    using ::remove;\n}\n#endif\n\n#include \"test_tools.hpp\"\n\n#include <boost/serialization/map.hpp>\n#include <boost/serialization/utility.hpp>\n#include <boost/serialization/split_member.hpp>\n#include <boost/serialization/tracking.hpp>\n#include <boost/serialization/base_object.hpp>\n#include <boost/serialization/nvp.hpp>\n#include <boost/serialization/export.hpp>\n\nint save_count = 0; // used to detect when base class is saved multiple times\nint load_count = 0; // used to detect when base class is loaded multiple times\n\nclass base {\npublic:\n    base() : i(0) {}\n    base(int i) : i(i)\n    {\n        m[i] = \"text\";\n    }\n\n    template<class Archive>\n    void save(Archive &ar, const unsigned int /* file_version */) const\n    {\n        std::cout << \"Saving base\\n\";\n        ar << BOOST_SERIALIZATION_NVP(i);\n        ar << BOOST_SERIALIZATION_NVP(m);\n        ++save_count;\n    }\n\n    template<class Archive>\n    void load(Archive & ar, const unsigned int /* file_version */)\n    {\n        std::cout << \"Restoring base\\n\";\n        ar >> BOOST_SERIALIZATION_NVP(i);\n        ar >> BOOST_SERIALIZATION_NVP(m);\n        ++load_count;\n    }\n\n    BOOST_SERIALIZATION_SPLIT_MEMBER()\n\n    bool operator==(const base& another) const\n    {\n        return i == another.i && m == another.m;\n    }\n    // make polymorphic by marking at least one function virtual\n    virtual ~base() {};\nprivate:\n    int i;\n    std::map<int, std::string> m;\n};\n\n// note: the default is for object tracking to be performed if and only\n// if and object of the corresponding class is anywhere serialized\n// through a pointer.  In this example, that doesn't occur so\n// by default, the shared base object wouldn't normally be tracked.\n// This would leave to multiple save/load operation of the data in\n// this shared base class.  This wouldn't cause an error, but it would\n// be a waste of time.  So set the tracking behavior trait of the base\n// class to always track serialized objects of that class.  This permits\n// the system to detect and eliminate redundant save/load operations.\n// (It is conceivable that this might someday be detected automatically\n// but for now, this is not done so we have to rely on the programmer\n// to specify this trait)\nBOOST_CLASS_TRACKING(base, track_always)\n\nclass derived1 : virtual public base {\npublic:\n    template<class Archive>\n    void save(Archive &ar, const unsigned int /* file_version */) const\n    {\n        std::cout << \"Saving derived1\\n\";\n        ar << BOOST_SERIALIZATION_BASE_OBJECT_NVP(base);\n    }\n\n    template<class Archive>\n    void load(Archive & ar, const unsigned int /* file_version */)\n    {\n        std::cout << \"Restoring derived1\\n\";\n        ar >> BOOST_SERIALIZATION_BASE_OBJECT_NVP(base);\n    }\n\n    BOOST_SERIALIZATION_SPLIT_MEMBER()\n};\n\nclass derived2 : virtual public base {\npublic:\n    template<class Archive>\n    void save(Archive &ar, const unsigned int /* file_version */) const\n    {\n        std::cout << \"Saving derived2\\n\";\n        ar << BOOST_SERIALIZATION_BASE_OBJECT_NVP(base);\n    }\n\n    template<class Archive>\n    void load(Archive & ar, const unsigned int /* file_version */)\n    {\n        std::cout << \"Restoring derived2\\n\";\n        ar >> BOOST_SERIALIZATION_BASE_OBJECT_NVP(base);\n    }\n\n    BOOST_SERIALIZATION_SPLIT_MEMBER()\n};\n\nclass final : public derived1, public derived2 {\npublic:\n    final() {}\n    final(int i) : base(i) {}\n\n    template<class Archive>\n    void save(Archive &ar, const unsigned int /* file_version */) const\n    {\n        std::cout << \"Saving final\\n\";\n        ar << BOOST_SERIALIZATION_BASE_OBJECT_NVP(derived1);\n        ar << BOOST_SERIALIZATION_BASE_OBJECT_NVP(derived2);\n    }\n\n    template<class Archive>\n    void load(Archive & ar, const unsigned int /* file_version */)\n    {\n        std::cout << \"Restoring final\\n\";\n        ar >> BOOST_SERIALIZATION_BASE_OBJECT_NVP(derived1);\n        ar >> BOOST_SERIALIZATION_BASE_OBJECT_NVP(derived2);\n    }\n\n    BOOST_SERIALIZATION_SPLIT_MEMBER()\n};\n\nBOOST_CLASS_EXPORT(final)\n\nint\ntest_main( int /* argc */, char* /* argv */[] )\n{\n    const char * testfile = boost::archive::tmpnam(NULL);\n    BOOST_REQUIRE(NULL != testfile);\n\n    const final b(3);\n    {\n        test_ostream ofs(testfile, TEST_STREAM_FLAGS);\n        test_oarchive oa(ofs);\n        oa << boost::serialization::make_nvp(\"b\", b);\n    }\n\n    final b2;\n    {\n        test_istream ifs(testfile, TEST_STREAM_FLAGS);\n        test_iarchive ia(ifs);\n        ia >> boost::serialization::make_nvp(\"b2\", b2);\n    }\n    BOOST_CHECK(1 == save_count);\n    BOOST_CHECK(1 == load_count);\n    BOOST_CHECK(b2 == b);\n    std::remove(testfile);\n\n    // do the same test with pointers\n    testfile = boost::archive::tmpnam(NULL);\n    BOOST_REQUIRE(NULL != testfile);\n\n    save_count = 0;\n    load_count = 0;\n\n    const base* bp = new final( 3 );\n    {\n        test_ostream ofs(testfile);\n        test_oarchive oa(ofs);\n        oa << BOOST_SERIALIZATION_NVP(bp);\n    }\n\n    base* bp2;\n    {\n        test_istream ifs(testfile);\n        test_iarchive ia(ifs);\n        ia >> BOOST_SERIALIZATION_NVP(bp2);\n    }\n\n    BOOST_CHECK(1 == save_count);\n    BOOST_CHECK(1 == load_count);\n    BOOST_CHECK(*bp2 == *bp);\n    delete bp;\n    std::remove(testfile);\n\n    return EXIT_SUCCESS;\n}\n"
  },
  {
    "path": "test/test_diamond_complex.cpp",
    "content": "/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// test_diamond.cpp\n\n// (C) Copyright 2002-2009 Vladimir Prus, Robert Ramey and Takatoshi Kondo.\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n// test of serialization library for diamond inheritance situations\n\n#include <cstddef> // NULL\n#include <fstream>\n#include <iostream>\n\n#include <boost/config.hpp>\n#include <cstdio> // remove\n#if defined(BOOST_NO_STDC_NAMESPACE)\nnamespace std{\n    using ::remove;\n}\n#endif\n\n#include \"test_tools.hpp\"\n\n#include <boost/serialization/map.hpp>\n#include <boost/serialization/utility.hpp>\n#include <boost/serialization/split_member.hpp>\n#include <boost/serialization/tracking.hpp>\n#include <boost/serialization/base_object.hpp>\n#include <boost/serialization/nvp.hpp>\n#include <boost/serialization/export.hpp>\n\nint save_count = 0; // used to detect when EXnLevel1 class is saved multiple times\nint load_count = 0; // used to detect when EXnLevel1 class is loaded multiple times\n\n// inheritance structure\n//\n// EX1Level1<-+-EX1Level2_A<-+-+-EX1Level3_A\n//            |              | |\n//            +-EX1Level2_B<-+ +-EX1Level3_B<--EX1Level4\n//\n// EXPORT Sequence EX1Level3_A, EX1Level4\n//---------------------------------------------------------\n// EX2Level1<-+-EX2Level2_A<-+-+-EX2Level3_A\n//            |              | |\n//            +-EX2Level2_B<-+ +-EX2Level3_B<--EX2Level4\n//\n// EXPORT Sequence EX2Level4, EX2Level3_A\n\nclass EX1Level1 {\npublic:\n    EX1Level1() : i(0) {}\n    EX1Level1(int i) : i(i)\n    {\n        m[i] = \"text\";\n    }\n\n    template<class Archive>\n    void save(Archive &ar, const unsigned int /* file_version */) const\n    {\n        std::cout << \"Saving EX1Level1\\n\";\n        ar << BOOST_SERIALIZATION_NVP(i);\n        ar << BOOST_SERIALIZATION_NVP(m);\n        ++save_count;\n    }\n\n    template<class Archive>\n    void load(Archive & ar, const unsigned int /* file_version */)\n    {\n        std::cout << \"Restoring EX1Level1\\n\";\n        ar >> BOOST_SERIALIZATION_NVP(i);\n        ar >> BOOST_SERIALIZATION_NVP(m);\n        ++load_count;\n    }\n\n    BOOST_SERIALIZATION_SPLIT_MEMBER()\n\n    bool operator==(const EX1Level1& another) const\n    {\n        return i == another.i && m == another.m;\n    }\n    // make polymorphic by marking at least one function virtual\n    virtual ~EX1Level1() {};\nprivate:\n    int i;\n    std::map<int, std::string> m;\n};\n\n// note: the default is for object tracking to be performed if and only\n// if and object of the corresponding class is anywhere serialized\n// through a pointer.  In this example, that doesn't occur so\n// by default, the shared EX1Level1 object wouldn't normally be tracked.\n// This would leave to multiple save/load operation of the data in\n// this shared EX1Level1 class.  This wouldn't cause an error, but it would\n// be a waste of time.  So set the tracking behavior trait of the EX1Level1\n// class to always track serialized objects of that class.  This permits\n// the system to detect and eliminate redundant save/load operations.\n// (It is conceivable that this might someday be detected automatically\n// but for now, this is not done so we have to rely on the programmer\n// to specify this trait)\nBOOST_CLASS_TRACKING(EX1Level1, track_always)\n\nclass EX1Level2_A : virtual public EX1Level1 {\npublic:\n    template<class Archive>\n    void save(Archive &ar, const unsigned int /* file_version */) const\n    {\n        std::cout << \"Saving EX1Level2_A\\n\";\n        ar << BOOST_SERIALIZATION_BASE_OBJECT_NVP(EX1Level1);\n    }\n\n    template<class Archive>\n    void load(Archive & ar, const unsigned int /* file_version */)\n    {\n        std::cout << \"Restoring EX1Level2_A\\n\";\n        ar >> BOOST_SERIALIZATION_BASE_OBJECT_NVP(EX1Level1);\n    }\n\n    BOOST_SERIALIZATION_SPLIT_MEMBER()\n};\n\nclass EX1Level2_B : virtual public EX1Level1 {\npublic:\n    template<class Archive>\n    void save(Archive &ar, const unsigned int /* file_version */) const\n    {\n        std::cout << \"Saving EX1Level2_B\\n\";\n        ar << BOOST_SERIALIZATION_BASE_OBJECT_NVP(EX1Level1);\n    }\n\n    template<class Archive>\n    void load(Archive & ar, const unsigned int /* file_version */)\n    {\n        std::cout << \"Restoring EX1Level2_B\\n\";\n        ar >> BOOST_SERIALIZATION_BASE_OBJECT_NVP(EX1Level1);\n    }\n\n    BOOST_SERIALIZATION_SPLIT_MEMBER()\n};\n\nclass EX1Level3_A : public EX1Level2_A, public EX1Level2_B {\npublic:\n    EX1Level3_A() {}\n    EX1Level3_A(int i) : EX1Level1(i) {}\n\n    template<class Archive>\n    void save(Archive &ar, const unsigned int /* file_version */) const\n    {\n        std::cout << \"Saving EX1Level3_A\\n\";\n        ar << BOOST_SERIALIZATION_BASE_OBJECT_NVP(EX1Level2_A);\n        ar << BOOST_SERIALIZATION_BASE_OBJECT_NVP(EX1Level2_B);\n    }\n\n    template<class Archive>\n    void load(Archive & ar, const unsigned int /* file_version */)\n    {\n        std::cout << \"Restoring EX1Level3_A\\n\";\n        ar >> BOOST_SERIALIZATION_BASE_OBJECT_NVP(EX1Level2_A);\n        ar >> BOOST_SERIALIZATION_BASE_OBJECT_NVP(EX1Level2_B);\n    }\n\n    BOOST_SERIALIZATION_SPLIT_MEMBER()\n};\n\n\nclass EX1Level3_B : public EX1Level2_A, public EX1Level2_B {\npublic:\n    EX1Level3_B() {}\n    EX1Level3_B(int) {}\n\n    template<class Archive>\n    void save(Archive &ar, const unsigned int /* file_version */) const\n    {\n        std::cout << \"Saving EX1Level3_B\\n\";\n        ar << BOOST_SERIALIZATION_BASE_OBJECT_NVP(EX1Level2_A);\n        ar << BOOST_SERIALIZATION_BASE_OBJECT_NVP(EX1Level2_B);\n    }\n\n    template<class Archive>\n    void load(Archive & ar, const unsigned int /* file_version */)\n    {\n        std::cout << \"Restoring EX1Level3_B\\n\";\n        ar >> BOOST_SERIALIZATION_BASE_OBJECT_NVP(EX1Level2_A);\n        ar >> BOOST_SERIALIZATION_BASE_OBJECT_NVP(EX1Level2_B);\n    }\n\n    BOOST_SERIALIZATION_SPLIT_MEMBER()\n};\n\nclass EX1Level4 : public EX1Level3_B {\npublic:\n    EX1Level4() {}\n    EX1Level4(int i) : EX1Level1(i) {}\n\n    template<class Archive>\n    void save(Archive &ar, const unsigned int /* file_version */) const\n    {\n        std::cout << \"Saving EX1Level4\\n\";\n        ar << BOOST_SERIALIZATION_BASE_OBJECT_NVP(EX1Level3_B);\n    }\n\n    template<class Archive>\n    void load(Archive & ar, const unsigned int /* file_version */)\n    {\n        std::cout << \"Restoring EX1Level4\\n\";\n        ar >> BOOST_SERIALIZATION_BASE_OBJECT_NVP(EX1Level3_B);\n    }\n\n    BOOST_SERIALIZATION_SPLIT_MEMBER()\n};\n\n\nclass EX2Level1 {\npublic:\n    EX2Level1() : i(0) {}\n    EX2Level1(int i) : i(i)\n    {\n        m[i] = \"text\";\n    }\n\n    template<class Archive>\n    void save(Archive &ar, const unsigned int /* file_version */) const\n    {\n        std::cout << \"Saving EX2Level1\\n\";\n        ar << BOOST_SERIALIZATION_NVP(i);\n        ar << BOOST_SERIALIZATION_NVP(m);\n        ++save_count;\n    }\n\n    template<class Archive>\n    void load(Archive & ar, const unsigned int /* file_version */)\n    {\n        std::cout << \"Restoring EX2Level1\\n\";\n        ar >> BOOST_SERIALIZATION_NVP(i);\n        ar >> BOOST_SERIALIZATION_NVP(m);\n        ++load_count;\n    }\n\n    BOOST_SERIALIZATION_SPLIT_MEMBER()\n\n    bool operator==(const EX2Level1& another) const\n    {\n        return i == another.i && m == another.m;\n    }\n    // make polymorphic by marking at least one function virtual\n    virtual ~EX2Level1() {};\nprivate:\n    int i;\n    std::map<int, std::string> m;\n};\n\n// note: the default is for object tracking to be performed if and only\n// if and object of the corresponding class is anywhere serialized\n// through a pointer.  In this example, that doesn't occur so\n// by default, the shared EX2Level1 object wouldn't normally be tracked.\n// This would leave to multiple save/load operation of the data in\n// this shared EX2Level1 class.  This wouldn't cause an error, but it would\n// be a waste of time.  So set the tracking behavior trait of the EX2Level1\n// class to always track serialized objects of that class.  This permits\n// the system to detect and eliminate redundant save/load operations.\n// (It is conceivable that this might someday be detected automatically\n// but for now, this is not done so we have to rely on the programmer\n// to specify this trait)\nBOOST_CLASS_TRACKING(EX2Level1, track_always)\n\nclass EX2Level2_A : virtual public EX2Level1 {\npublic:\n    template<class Archive>\n    void save(Archive &ar, const unsigned int /* file_version */) const\n    {\n        std::cout << \"Saving EX2Level2_A\\n\";\n        ar << BOOST_SERIALIZATION_BASE_OBJECT_NVP(EX2Level1);\n    }\n\n    template<class Archive>\n    void load(Archive & ar, const unsigned int /* file_version */)\n    {\n        std::cout << \"Restoring EX2Level2_A\\n\";\n        ar >> BOOST_SERIALIZATION_BASE_OBJECT_NVP(EX2Level1);\n    }\n\n    BOOST_SERIALIZATION_SPLIT_MEMBER()\n};\n\nclass EX2Level2_B : virtual public EX2Level1 {\npublic:\n    template<class Archive>\n    void save(Archive &ar, const unsigned int /* file_version */) const\n    {\n        std::cout << \"Saving EX2Level2_B\\n\";\n        ar << BOOST_SERIALIZATION_BASE_OBJECT_NVP(EX2Level1);\n    }\n\n    template<class Archive>\n    void load(Archive & ar, const unsigned int /* file_version */)\n    {\n        std::cout << \"Restoring EX2Level2_B\\n\";\n        ar >> BOOST_SERIALIZATION_BASE_OBJECT_NVP(EX2Level1);\n    }\n\n    BOOST_SERIALIZATION_SPLIT_MEMBER()\n};\n\nclass EX2Level3_A : public EX2Level2_A, public EX2Level2_B {\npublic:\n    EX2Level3_A() {}\n    EX2Level3_A(int i) : EX2Level1(i) {}\n\n    template<class Archive>\n    void save(Archive &ar, const unsigned int /* file_version */) const\n    {\n        std::cout << \"Saving EX2Level3_A\\n\";\n        ar << BOOST_SERIALIZATION_BASE_OBJECT_NVP(EX2Level2_A);\n        ar << BOOST_SERIALIZATION_BASE_OBJECT_NVP(EX2Level2_B);\n    }\n\n    template<class Archive>\n    void load(Archive & ar, const unsigned int /* file_version */)\n    {\n        std::cout << \"Restoring EX2Level3_A\\n\";\n        ar >> BOOST_SERIALIZATION_BASE_OBJECT_NVP(EX2Level2_A);\n        ar >> BOOST_SERIALIZATION_BASE_OBJECT_NVP(EX2Level2_B);\n    }\n\n    BOOST_SERIALIZATION_SPLIT_MEMBER()\n};\n\n\nclass EX2Level3_B : public EX2Level2_A, public EX2Level2_B {\npublic:\n    EX2Level3_B() {}\n    EX2Level3_B(int i) : EX2Level1(i) {}\n\n    template<class Archive>\n    void save(Archive &ar, const unsigned int /* file_version */) const\n    {\n        std::cout << \"Saving EX2Level3_B\\n\";\n        ar << BOOST_SERIALIZATION_BASE_OBJECT_NVP(EX2Level2_A);\n        ar << BOOST_SERIALIZATION_BASE_OBJECT_NVP(EX2Level2_B);\n    }\n\n    template<class Archive>\n    void load(Archive & ar, const unsigned int /* file_version */)\n    {\n        std::cout << \"Restoring EX2Level3_B\\n\";\n        ar >> BOOST_SERIALIZATION_BASE_OBJECT_NVP(EX2Level2_A);\n        ar >> BOOST_SERIALIZATION_BASE_OBJECT_NVP(EX2Level2_B);\n    }\n\n    BOOST_SERIALIZATION_SPLIT_MEMBER()\n};\n\nclass EX2Level4 : public EX2Level3_B {\npublic:\n    EX2Level4() {}\n    EX2Level4(int i) : EX2Level1(i) {}\n\n    template<class Archive>\n    void save(Archive &ar, const unsigned int /* file_version */) const\n    {\n        std::cout << \"Saving EX2Level4\\n\";\n        ar << BOOST_SERIALIZATION_BASE_OBJECT_NVP(EX2Level3_B);\n    }\n\n    template<class Archive>\n    void load(Archive & ar, const unsigned int /* file_version */)\n    {\n        std::cout << \"Restoring EX2Level4\\n\";\n        ar >> BOOST_SERIALIZATION_BASE_OBJECT_NVP(EX2Level3_B);\n    }\n\n    BOOST_SERIALIZATION_SPLIT_MEMBER()\n};\n\nBOOST_CLASS_EXPORT(EX1Level4)\nBOOST_CLASS_EXPORT(EX1Level3_A)\n\nBOOST_CLASS_EXPORT(EX2Level3_A)\nBOOST_CLASS_EXPORT(EX2Level4)\n\nint\ntest_main( int /* argc */, char* /* argv */[] )\n{\n    const char * testfile = boost::archive::tmpnam(NULL);\n    BOOST_REQUIRE(NULL != testfile);\n\n\t{\n\t\tsave_count = 0;\n\t\tload_count = 0;\n\n\t\tconst EX1Level3_A ex1L3a_save(3);\n\t\tconst EX1Level1 *ex1L1_save = &ex1L3a_save;\n\t\t{\n\t\t\ttest_ostream ofs(testfile, TEST_STREAM_FLAGS);\n\t\t\ttest_oarchive oa(ofs);\n\t\t\toa << boost::serialization::make_nvp(\"ex1L1_save\", ex1L1_save);\n\t\t}\n\n\t\tEX1Level1 *ex1L1_load;\n\t\t{\n\t\t\ttest_istream ifs(testfile, TEST_STREAM_FLAGS);\n\t\t\ttest_iarchive ia(ifs);\n\t\t\tia >> boost::serialization::make_nvp(\"ex1L1_load\", ex1L1_load);\n\t\t}\n\t\tBOOST_CHECK(1 == save_count);\n\t\tBOOST_CHECK(1 == load_count);\n\t\tBOOST_CHECK(*ex1L1_save == *ex1L1_load);\n\t\tstd::remove(testfile);\n\t}\n\t{\n\t\tsave_count = 0;\n\t\tload_count = 0;\n\n\t\tconst EX1Level4 ex1L4_save(3);\n\t\tconst EX1Level1 *ex1L1_save = &ex1L4_save;\n\t\t{\n\t\t\ttest_ostream ofs(testfile, TEST_STREAM_FLAGS);\n\t\t\ttest_oarchive oa(ofs);\n\t\t\toa << boost::serialization::make_nvp(\"ex1L1_save\", ex1L1_save);\n\t\t}\n\n\t\tEX1Level1 *ex1L1_load;\n\t\t{\n\t\t\ttest_istream ifs(testfile, TEST_STREAM_FLAGS);\n\t\t\ttest_iarchive ia(ifs);\n\t\t\tia >> boost::serialization::make_nvp(\"ex1L1_load\", ex1L1_load);\n\t\t}\n\t\tBOOST_CHECK(1 == save_count);\n\t\tBOOST_CHECK(1 == load_count);\n\t\tBOOST_CHECK(*ex1L1_save == *ex1L1_load);\n\t\tstd::remove(testfile);\n\t}\n\t{\n\t\tsave_count = 0;\n\t\tload_count = 0;\n\n\t\tconst EX2Level3_A ex2L3a_save(3);\n\t\tconst EX2Level1 *ex2L1_save = &ex2L3a_save;\n\t\t{\n\t\t\ttest_ostream ofs(testfile, TEST_STREAM_FLAGS);\n\t\t\ttest_oarchive oa(ofs);\n\t\t\toa << boost::serialization::make_nvp(\"ex2L1_save\", ex2L1_save);\n\t\t}\n\n\t\tEX2Level1 *ex2L1_load;\n\t\t{\n\t\t\ttest_istream ifs(testfile, TEST_STREAM_FLAGS);\n\t\t\ttest_iarchive ia(ifs);\n\t\t\tia >> boost::serialization::make_nvp(\"ex2L1_load\", ex2L1_load);\n\t\t}\n\t\tBOOST_CHECK(1 == save_count);\n\t\tBOOST_CHECK(1 == load_count);\n\t\tBOOST_CHECK(*ex2L1_save == *ex2L1_load);\n\t\tstd::remove(testfile);\n\t}\n\t{\n\t\tsave_count = 0;\n\t\tload_count = 0;\n\n\t\tconst EX2Level4 ex2L4_save(3);\n\t\tconst EX2Level1 *ex2L1_save = &ex2L4_save;\n\t\t{\n\t\t\ttest_ostream ofs(testfile, TEST_STREAM_FLAGS);\n\t\t\ttest_oarchive oa(ofs);\n\t\t\toa << boost::serialization::make_nvp(\"ex2L1_save\", ex2L1_save);\n\t\t}\n\n\t\tEX2Level1 *ex2L1_load;\n\t\t{\n\t\t\ttest_istream ifs(testfile, TEST_STREAM_FLAGS);\n\t\t\ttest_iarchive ia(ifs);\n\t\t\tia >> boost::serialization::make_nvp(\"ex2L1_load\", ex2L1_load);\n\t\t}\n\t\tBOOST_CHECK(1 == save_count);\n\t\tBOOST_CHECK(1 == load_count);\n\t\tBOOST_CHECK(*ex2L1_save == *ex2L1_load);\n\t\tstd::remove(testfile);\n\t}\n    return EXIT_SUCCESS;\n}\n"
  },
  {
    "path": "test/test_dll_exported.cpp",
    "content": "/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// test_dll_exported.cpp\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n// should pass compilation and execution\n\n// This is an overly complex test.  The purpose of this test is to\n// demonstrate and test the ability to serialize a hierarchy of class\n// through a base class pointer even though those class might be\n// implemented in different dlls and use different extended type info\n// systems.\n//\n// polymorphic_ base is locally declared and defined.  It use the\n// \"no_rtti\" extended type info system.\n\n// polymorphic_derived1 is locally declared and defined.  It uses\n// the default \"type_id\" extended type info system\n\n// polymorphic_derived2 is declared in polymorphic_derived.hpp\n// and defined in dll_polymorphic_derived2.  It uses the typeid\n// system.\n\n#include <cstddef> // NULL\n#include <fstream>\n\n#include <cstdio> // remove\n#include <boost/config.hpp>\n#if defined(BOOST_NO_STDC_NAMESPACE)\nnamespace std{\n    using ::remove;\n}\n#endif\n\n#include <boost/archive/polymorphic_oarchive.hpp>\n#include <boost/archive/polymorphic_iarchive.hpp>\n\n#include \"test_tools.hpp\"\n\n#include <boost/archive/polymorphic_oarchive.hpp>\n#include <boost/archive/polymorphic_iarchive.hpp>\n\n#include <boost/serialization/base_object.hpp>\n#include <boost/serialization/export.hpp>\n#include <boost/serialization/access.hpp>\n\n#define POLYMORPHIC_BASE_IMPORT\n#include \"polymorphic_base.hpp\"\n\n#include \"polymorphic_derived1.hpp\"\n\n#define POLYMORPHIC_DERIVED2_IMPORT\n#include \"polymorphic_derived2.hpp\"\n\n// save exported polymorphic class\nvoid save_exported(const char *testfile)\n{\n    test_ostream os(testfile, TEST_STREAM_FLAGS);\n    test_oarchive oa_implementation(os, TEST_ARCHIVE_FLAGS);\n    boost::archive::polymorphic_oarchive & oa_interface = oa_implementation;\n\n    polymorphic_base *rb1 = new polymorphic_derived1;\n    polymorphic_base *rb2 = new polymorphic_derived2;\n    polymorphic_derived2 *rd21 = new polymorphic_derived2;\n\n    // export will permit correct serialization\n    // through a pointer to a base class\n    oa_interface << BOOST_SERIALIZATION_NVP(rb1);\n    oa_interface << BOOST_SERIALIZATION_NVP(rb2);\n    oa_interface << BOOST_SERIALIZATION_NVP(rd21);\n\n    delete rd21;\n    delete rb2;\n    delete rb1;\n}\n\n// save exported polymorphic class\nvoid load_exported(const char *testfile)\n{\n    test_istream is(testfile, TEST_STREAM_FLAGS);\n    test_iarchive ia_implementation(is, TEST_ARCHIVE_FLAGS);\n    boost::archive::polymorphic_iarchive & ia_interface = ia_implementation;\n\n    polymorphic_base *rb1 = NULL;\n    polymorphic_base *rb2 = NULL;\n    polymorphic_derived2 *rd21 = NULL;\n\n    // export will permit correct serialization\n    // through a pointer to a base class\n    ia_interface >> BOOST_SERIALIZATION_NVP(rb1);\n    BOOST_CHECK_MESSAGE(\n        boost::serialization::type_info_implementation<polymorphic_derived1>\n            ::type::get_const_instance()\n        ==\n        * boost::serialization::type_info_implementation<polymorphic_base>\n            ::type::get_const_instance().get_derived_extended_type_info(*rb1),\n        \"restored pointer b1 not of correct type\"\n    );\n    ia_interface >> BOOST_SERIALIZATION_NVP(rb2);\n    BOOST_CHECK_MESSAGE(\n        boost::serialization::type_info_implementation<polymorphic_derived2>\n            ::type::get_const_instance()\n        ==\n        * boost::serialization::type_info_implementation<polymorphic_base>\n            ::type::get_const_instance().get_derived_extended_type_info(*rb2),\n        \"restored pointer b2 not of correct type\"\n    );\n    ia_interface >> BOOST_SERIALIZATION_NVP(rd21);\n    BOOST_CHECK_MESSAGE(\n        boost::serialization::type_info_implementation<polymorphic_derived2>\n            ::type::get_const_instance()\n        ==\n        * boost::serialization::type_info_implementation<polymorphic_derived2>\n            ::type::get_const_instance().get_derived_extended_type_info(*rd21),\n        \"restored pointer d2 not of correct type\"\n    );\n    delete rd21;\n    delete rb2;\n    delete rb1;\n}\n\nint\ntest_main( int /* argc */, char* /* argv */[] )\n{\n    const char * testfile = boost::archive::tmpnam(NULL);\n    BOOST_REQUIRE(NULL != testfile);\n\n    save_exported(testfile);\n    load_exported(testfile);\n    std::remove(testfile);\n    return EXIT_SUCCESS;\n}\n\n// EOF\n"
  },
  {
    "path": "test/test_dll_plugin.cpp",
    "content": "/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// test_dll_plugin.cpp\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n// should pass compilation and execution\n\n// Note this test creates, serializes, and destroys\n// a class instance while knowing nothing more than its\n// exported class ID (GUID) and a base class from which\n// it is derived.  This is referred to as a \"plugin\"\n// since the same program could, without recompilation,\n// manipulate any number of derived types - even those\n// which have not been yet been created.\n\n#include <fstream>\n\n#include <cstdio> // remove\n#include <boost/config.hpp>\n#if defined(BOOST_NO_STDC_NAMESPACE)\nnamespace std{\n    using ::remove;\n}\n#endif\n\n#include <boost/archive/archive_exception.hpp>\n\n// for now, only test with simple text and polymorphic archive\n#include \"test_tools.hpp\"\n\n#include <boost/serialization/base_object.hpp>\n#include <boost/serialization/export.hpp>\n#include <boost/serialization/type_info_implementation.hpp>\n#include <boost/serialization/access.hpp>\n#include <boost/serialization/void_cast.hpp>\n#include <boost/serialization/extended_type_info.hpp>\n\n#include \"polymorphic_base.hpp\"\n\n// declare and implement a derived class in our own executable\nclass polymorphic_derived1 : public polymorphic_base\n{\n    friend class boost::serialization::access;\n    template<class Archive>\n    void serialize(Archive &ar, const unsigned int /* file_version */){\n        ar & BOOST_SERIALIZATION_BASE_OBJECT_NVP(polymorphic_base);\n    }\n    const char * get_key() const{\n        return\n            boost::serialization::type_info_implementation<\n                polymorphic_derived1\n            >::type::get_const_instance().get_key();\n    }\npublic:\n    virtual ~polymorphic_derived1(){}\n};\n\n// This class is derived from polymorphic_base which uses the no_rtti system\n// rather than the typeid system.  This system uses the exported name as the\n// type identifier key.  This MUST be exported!!!\nBOOST_CLASS_EXPORT(polymorphic_derived1)\n\n// MWerks users can do this to make their code work\nBOOST_SERIALIZATION_MWERKS_BASE_AND_DERIVED(polymorphic_base, polymorphic_derived1)\n\n// save exported polymorphic class\nvoid save_exported(const char *testfile)\n{\n    test_ostream os(testfile, TEST_STREAM_FLAGS);\n    test_oarchive oa(os, TEST_ARCHIVE_FLAGS);\n\n    polymorphic_base *rb1 = new polymorphic_derived1;\n\n    // get the eti record for the exported type \"polymorphic_derived2\"\n    boost::serialization::extended_type_info const * const d2_eti =\n        boost::serialization::extended_type_info::find(\n            \"polymorphic_derived2\"\n        );\n    assert(NULL != d2_eti);\n\n    // create a new instance of the type referred to by this record.\n    // in this example, we happen to know that the class constructor\n    // takes no arguments.\n    void const * const rd2 = d2_eti->construct();\n    assert(NULL != rd2);\n\n    // transform the pointer to a pointer to the base class\n    polymorphic_base const * const rb2\n        = static_cast<polymorphic_base const *>(\n            boost::serialization::void_upcast(\n                * d2_eti,\n                boost::serialization::type_info_implementation<polymorphic_base>\n                    ::type::get_const_instance(),\n                rd2\n            )\n        );\n\n    // export will permit correct serialization\n    // through a pointer to a base class\n    oa << BOOST_SERIALIZATION_NVP(rb1);\n    oa << BOOST_SERIALIZATION_NVP(rb2);\n\n    // don't need these any more - don't leak memory\n    delete rb1;\n    // note delete original handle - not runtime cast one !!!\n    //delete rb2;\n    d2_eti->destroy(rd2);\n}\n\n// save exported polymorphic class\nvoid load_exported(const char *testfile)\n{\n    test_istream is(testfile, TEST_STREAM_FLAGS);\n    test_iarchive ia(is, TEST_ARCHIVE_FLAGS);\n\n    polymorphic_base *rb1 = NULL;\n    polymorphic_base *rb2 = NULL;\n\n    // export will permit correct serialization\n    // through a pointer to a base class\n    ia >> BOOST_SERIALIZATION_NVP(rb1);\n\n    BOOST_CHECK_MESSAGE(\n        boost::serialization::type_info_implementation<polymorphic_derived1>\n            ::type::get_const_instance()\n        ==\n        * boost::serialization::type_info_implementation<polymorphic_base>\n            ::type::get_const_instance().get_derived_extended_type_info(*rb1),\n        \"restored pointer b1 not of correct type\"\n    );\n    ia >> BOOST_SERIALIZATION_NVP(rb2);\n\n    // get the eti record for the exported type \"polymorphic_derived2\"\n    boost::serialization::extended_type_info const * const d2_eti =\n        boost::serialization::extended_type_info::find(\n            \"polymorphic_derived2\"\n        );\n    assert(NULL != d2_eti);\n\n    BOOST_CHECK_MESSAGE(\n        * d2_eti\n        ==\n        * boost::serialization::type_info_implementation<polymorphic_base>\n            ::type::get_const_instance().get_derived_extended_type_info(*rb2),\n        \"restored pointer b2 not of correct type\"\n    );\n\n    delete rb1;\n    delete rb2;\n}\n\n#ifdef BOOST_WINDOWS\n\n#define WIN32_LEAN_AND_MEAN\n#include <TCHAR.H>\n#include <windows.h>\n\nint\ntest_main( int /* argc */, char* /* argv */[] )\n{\n    const char * testfile = boost::archive::tmpnam(NULL);\n    BOOST_REQUIRE(NULL != testfile);\n\n    HINSTANCE hDLL;               // Handle to DLL\n    hDLL = LoadLibrary(_T(\"polymorphic_derived2.dll\"));\n    BOOST_CHECK_MESSAGE(\n        (0 != hDLL),\n        \"Failed to find/load polymorphic_derived2\"\n    );\n    if(0 == hDLL)\n        return EXIT_FAILURE;\n\n    save_exported(testfile);\n    load_exported(testfile);\n    FreeLibrary(hDLL);\n\n    std::remove(testfile);\n    return EXIT_SUCCESS;\n}\n\n#else // presume *nix\n\n#include <dlfcn.h>\n\nint\ntest_main( int /* argc */, char* /* argv */[] )\n{\n    const char * testfile = boost::archive::tmpnam(NULL);\n    BOOST_REQUIRE(NULL != testfile);\n\n    void * hDLL;               // Handle to DLL\n    hDLL = dlopen(\"polymorphic_derived2.so\", RTLD_NOW | RTLD_GLOBAL);\n    BOOST_CHECK_MESSAGE((0 != hDLL), \"Failed to find/load plugin_polymorphic_derived2\" );\n    BOOST_CHECK_MESSAGE((0 != hDLL), dlerror() );\n    if(0 == hDLL)\n        return EXIT_FAILURE;\n\n    save_exported(testfile);\n    load_exported(testfile);\n    dlclose(hDLL);\n\n    std::remove(testfile);\n    return EXIT_SUCCESS;\n}\n\n#endif\n\n// EOF\n"
  },
  {
    "path": "test/test_dll_simple.cpp",
    "content": "/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// test_dll_simple.cpp\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n// should pass compilation and execution\n\n// invoke header for a custom archive test.\n\n#include <cstddef> // NULL\n#include <fstream>\n\n#include <cstdio> // remove\n#include <boost/config.hpp>\n\n#if defined(BOOST_NO_STDC_NAMESPACE)\nnamespace std{\n    using ::remove;\n}\n#endif\n\n// for now, only test with simple text and polymorphic archive\n#include \"test_tools.hpp\"\n#include \"text_archive.hpp\"\n\n#include <boost/archive/polymorphic_text_oarchive.hpp>\n#include <boost/archive/polymorphic_text_iarchive.hpp>\n\n#define A_IMPORT\n#include \"A.hpp\"\n\n// simple class with text archive compiled in dll\nvoid\ntest1(){\n    const char * testfile = boost::archive::tmpnam(NULL);\n    BOOST_REQUIRE(NULL != testfile);\n\n    const A a;\n    A a1;\n    {\n        test_ostream os(testfile, TEST_STREAM_FLAGS);\n        boost::archive::text_oarchive oa(os, TEST_ARCHIVE_FLAGS);\n        oa << boost::serialization::make_nvp(\"a\", a);\n    }\n    {\n        test_istream is(testfile, TEST_STREAM_FLAGS);\n        boost::archive::text_iarchive ia(is, TEST_ARCHIVE_FLAGS);\n        ia >> boost::serialization::make_nvp(\"a\", a1);\n    }\n    BOOST_CHECK_EQUAL(a, a1);\n\n    std::remove(testfile);\n}\n\n// simple class with polymorphic archive compiled in dll\nvoid\ntest2(){\n    const char * testfile = boost::archive::tmpnam(NULL);\n    BOOST_REQUIRE(NULL != testfile);\n\n    const A a;\n    A a1;\n    {\n        test_ostream os(testfile, TEST_STREAM_FLAGS);\n        boost::archive::polymorphic_text_oarchive oa(os, TEST_ARCHIVE_FLAGS);\n        boost::archive::polymorphic_oarchive & poa(oa);\n        poa << boost::serialization::make_nvp(\"a\", a);\n    }\n    {\n        test_istream is(testfile, TEST_STREAM_FLAGS);\n        boost::archive::polymorphic_text_iarchive ia(is, TEST_ARCHIVE_FLAGS);\n        boost::archive::polymorphic_iarchive & pia(ia);\n        pia >> boost::serialization::make_nvp(\"a\", a1);\n    }\n    BOOST_CHECK_EQUAL(a, a1);\n\n    std::remove(testfile);\n}\n\n// simple class pointer with text archive compiled in dll\nvoid\ntest3(){\n    const char * testfile = boost::archive::tmpnam(NULL);\n    BOOST_REQUIRE(NULL != testfile);\n\n    const A *a = new A;\n    A *a1;\n    {\n        test_ostream os(testfile, TEST_STREAM_FLAGS);\n        boost::archive::text_oarchive oa(os, TEST_ARCHIVE_FLAGS);\n        oa << boost::serialization::make_nvp(\"a\", a);\n    }\n    {\n        test_istream is(testfile, TEST_STREAM_FLAGS);\n        boost::archive::text_iarchive ia(is, TEST_ARCHIVE_FLAGS);\n        ia >> boost::serialization::make_nvp(\"a\", a1);\n    }\n    BOOST_CHECK_EQUAL(*a, *a1);\n\n    std::remove(testfile);\n    delete a;\n}\n\n// simple class pointer with polymorphic archive compiled in dll\nvoid\ntest4(){\n    const char * testfile = boost::archive::tmpnam(NULL);\n    BOOST_REQUIRE(NULL != testfile);\n\n    const A *a = new A;\n    A *a1;\n    {\n        test_ostream os(testfile, TEST_STREAM_FLAGS);\n        boost::archive::polymorphic_text_oarchive oa(os, TEST_ARCHIVE_FLAGS);\n        boost::archive::polymorphic_oarchive & poa(oa);\n        poa << boost::serialization::make_nvp(\"a\", a);\n    }\n    {\n        test_istream is(testfile, TEST_STREAM_FLAGS);\n        boost::archive::polymorphic_text_iarchive ia(is, TEST_ARCHIVE_FLAGS);\n        boost::archive::polymorphic_iarchive & pia(ia);\n        pia >> boost::serialization::make_nvp(\"a\", a1);\n    }\n    BOOST_CHECK_EQUAL(*a, *a1);\n\n    std::remove(testfile);\n    delete a;\n}\n\n#include \"B.hpp\"\n\n// derived class with base text archive compiled in dll\nvoid\ntest5(){\n    const char * testfile = boost::archive::tmpnam(NULL);\n    BOOST_REQUIRE(NULL != testfile);\n\n    const B b;\n    B b1;\n    {\n        test_ostream os(testfile, TEST_STREAM_FLAGS);\n        boost::archive::text_oarchive oa(os, TEST_ARCHIVE_FLAGS);\n        oa << boost::serialization::make_nvp(\"b\", b);\n    }\n    {\n        test_istream is(testfile, TEST_STREAM_FLAGS);\n        boost::archive::text_iarchive ia(is, TEST_ARCHIVE_FLAGS);\n        ia >> boost::serialization::make_nvp(\"b\", b1);\n    }\n    BOOST_CHECK_EQUAL(b, b1);\n\n    std::remove(testfile);\n}\n\n// derived class with base base compiled with polymorphic archive in dll\nvoid\ntest6(){\n    const char * testfile = boost::archive::tmpnam(NULL);\n    BOOST_REQUIRE(NULL != testfile);\n\n    const B b;\n    B b1;\n    {\n        test_ostream os(testfile, TEST_STREAM_FLAGS);\n        boost::archive::polymorphic_text_oarchive oa(os, TEST_ARCHIVE_FLAGS);\n        boost::archive::polymorphic_oarchive & poa(oa);\n        poa << boost::serialization::make_nvp(\"b\", b);\n    }\n    {\n        test_istream is(testfile, TEST_STREAM_FLAGS);\n        boost::archive::polymorphic_text_iarchive ia(is, TEST_ARCHIVE_FLAGS);\n        boost::archive::polymorphic_iarchive & pia(ia);\n        pia >> boost::serialization::make_nvp(\"b\", b1);\n    }\n    BOOST_CHECK_EQUAL(b, b1);\n\n    std::remove(testfile);\n}\n\n// derived class pointer with base text archive compiled in dll\nvoid\ntest7(){\n    const char * testfile = boost::archive::tmpnam(NULL);\n    BOOST_REQUIRE(NULL != testfile);\n\n    const B *b = new B;\n    B *b1;\n    {\n        test_ostream os(testfile, TEST_STREAM_FLAGS);\n        boost::archive::text_oarchive oa(os, TEST_ARCHIVE_FLAGS);\n        oa << boost::serialization::make_nvp(\"b\", b);\n    }\n    {\n        test_istream is(testfile, TEST_STREAM_FLAGS);\n        boost::archive::text_iarchive ia(is, TEST_ARCHIVE_FLAGS);\n        ia >> boost::serialization::make_nvp(\"b\", b1);\n    }\n    BOOST_CHECK_EQUAL(*b, *b1);\n\n    std::remove(testfile);\n    delete b;\n}\n\n// derived class pointer with base polymorphic archive compiled in dll\nvoid\ntest8(){\n    const char * testfile = boost::archive::tmpnam(NULL);\n    BOOST_REQUIRE(NULL != testfile);\n\n    const B *b = new B;\n    B *b1;\n    {\n        test_ostream os(testfile, TEST_STREAM_FLAGS);\n        boost::archive::polymorphic_text_oarchive oa(os, TEST_ARCHIVE_FLAGS);\n        boost::archive::polymorphic_oarchive & poa(oa);\n        poa << boost::serialization::make_nvp(\"b\", b);\n    }\n    {\n        test_istream is(testfile, TEST_STREAM_FLAGS);\n        boost::archive::polymorphic_text_iarchive ia(is, TEST_ARCHIVE_FLAGS);\n        boost::archive::polymorphic_iarchive & pia(ia);\n        pia >> boost::serialization::make_nvp(\"b\", b1);\n    }\n    BOOST_CHECK_EQUAL(*b, *b1);\n\n    std::remove(testfile);\n    delete b;\n}\n\n\nint\ntest_main( int /* argc */, char* /* argv */[] )\n{\n    test1();\n    test2();\n    test3();\n    test4();\n    test5();\n    test6();\n    test7();\n    test8();\n    return EXIT_SUCCESS;\n}\n\n"
  },
  {
    "path": "test/test_enable_shared_from_this.cpp",
    "content": "/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// test_enable_shared_from_this.cpp\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n// This demonstrates a problem with boost::serialization and boost::enable_shared_from_this.\n// (boost version 1.53)\n// See boost TRAC ticket #9567\n//\n// Given the following class structure:\n//    Base is a simple class\n//    Derived inherits from Base\n//    Derived also inherits from boost::enable_shared_from_this<Derived>\n//    Base and Derived implement boost::serialization\n//\n// When deserializing an instance of Derived into a vector of boost::shared_ptr<Derived>:\n//    Base and Derived members are reconstructed correctly.\n//\t  Derived::shared_from_this() works as expected.\n//\n// But when deserializing an instance of Derived into a vector of boost::shared_ptr<Base>:\n//    Base and Derived members are still reconstructed correctly.\n//\t  Derived::shared_from_this() throws a bad_weak_ptr exception.\n//    This is because enable_shared_from_this::weak_ptr is NOT reconstructed - It is zero.\n\n#include <sstream>\n\n#include <boost/archive/text_oarchive.hpp>\n#include <boost/archive/text_iarchive.hpp>\n\n#include <boost/enable_shared_from_this.hpp>\n#include <boost/serialization/shared_ptr.hpp>\n#include <boost/serialization/export.hpp>\n#include <boost/serialization/split_free.hpp>\n\n#include \"test_tools.hpp\"\n\n#include <set>\n\nnamespace boost {\nnamespace serialization {\n\nstruct enable_shared_from_this_helper {\n    std::set<shared_ptr<void> > m_esfth;\n    void record(boost::shared_ptr<void>  sp){\n        m_esfth.insert(sp);\n    }\n};\n\ntemplate<class Archive, class T>\nvoid serialize(\n    Archive & ar,\n    boost::enable_shared_from_this<T> & t,\n    const unsigned int file_version\n){\n    enable_shared_from_this_helper & h =\n        ar.template get_helper<\n            enable_shared_from_this_helper\n        >();\n\n    shared_ptr<T> sp = t.shared_from_this();\n    h.record(sp);\n}\n\n} // serialization\n} // boost\n\nclass Base {\n    friend class boost::serialization::access;\n\n\ttemplate<class Archive>\n\tvoid serialize(Archive & ar, const unsigned int version)\n\t{\n\t\tar & BOOST_SERIALIZATION_NVP(m_base);\n\t}\nprotected:\n\tBase() {}\n\tvirtual ~Base() {}\t\t// \"virtual\" forces RTTI, to enable serialization of Derived from Base pointer\npublic:\n\tint m_base;\n};\n\nclass Derived : public Base, public boost::enable_shared_from_this<Derived> {\n    friend class boost::serialization::access;\n\n\ttemplate<class Archive>\n\tvoid serialize(Archive & ar, const unsigned int version)\n\t{\n\t\tar & BOOST_SERIALIZATION_BASE_OBJECT_NVP(Base);\n\t\tar & BOOST_SERIALIZATION_BASE_OBJECT_NVP(\n            boost::enable_shared_from_this<Derived>\n        );\n\t\tar & BOOST_SERIALIZATION_NVP(m_derived);\n\t}\npublic:\n\tboost::shared_ptr<Derived> SharedPtr() { return shared_from_this(); }\n\tint m_derived;\n\tDerived() {}\n\t~Derived() {}\n};\n// The following is required to enable serialization from Base pointer\nBOOST_CLASS_EXPORT(Derived)\n\n// This test passes\nvoid test_passes(){\n\tstd::stringstream ss;\n\t{\n\t\tboost::shared_ptr<Derived> d(new Derived());\n\t\td->m_base = 1;\n\t\td->m_derived = 2;\n\n\t\t// Get a raw pointer to Derived\n\t\tDerived* raw_d = d.get();\n\n\t\t// Verify base and derived members\n\t\tBOOST_CHECK(raw_d->m_base==1);\n\t\tBOOST_CHECK(raw_d->m_derived==2);\n\n\t\t// verify shared_from_this\n\t\tBOOST_CHECK(d == raw_d->SharedPtr());\n\n\t\tboost::archive::text_oarchive oa(ss);\n\t\toa & BOOST_SERIALIZATION_NVP(d);\n\t}\n\t{\n\t\t// Deserialize it back into a vector of shared_ptr<Derived>\n\t\tboost::shared_ptr<Derived> d;\n\t\tss.seekg(0);\n\t\tboost::archive::text_iarchive ia(ss);\n\t\tia & BOOST_SERIALIZATION_NVP(d);\n\n\t\t// Get a raw pointer to Derived\n\t\tDerived* raw_d = d.get();\n\n\t\t// Verify base and derived members\n\t\tBOOST_CHECK(raw_d->m_base==1);\n\t\tBOOST_CHECK(raw_d->m_derived==2);\n\n\t\t// verify shared_from_this\n\t\tBOOST_CHECK(d == raw_d->SharedPtr());\n\t}\n}\n\n// This test fails\nvoid test_fails(){\n\tstd::stringstream ss;\n\t{\n\t\tboost::shared_ptr<Base> b(new Derived());\n\t\tDerived* raw_d1 = static_cast<Derived*>(b.get());\n\t\traw_d1->m_base = 1;\n\t\traw_d1->m_derived = 2;\n\n\t\t// Get a raw pointer to Derived via shared_ptr<Base>\n\t\tDerived* raw_d = static_cast<Derived*>(b.get());\n\n\t\t// Verify base and derived members\n\t\tBOOST_CHECK(raw_d->m_base==1);\n\t\tBOOST_CHECK(raw_d->m_derived==2);\n\n\t\t// verify shared_from_this\n\t\tboost::shared_ptr<Derived> d = raw_d->SharedPtr();\n\t\tBOOST_CHECK(d == b);\n\t\t// Serialize the vector\n\t\tboost::archive::text_oarchive oa(ss);\n\t\toa & BOOST_SERIALIZATION_NVP(b);\n\t}\n\t{\n\t\t// Deserialize it back into a vector of shared_ptr<Base>\n\t\tss.seekg(0);\n\t\tboost::archive::text_iarchive ia(ss);\n\t\tboost::shared_ptr<Base> b;\n\t\tia & BOOST_SERIALIZATION_NVP(b);\n\n\t\t// Get a raw pointer to Derived via shared_ptr<Base>\n\t\tDerived* raw_d = static_cast<Derived*>(b.get());\n\t\t// Verify base and derived members\n\t\tBOOST_CHECK(raw_d->m_base==1);\n\t\tBOOST_CHECK(raw_d->m_derived==2);\n\n\t\t// verify shared_from_this\n\t\t// FAIL: The following line throws bad_weak_ptr exception\n\t\tboost::shared_ptr<Derived> d = raw_d->SharedPtr();\n\t\tBOOST_CHECK(d == b);\n\t}\n}\n\nint test_main(int /*argc*/, char * /*argv */[]){\n    test_fails();\n    test_passes();\n    return EXIT_SUCCESS;\n}\n\n// EOF\n"
  },
  {
    "path": "test/test_exported.cpp",
    "content": "/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// test_exported.cpp\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n// should pass compilation and execution\n\n#include <cstddef>\n#include <fstream>\n\n#include <boost/config.hpp>\n#include <cstdio> // remove\n#if defined(BOOST_NO_STDC_NAMESPACE)\nnamespace std{\n    using ::remove;\n}\n#endif\n\n#include <boost/serialization/type_info_implementation.hpp>\n#include <boost/serialization/export.hpp>\n#include <boost/serialization/base_object.hpp>\n\n#include \"test_tools.hpp\"\n\n#include <boost/archive/polymorphic_oarchive.hpp>\n#include <boost/archive/polymorphic_iarchive.hpp>\n\n#include \"polymorphic_derived1.hpp\"\n#include \"polymorphic_derived2.hpp\"\n\n// save exported polymorphic class\nvoid save_exported(const char *testfile)\n{\n    test_ostream os(testfile, TEST_STREAM_FLAGS);\n    test_oarchive oa_implementation(os, TEST_ARCHIVE_FLAGS);\n    boost::archive::polymorphic_oarchive & oa_interface = oa_implementation;\n\n    const polymorphic_base *rb1 = new polymorphic_derived1;\n    const polymorphic_base *rb2 = new polymorphic_derived2;\n\n    // export will permit correct serialization\n    // through a pointer to a base class\n    std::cout << \"saving polymorphic_derived1 (no_rtti)\\n\";\n    oa_interface << BOOST_SERIALIZATION_NVP(rb1);\n\n    std::cout << \"saving polymorphic_derived2\\n\";\n    oa_interface << BOOST_SERIALIZATION_NVP(rb2);\n\n    delete rb1;\n    delete rb2;\n}\n\n// save exported polymorphic class\nvoid load_exported(const char *testfile)\n{\n    test_istream is(testfile, TEST_STREAM_FLAGS);\n    test_iarchive  ia_implementation(is, TEST_ARCHIVE_FLAGS);\n    boost::archive::polymorphic_iarchive & ia_interface = ia_implementation;\n\n    polymorphic_base *rb1 = NULL;\n    polymorphic_base *rb2 = NULL;\n\n    // export will permit correct serialization\n    // through a pointer to a base class\n    ia_interface >> BOOST_SERIALIZATION_NVP(rb1);\n    BOOST_CHECK_MESSAGE(\n        boost::serialization::type_info_implementation<polymorphic_derived1>\n            ::type::get_const_instance()\n        ==\n        * boost::serialization::type_info_implementation<polymorphic_base>\n            ::type::get_const_instance().get_derived_extended_type_info(*rb1),\n        \"restored pointer b1 not of correct type\"\n    );\n\n    ia_interface >> BOOST_SERIALIZATION_NVP(rb2);\n    BOOST_CHECK_MESSAGE(\n        boost::serialization::type_info_implementation<polymorphic_derived2>\n            ::type::get_const_instance()\n        ==\n        * boost::serialization::type_info_implementation<polymorphic_base>\n            ::type::get_const_instance().get_derived_extended_type_info(*rb2),\n        \"restored pointer b2 not of correct type\"\n    );\n\n    delete rb1;\n    delete rb2;\n}\n\nint\ntest_main( int /* argc */, char* /* argv */[] )\n{\n    const char * testfile = boost::archive::tmpnam(NULL);\n    BOOST_REQUIRE(NULL != testfile);\n\n    save_exported(testfile);\n    load_exported(testfile);\n    std::remove(testfile);\n    return EXIT_SUCCESS;\n}\n\n// EOF\n"
  },
  {
    "path": "test/test_forward_list.cpp",
    "content": "/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// test_forward_list.cpp\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n// should pass compilation and execution\n\n#include <cstddef> // NULL\n#include <fstream>\n#include <cstdio> // remove\n#if defined(BOOST_NO_STDC_NAMESPACE)\nnamespace std{\n    using ::remove;\n}\n#endif\n\n#include <boost/config.hpp>\n#include <boost/serialization/forward_list.hpp>\n\n#include <boost/archive/archive_exception.hpp>\n#include \"test_tools.hpp\"\n\n#include \"A.hpp\"\n#include \"A.ipp\"\n\nint test_main( int /* argc */, char* /* argv */[] )\n{\n    const char * testfile = boost::archive::tmpnam(NULL);\n    std::forward_list<A> aslist;\n    aslist.push_front(A());\n    aslist.push_front(A());\n    {\n        test_ostream os(testfile, TEST_STREAM_FLAGS);\n        test_oarchive oa(os, TEST_ARCHIVE_FLAGS);\n        oa << boost::serialization::make_nvp(\"aslist\", aslist);\n    }\n    std::forward_list<A> aslist1;{\n        test_istream is(testfile, TEST_STREAM_FLAGS);\n        test_iarchive ia(is, TEST_ARCHIVE_FLAGS);\n        ia >> boost::serialization::make_nvp(\"aslist\", aslist1);\n    }\n    BOOST_CHECK(aslist == aslist1);\n    std::remove(testfile);\n    return EXIT_SUCCESS;\n}\n\n// EOF\n\n"
  },
  {
    "path": "test/test_forward_list_ptrs.cpp",
    "content": "/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// test_list.cpp\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n// should pass compilation and execution\n\n#include <cstddef>\n#include <fstream>\n\n#include <boost/config.hpp>\n#include <cstdio> // remove\n#if defined(BOOST_NO_STDC_NAMESPACE)\nnamespace std{\n    using ::remove;\n}\n#endif\n\n#include <boost/type_traits/is_pointer.hpp>\n#include <boost/static_assert.hpp>\n#include <boost/checked_delete.hpp>\n\n#include <boost/archive/archive_exception.hpp>\n#include \"test_tools.hpp\"\n\n#include <boost/serialization/nvp.hpp>\n\n#include \"A.hpp\"\n#include \"A.ipp\"\n\ntemplate<class T>\nstruct ptr_equal_to {\n    BOOST_STATIC_ASSERT(::boost::is_pointer< T >::value);\n    bool operator()(T const _Left, T const _Right) const\n    {\n        if(NULL == _Left && NULL == _Right)\n            return true;\n        if(typeid(*_Left) != typeid(*_Right))\n            return false;\n        return *_Left == *_Right;\n    }\n};\n\n#include <boost/serialization/forward_list.hpp>\nvoid test_forward_list(){\n    const char * testfile = boost::archive::tmpnam(NULL);\n    BOOST_REQUIRE(NULL != testfile);\n\n    std::forward_list<A *> aslist;\n    {\n        test_ostream os(testfile, TEST_STREAM_FLAGS);\n        test_oarchive oa(os, TEST_ARCHIVE_FLAGS);\n        aslist.push_front(new A);\n        aslist.push_front(new A);\n        oa << boost::serialization::make_nvp(\"aslist\", aslist);\n    }\n    std::forward_list<A *> aslist1;\n    {\n        test_istream is(testfile, TEST_STREAM_FLAGS);\n        test_iarchive ia(is, TEST_ARCHIVE_FLAGS);\n        ia >> boost::serialization::make_nvp(\"aslist\", aslist1);\n        BOOST_CHECK(\n            std::equal(\n                aslist.begin(),\n                aslist.end(),\n                aslist1.begin(),\n                ptr_equal_to<A *>()\n            )\n        );\n    }\n    std::for_each(\n        aslist.begin(),\n        aslist.end(),\n        boost::checked_deleter<A>()\n    );\n    std::for_each(\n        aslist1.begin(),\n        aslist1.end(),\n        boost::checked_deleter<A>()\n    );\n    std::remove(testfile);\n}\n\nint test_main( int /* argc */, char* /* argv */[] )\n{\n    test_forward_list();\n\n    return EXIT_SUCCESS;\n}\n\n// EOF\n"
  },
  {
    "path": "test/test_helper_support.cpp",
    "content": "/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// test_helper_support.cpp\n\n// (C) Copyright 2008 Joaquin M Lopez Munoz.\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n// should pass compilation and execution\n\n#include <algorithm>\n#include <cstddef>\n#include <fstream>\n\n#include <cstdio> // remove\n#include <boost/config.hpp>\n#if defined(BOOST_NO_STDC_NAMESPACE)\nnamespace std{\n    using ::remove;\n}\n#endif\n\n#include \"test_tools.hpp\"\n#include <boost/serialization/split_free.hpp>\n#include <boost/serialization/vector.hpp>\n#include <string>\n#include <vector>\n\n// this test uses a special string (my_string) whose contents are shared\n// and hence saved in the archive only once.  We need a helper in order\n// to convert my_string into a serializable type\n\nclass my_string:public std::string\n{\n    typedef std::string super;\n\npublic:\n    my_string(){}\n    my_string(const super & str): super(str){}\n    my_string & operator=(const super& rhs) {\n      super::operator=(rhs);\n      return *this;\n    }\n};\n\nstruct my_string_helper\n{\n  typedef std::vector<my_string> table;\n  table m_t;\n};\n\nBOOST_SERIALIZATION_SPLIT_FREE(my_string)\n\nnamespace boost {\nnamespace serialization {\n\ntemplate<class Archive>\nvoid save(Archive & ar, const my_string & str, const unsigned int /* version */)\n{\n    void (* const idx)(Archive &, const my_string &, const unsigned int) = & save;\n    void * const id = reinterpret_cast<void * const>(idx);\n    my_string_helper & msh = ar.template get_helper<my_string_helper>(id);\n\n    my_string_helper::table t = msh.m_t;\n    my_string_helper::table::iterator it = std::find(t.begin(), t.end(), str);\n    if(it == t.end()){\n        my_string_helper::table::size_type s = t.size();\n        ar << make_nvp(\"index\", s);\n        t.push_back(str);\n        ar << make_nvp(\"string\", static_cast<const std::string &>(str));\n    }\n    else{\n        my_string_helper::table::size_type s = it - t.begin();\n        ar << make_nvp(\"index\", s);\n    }\n}\n\ntemplate<class Archive>\nvoid load(Archive & ar, my_string & str, const unsigned int /* version */)\n{\n    void (* const idx)(Archive &, my_string &, const unsigned int) = & load;\n    void * const id = reinterpret_cast<void * const>(idx);\n    my_string_helper & msh = ar.template get_helper<my_string_helper>(id);\n\n    my_string_helper::table t = msh.m_t;\n\n    my_string_helper::table::size_type s;\n    ar >> make_nvp(\"index\", s);\n    t.reserve(s);\n    if(s >= t.size()){\n        std::string tmp;\n        ar >> make_nvp(\"string\", tmp);\n        str = tmp;\n        t.push_back(str);\n    }\n    else{\n        str = t[s];\n    }\n}\n\n} // namespace serialization\n} // namespace boost\n\nint test_main( int /* argc */, char* /* argv */[] ){\n    const char * testfile = boost::archive::tmpnam(NULL);\n    BOOST_REQUIRE(NULL != testfile);\n\n    std::vector<my_string> v1;\n    for(int i=0; i<1000; ++i){\n        char sbuffer[10];\n        std::snprintf(sbuffer, sizeof(sbuffer), \"%i\", i % 100);\n        v1.push_back(my_string(sbuffer));\n    }\n    {\n        test_ostream os(testfile, TEST_STREAM_FLAGS);\n        test_oarchive oa(os, TEST_ARCHIVE_FLAGS);\n        oa << boost::serialization::make_nvp(\"vector\", v1);\n    }\n    {\n        std::vector<my_string> v2;\n        test_istream is(testfile, TEST_STREAM_FLAGS);\n        test_iarchive ia(is, TEST_ARCHIVE_FLAGS);\n        ia >> boost::serialization::make_nvp(\"vector\", v2);\n        BOOST_CHECK(v1 == v2);\n    }\n    std::remove(testfile);\n    return EXIT_SUCCESS;\n}\n\n// EOF\n"
  },
  {
    "path": "test/test_inclusion.cpp",
    "content": "/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// test_const.cpp\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n#include <boost/serialization/access.hpp>\n#include <boost/serialization/base_object.hpp>\n#include <boost/serialization/export.hpp>\n#include <boost/serialization/level.hpp>\n#include <boost/serialization/level_enum.hpp>\n#include <boost/serialization/nvp.hpp>\n#include <boost/serialization/split_free.hpp>\n#include <boost/serialization/split_member.hpp>\n#include <boost/serialization/tracking.hpp>\n#include <boost/serialization/tracking_enum.hpp>\n#include <boost/serialization/traits.hpp>\n#include <boost/serialization/type_info_implementation.hpp>\n#include <boost/serialization/singleton.hpp>\n\nstruct foo\n{\n    int x;\nprivate:\n    friend class boost::serialization::access;\n\n    template<class Archive>\n    void serialize(Archive & ar, const unsigned int version)\n    {\n        // In compilers implementing 2-phase lookup, the call to\n        // make_nvp is resolved even if foo::serialize() is never\n        // instantiated.\n        ar & boost::serialization::make_nvp(\"x\",x);\n    }\n};\n\nint\nmain(int /*argc*/, char * /*argv*/[]){\n    return 0;\n}\n"
  },
  {
    "path": "test/test_inclusion2.cpp",
    "content": "/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// test_const.cpp\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n#include <boost/archive/binary_iarchive.hpp>\n#include <boost/serialization/vector.hpp>\n#include <sstream>\n#include <vector>\n\nvoid f()\n{\n  std::stringstream iss;\n  boost::archive::binary_iarchive ar(iss);\n  std::vector<int> out;\n  ar >> out;\n}\n\nint\nmain(int /*argc*/, char * /*argv*/[]){\n  return 0;\n}\n"
  },
  {
    "path": "test/test_interators.cpp",
    "content": ""
  },
  {
    "path": "test/test_interrupts.cpp",
    "content": "/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// test_array.cpp\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n// should pass compilation and execution\n\n#include <stdlib.h>\n\n#include <boost/config.hpp>\n#include <cstddef>\n#include <fstream>\n#include <algorithm> // equal\n#include <cstdio> // remove\n#if defined(BOOST_NO_STDC_NAMESPACE)\nnamespace std{\n    using ::remove;\n}\n#endif\n\n#include \"test_tools.hpp\"\n#include <boost/serialization/nvp.hpp>\n#include <boost/serialization/split_member.hpp>\n#include <boost/core/no_exceptions_support.hpp>\n#include <boost/archive/archive_exception.hpp>\n\nstruct test_dummy_out {\n    template<class Archive>\n    void save(Archive &, const unsigned int /*version*/) const {\n        throw boost::archive::archive_exception(\n            boost::archive::archive_exception::other_exception\n        );\n    }\n    template<class Archive>\n    void load(Archive & ar, const unsigned int version){\n    }\n    BOOST_SERIALIZATION_SPLIT_MEMBER()\n    test_dummy_out(){}\n};\n\ntemplate<class T>\nint test_out(){\n    const char * testfile = boost::archive::tmpnam(NULL);\n    BOOST_REQUIRE(NULL != testfile);\n\n    const T t;\n    {\n        test_ostream os(testfile, TEST_STREAM_FLAGS);\n        {\n            BOOST_TRY {\n                test_oarchive oa(os, TEST_ARCHIVE_FLAGS);\n                bool exception_invoked = false;\n                BOOST_TRY {\n                    oa << BOOST_SERIALIZATION_NVP(t);\n                }\n                BOOST_CATCH (boost::archive::archive_exception const& ae){\n                    BOOST_CHECK(\n                        boost::archive::archive_exception::other_exception\n                        == ae.code\n                    );\n                    exception_invoked = true;\n                }\n                BOOST_CATCH_END\n                BOOST_CHECK(exception_invoked);\n            }\n            BOOST_CATCH (boost::archive::archive_exception const& ae){}\n            BOOST_CATCH_END\n        }\n        os.close();\n    }\n    std::remove(testfile);\n    return EXIT_SUCCESS;\n}\n\nstruct test_dummy_in {\n    template<class Archive>\n    void save(Archive & /* ar */, const unsigned int /*version*/) const {\n    }\n    template<class Archive>\n    void load(Archive & /* ar */, const unsigned int /*version*/){\n        throw boost::archive::archive_exception(\n            boost::archive::archive_exception::other_exception\n        );\n    }\n    BOOST_SERIALIZATION_SPLIT_MEMBER()\n    test_dummy_in(){}\n};\n\ntemplate<class T>\nint test_in(){\n    const char * testfile = boost::archive::tmpnam(NULL);\n    BOOST_REQUIRE(NULL != testfile);\n\n    const T t;\n    {\n        test_ostream os(testfile, TEST_STREAM_FLAGS);\n        {\n            test_oarchive oa(os, TEST_ARCHIVE_FLAGS);\n            oa << BOOST_SERIALIZATION_NVP(t);\n        }\n        os.close();\n    }\n    {\n        test_istream is(testfile, TEST_STREAM_FLAGS);\n        {\n            T t1;\n            BOOST_TRY {\n                test_iarchive ia(is, TEST_ARCHIVE_FLAGS);\n                bool exception_invoked = false;\n                BOOST_TRY {\n                    ia >> BOOST_SERIALIZATION_NVP(t1);\n                }\n                BOOST_CATCH (boost::archive::archive_exception const& ae){\n                    BOOST_CHECK(\n                        boost::archive::archive_exception::other_exception\n                        == ae.code\n                    );\n                    exception_invoked = true;\n                }\n                BOOST_CATCH_END\n                BOOST_CHECK(exception_invoked);\n            }\n            BOOST_CATCH (boost::archive::archive_exception const& ae){}\n            BOOST_CATCH_END\n        }\n        is.close();\n    }\n    std::remove(testfile);\n    return EXIT_SUCCESS;\n}\n\nint test_main( int /* argc */, char* /* argv */[] )\n{\n    int res;\n    res = test_out<test_dummy_out>();\n    if (res != EXIT_SUCCESS)\n        return EXIT_FAILURE;\n    res = test_in<test_dummy_in>();\n    if (res != EXIT_SUCCESS)\n        return EXIT_FAILURE;\n    return EXIT_SUCCESS;\n}\n\n// EOF\n"
  },
  {
    "path": "test/test_iterators.cpp",
    "content": "/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// test_iterators.cpp\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n#include <vector>\n#include <cstdlib> // for rand\n#include <functional>\n#include <sstream> // used to test stream iterators\n#include <clocale>\n#include <iterator> // begin\n#include <locale> // setlocale\n\n#include <boost/config.hpp>\n#ifdef BOOST_NO_STDC_NAMESPACE\nnamespace std{\n    using ::rand;\n}\n#endif\n\n#include <boost/detail/workaround.hpp>\n#if BOOST_WORKAROUND(BOOST_DINKUMWARE_STDLIB, == 1)\n#include <boost/archive/dinkumware.hpp>\n#endif\n\n#ifndef BOOST_NO_CWCHAR\n#include <boost/archive/iterators/mb_from_wchar.hpp>\n#include <boost/archive/iterators/wchar_from_mb.hpp>\n#endif\n#include <boost/archive/iterators/xml_escape.hpp>\n#include <boost/archive/iterators/xml_unescape.hpp>\n#include <boost/archive/iterators/transform_width.hpp>\n#include <boost/archive/iterators/istream_iterator.hpp>\n#include <boost/archive/iterators/ostream_iterator.hpp>\n\n#include \"test_tools.hpp\"\n\n#ifndef BOOST_NO_CWCHAR\n\nvoid test_wchar_from_mb(const wchar_t *la, const char * a, const unsigned int size){\n    typedef boost::archive::iterators::wchar_from_mb<const char *> translator;\n    BOOST_CHECK((\n        std::equal(\n            translator(a),\n            translator(a + size),\n            la\n        )\n    ));\n}\n\nvoid test_mb_from_wchar(const char * a, const wchar_t *la, const unsigned int size){\n    typedef boost::archive::iterators::mb_from_wchar<const wchar_t *> translator;\n    BOOST_CHECK(\n        std::equal(\n            translator(la),\n            translator(la + size),\n            a\n        )\n    );\n}\n\nvoid test_roundtrip(const wchar_t * la){\n    std::size_t s = std::wcslen(la);\n    std::vector<char> a;\n    {\n        typedef boost::archive::iterators::mb_from_wchar<const wchar_t *> translator;\n        std::copy(\n            translator(la),\n            translator(la + s),\n            std::back_inserter(a)\n        );\n        // note: wchar_from_mb NEEDS a termination null in order to function!\n        a.push_back(static_cast<char>(0));\n    }\n    BOOST_CHECK(a.size() > 0);\n    std::vector<wchar_t> la2;\n    {\n        typedef boost::archive::iterators::wchar_from_mb<std::vector<char>::const_iterator> translator;\n        std::copy(\n            translator(a.begin()),\n            translator(),\n            std::back_inserter(la2)\n        );\n    }\n    BOOST_CHECK(la2.size() == s);\n    BOOST_CHECK(std::equal(la, la + s, la2.begin()));\n}\n#endif\n\ntemplate<class CharType>\nvoid test_xml_escape(\n    const CharType * xml_escaped,\n    const CharType * xml,\n    unsigned int size\n){\n    typedef boost::archive::iterators::xml_escape<const CharType *> translator;\n\n    BOOST_CHECK(\n        std::equal(\n            translator(xml),\n            translator(xml + size),\n            xml_escaped\n        )\n    );\n}\n\ntemplate<class CharType>\nvoid test_xml_unescape(\n    const CharType * xml,\n    const CharType * xml_escaped,\n    unsigned int size\n){\n\n    // test xml_unescape\n    typedef boost::archive::iterators::xml_unescape<const CharType *> translator;\n\n    BOOST_CHECK(\n        std::equal(\n            translator(xml_escaped),\n            translator(xml_escaped + size),\n            xml\n        )\n    );\n}\n\ntemplate<int BitsOut, int BitsIn>\nvoid test_transform_width(unsigned int size){\n    // test transform_width\n    char rawdata[8];\n\n    char * rptr;\n    for(rptr = rawdata + size; rptr-- > rawdata;)\n        *rptr = static_cast<char>(0xff & std::rand());\n\n    // convert 8 to 6 bit characters\n    typedef boost::archive::iterators::transform_width<\n        char *, BitsOut, BitsIn\n    > translator1;\n\n    std::vector<char> vout;\n\n    std::copy(\n        translator1(static_cast<char *>(rawdata)),\n        translator1(rawdata + size),\n        std::back_inserter(vout)\n    );\n\n    // check to see we got the expected # of characters out\n    if(0 ==  size)\n        BOOST_CHECK(vout.size() == 0);\n    else\n        BOOST_CHECK(vout.size() == (size * BitsIn - 1 ) / BitsOut + 1);\n\n    typedef boost::archive::iterators::transform_width<\n        std::vector<char>::iterator, BitsIn, BitsOut\n    > translator2;\n\n    std::vector<char> vin;\n    std::copy(\n        translator2(vout.begin()),\n        translator2(vout.end()),\n        std::back_inserter(vin)\n    );\n\n    // check to see we got the expected # of characters out\n    BOOST_CHECK(vin.size() == size);\n\n    BOOST_CHECK(\n        std::equal(\n            rawdata,\n            rawdata + size,\n            vin.begin()\n        )\n    );\n}\n\ntemplate<class CharType>\nvoid test_stream_iterators(\n    const CharType * test_data,\n    unsigned int size\n){\n    std::basic_stringstream<CharType> ss;\n    boost::archive::iterators::ostream_iterator<CharType> osi =\n        boost::archive::iterators::ostream_iterator<CharType>(ss);\n    std::copy(test_data, test_data + size, osi);\n    ss.flush();\n\n    BOOST_CHECK(size == ss.str().size());\n\n    boost::archive::iterators::istream_iterator<CharType> isi =\n        boost::archive::iterators::istream_iterator<CharType>(ss);\n    BOOST_CHECK(std::equal(test_data, test_data + size,isi));\n}\n\nint\ntest_main(int /* argc */, char* /* argv */ [] )\n{\n    const char xml[] = \"<+>+&+\\\"+'\";\n    const char xml_escaped[] = \"&lt;+&gt;+&amp;+&quot;+&apos;\";\n    test_xml_escape<const char>(\n        xml_escaped,\n        xml,\n        sizeof(xml) / sizeof(char) - 1\n    );\n    test_xml_unescape<const char>(\n        xml,\n        xml_escaped,\n        sizeof(xml_escaped) / sizeof(char) - 1\n    );\n\n\n    #ifndef BOOST_NO_CWCHAR\n    const wchar_t wxml[] = L\"<+>+&+\\\"+'\";\n    const wchar_t wxml_escaped[] = L\"&lt;+&gt;+&amp;+&quot;+&apos;\";\n    test_xml_escape<const wchar_t>(\n        wxml_escaped,\n        wxml,\n        sizeof(wxml) / sizeof(wchar_t) - 1\n    );\n    test_xml_unescape<const wchar_t>(\n        wxml,\n        wxml_escaped,\n        sizeof(wxml_escaped) / sizeof(wchar_t) - 1\n    );\n\n    const char b[] = \"abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz\";\n    const wchar_t lb[] = L\"abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz\";\n    test_mb_from_wchar(b, lb, sizeof(lb) / sizeof(wchar_t) - 1);\n    test_wchar_from_mb(lb, b, sizeof(b) / sizeof(char) - 1);\n\n    const char a[] = \"abcdefghijklmnopqrstuvwxyz\";\n    const wchar_t la[] = L\"abcdefghijklmnopqrstuvwxyz\";\n    test_mb_from_wchar(a, la, sizeof(la) / sizeof(wchar_t) - 1);\n    test_wchar_from_mb(la, a, sizeof(a) / sizeof(char) - 1);\n\n    test_roundtrip(L\"z\\u00df\\u6c34\\U0001f34c\");\n\n    test_stream_iterators<wchar_t>(la, sizeof(la)/sizeof(wchar_t) - 1);\n    #endif\n\n    test_stream_iterators<char>(a, sizeof(a) - 1);\n\n    test_transform_width<6, 8>(0);\n    test_transform_width<6, 8>(1);\n    test_transform_width<6, 8>(2);\n    test_transform_width<6, 8>(3);\n    test_transform_width<6, 8>(4);\n    test_transform_width<6, 8>(5);\n    test_transform_width<6, 8>(6);\n    test_transform_width<6, 8>(7);\n    test_transform_width<6, 8>(8);\n\n    return EXIT_SUCCESS;\n}\n"
  },
  {
    "path": "test/test_iterators_base64.cpp",
    "content": "/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// test_iterators.cpp\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n#include <algorithm>\n#include <list>\n\n#if (defined _MSC_VER) && (_MSC_VER == 1200)\n#  pragma warning (disable : 4786) // too long name, harmless warning\n#endif\n\n#include <cstdlib>\n#include <cstddef> // size_t\n\n#include <boost/config.hpp>\n#ifdef BOOST_NO_STDC_NAMESPACE\nnamespace std{\n    using ::rand;\n    using ::size_t;\n}\n#endif\n\n#include <boost/archive/iterators/binary_from_base64.hpp>\n#include <boost/archive/iterators/base64_from_binary.hpp>\n#include <boost/archive/iterators/insert_linebreaks.hpp>\n#include <boost/archive/iterators/remove_whitespace.hpp>\n#include <boost/archive/iterators/transform_width.hpp>\n\n#include \"test_tools.hpp\"\n\n#include <iostream>\n\ntemplate<typename CharType>\nvoid test_base64(unsigned int size){\n    CharType rawdata[150];\n    CharType * rptr;\n    for(rptr = rawdata + size; rptr-- > rawdata;)\n        *rptr = static_cast<CharType>(std::rand()& 0xff);\n\n    // convert to base64\n    typedef std::list<CharType> text_base64_type;\n    text_base64_type text_base64;\n\n    typedef\n        boost::archive::iterators::insert_linebreaks<\n            boost::archive::iterators::base64_from_binary<\n                boost::archive::iterators::transform_width<\n                    CharType *\n                    ,6\n                    ,sizeof(CharType) * 8\n                >\n            >\n            ,76\n        >\n        translate_out;\n\n    std::copy(\n        translate_out(static_cast<CharType *>(rawdata)),\n        translate_out(rawdata + size),\n        std::back_inserter(text_base64)\n    );\n\n    // convert from base64 to binary and compare with the original\n    typedef\n        boost::archive::iterators::transform_width<\n            boost::archive::iterators::binary_from_base64<\n                boost::archive::iterators::remove_whitespace<\n                    typename text_base64_type::iterator\n                >\n            >,\n            sizeof(CharType) * 8,\n            6\n        > translate_in;\n\n    BOOST_CHECK(\n        std::equal(\n            rawdata,\n            rawdata + size,\n            translate_in(text_base64.begin())\n        )\n    );\n\n}\n\nint\ntest_main( int /*argc*/, char* /*argv*/[] )\n{\n    test_base64<char>(1);\n    test_base64<char>(2);\n    test_base64<char>(3);\n    test_base64<char>(4);\n    test_base64<char>(150);\n    #ifndef BOOST_NO_CWCHAR\n    test_base64<wchar_t>(1);\n    test_base64<wchar_t>(2);\n    test_base64<wchar_t>(3);\n    test_base64<wchar_t>(4);\n    test_base64<wchar_t>(150);\n    #endif\n    return EXIT_SUCCESS;\n}\n"
  },
  {
    "path": "test/test_list.cpp",
    "content": "/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// test_list.cpp\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n// should pass compilation and execution\n\n#include <cstddef> // NULL\n#include <fstream>\n\n#include <boost/config.hpp>\n#include <cstdio> // remove\n#if defined(BOOST_NO_STDC_NAMESPACE)\nnamespace std{\n    using ::remove;\n}\n#endif\n\n#include <boost/archive/archive_exception.hpp>\n#include \"test_tools.hpp\"\n\n#include \"A.hpp\"\n#include \"A.ipp\"\n\n#include <boost/serialization/list.hpp>\nvoid test_list(){\n    const char * testfile = boost::archive::tmpnam(NULL);\n    BOOST_REQUIRE(NULL != testfile);\n\n    std::list<A> alist;\n    alist.push_back(A());\n    alist.push_back(A());\n    {\n        test_ostream os(testfile, TEST_STREAM_FLAGS);\n        test_oarchive oa(os, TEST_ARCHIVE_FLAGS);\n        oa << boost::serialization::make_nvp(\"alist\",alist);\n    }\n\n    std::list<A> alist1;\n    {\n        test_istream is(testfile, TEST_STREAM_FLAGS);\n        test_iarchive ia(is, TEST_ARCHIVE_FLAGS);\n        ia >> boost::serialization::make_nvp(\"alist\",alist1);\n    }\n    BOOST_CHECK(alist == alist1);\n    std::remove(testfile);\n}\n\nint test_main( int /* argc */, char* /* argv */[] )\n{\n    test_list();\n    return EXIT_SUCCESS;\n}\n\n// EOF\n\n"
  },
  {
    "path": "test/test_list_ptrs.cpp",
    "content": "/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// test_list.cpp\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n// should pass compilation and execution\n\n#include <cstddef>\n#include <fstream>\n\n#include <boost/config.hpp>\n#include <cstdio> // remove\n#if defined(BOOST_NO_STDC_NAMESPACE)\nnamespace std{\n    using ::remove;\n}\n#endif\n\n#include <boost/type_traits/is_pointer.hpp>\n#include <boost/static_assert.hpp>\n#include <boost/checked_delete.hpp>\n\n#include <boost/archive/archive_exception.hpp>\n#include \"test_tools.hpp\"\n\n#include <boost/serialization/nvp.hpp>\n\n#include \"A.hpp\"\n#include \"A.ipp\"\n\ntemplate<class T>\nstruct ptr_equal_to {\n    BOOST_STATIC_ASSERT(::boost::is_pointer< T >::value);\n    bool operator()(T const _Left, T const _Right) const\n    {\n        if(NULL == _Left && NULL == _Right)\n            return true;\n        if(typeid(*_Left) != typeid(*_Right))\n            return false;\n        return *_Left == *_Right;\n    }\n};\n\n#include <boost/serialization/list.hpp>\nvoid test_list(){\n    const char * testfile = boost::archive::tmpnam(NULL);\n    BOOST_REQUIRE(NULL != testfile);\n\n    std::list<A *> alist;\n    {\n        test_ostream os(testfile, TEST_STREAM_FLAGS);\n        test_oarchive oa(os, TEST_ARCHIVE_FLAGS);\n        A * free_a_ptr = new A;\n        alist.push_back(free_a_ptr);\n        alist.push_back(new A);\n        // verify that first element is the same as the free pointer\n        BOOST_CHECK((*alist.begin()) == free_a_ptr);\n        oa << boost::serialization::make_nvp(\"alist\", alist);\n        oa << boost::serialization::make_nvp(\"free_a_ptr\", free_a_ptr);\n    }\n    std::list<A *> alist1;\n    {\n        test_istream is(testfile, TEST_STREAM_FLAGS);\n        test_iarchive ia(is, TEST_ARCHIVE_FLAGS);\n        A * free_a_ptr1;\n        ia >> boost::serialization::make_nvp(\"alist\", alist1);\n        ia >> boost::serialization::make_nvp(\"free_a_ptr\", free_a_ptr1);\n        BOOST_CHECK(\n            alist.size() == alist1.size()\n            && std::equal(alist.begin(),alist.end(),alist1.begin(),ptr_equal_to<A *>())\n        );\n        // verify that first element is the same as the free pointer\n        BOOST_CHECK((*alist1.begin()) == free_a_ptr1);\n    }\n\n    std::for_each(\n        alist.begin(),\n        alist.end(),\n        boost::checked_deleter<A>()\n    );\n    std::for_each(\n        alist1.begin(),\n        alist1.end(),\n        boost::checked_deleter<A>()\n    );\n    std::remove(testfile);\n}\n\nint test_main( int /* argc */, char* /* argv */[] )\n{\n    test_list();\n    return EXIT_SUCCESS;\n}\n\n// EOF\n"
  },
  {
    "path": "test/test_map.cpp",
    "content": "/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// test_map.cpp\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .\n// (C) Copyright 2014 Jim Bell\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n// should pass compilation and execution\n\n#include <algorithm> // std::copy\n#include <vector>\n#include <fstream>\n#include <cstddef> // size_t, NULL\n\n#include <boost/config.hpp>\n#include <boost/detail/workaround.hpp>\n\n#include <cstdio>\n#if defined(BOOST_NO_STDC_NAMESPACE)\nnamespace std{\n    using ::rand;\n    using ::size_t;\n}\n#endif\n\n#include \"test_tools.hpp\"\n\n#include <boost/serialization/nvp.hpp>\n#include <boost/serialization/map.hpp>\n\n#include \"A.hpp\"\n#include \"A.ipp\"\n\n///////////////////////////////////////////////////////\n// a key value initialized with a random value for use\n// in testing STL map serialization\nstruct random_key {\n    friend class boost::serialization::access;\n    template<class Archive>\n    void serialize(\n        Archive & ar,\n        const unsigned int /* file_version */\n    ){\n        ar & boost::serialization::make_nvp(\"random_key\", m_i);\n    }\n    int m_i;\n    random_key() : m_i(std::rand()){};\n    bool operator<(const random_key &rhs) const {\n        return m_i < rhs.m_i;\n    }\n    bool operator==(const random_key &rhs) const {\n        return m_i == rhs.m_i;\n    }\n    operator std::size_t () const {    // required by hash_map\n        return m_i;\n    }\n};\n\nvoid\ntest_map(){\n    const char * testfile = boost::archive::tmpnam(NULL);\n    BOOST_REQUIRE(NULL != testfile);\n\n    BOOST_MESSAGE(\"map\");\n    // test map of objects\n    std::map<random_key, A> amap;\n    amap.insert(std::make_pair(random_key(), A()));\n    amap.insert(std::make_pair(random_key(), A()));\n    {\n        test_ostream os(testfile, TEST_STREAM_FLAGS);\n        test_oarchive oa(os, TEST_ARCHIVE_FLAGS);\n        oa << boost::serialization::make_nvp(\"amap\", amap);\n    }\n    std::map<random_key, A> amap1;\n    {\n        test_istream is(testfile, TEST_STREAM_FLAGS);\n        test_iarchive ia(is, TEST_ARCHIVE_FLAGS);\n        ia >> boost::serialization::make_nvp(\"amap\", amap1);\n    }\n    BOOST_CHECK(amap == amap1);\n    std::remove(testfile);\n}\n\nvoid\ntest_map_2(){\n    const char * testfile = boost::archive::tmpnam(NULL);\n    BOOST_REQUIRE(NULL != testfile);\n\n    BOOST_MESSAGE(\"map_2\");\n    std::pair<int, int> a(11, 22);\n    std::map<int, int> b;\n    b[0] = 0;\n    b[-1] = -1;\n    b[1] = 1;\n    {\n        test_ostream os(testfile, TEST_STREAM_FLAGS);\n        std::pair<int, int> * const pa = &a;\n        std::map<int, int> * const pb = &b;\n        test_oarchive oa(os, TEST_ARCHIVE_FLAGS);\n        oa << BOOST_SERIALIZATION_NVP(pb);\n        oa << BOOST_SERIALIZATION_NVP(pa);\n    }\n    {\n        test_istream is(testfile, TEST_STREAM_FLAGS);\n        std::pair<int, int> *pa = 0;\n        std::map<int, int> *pb = 0;\n        test_iarchive ia(is, TEST_ARCHIVE_FLAGS);\n        ia >> BOOST_SERIALIZATION_NVP(pb);\n        ia >> BOOST_SERIALIZATION_NVP(pa);\n        delete pa;\n        delete pb;\n    }\n    std::remove(testfile);\n}\n\nvoid\ntest_multimap(){\n    const char * testfile = boost::archive::tmpnam(NULL);\n    BOOST_REQUIRE(NULL != testfile);\n\n    BOOST_MESSAGE(\"multimap\");\n    std::multimap<random_key, A> amultimap;\n    amultimap.insert(std::make_pair(random_key(), A()));\n    amultimap.insert(std::make_pair(random_key(), A()));\n    {\n        test_ostream os(testfile, TEST_STREAM_FLAGS);\n        test_oarchive oa(os, TEST_ARCHIVE_FLAGS);\n        oa << boost::serialization::make_nvp(\"amultimap\", amultimap);\n    }\n    std::multimap<random_key, A> amultimap1;\n    {\n        test_istream is(testfile, TEST_STREAM_FLAGS);\n        test_iarchive ia(is, TEST_ARCHIVE_FLAGS);\n        ia >> boost::serialization::make_nvp(\"amultimap\", amultimap1);\n    }\n    BOOST_CHECK(amultimap == amultimap1);\n    std::remove(testfile);\n}\n\nint test_main( int /* argc */, char* /* argv */[] )\n{\n    test_map();\n    test_map_2();\n    test_multimap();\n\n    return EXIT_SUCCESS;\n}\n"
  },
  {
    "path": "test/test_map_hashed.cpp",
    "content": "/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// test_map.cpp\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .\n// (C) Copyright 2014 Jim Bell\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n// should pass compilation and execution\n\n#include <cstddef> // NULL, size_t\n#include <cstdio> // remove\n#include <fstream>\n\n#include <algorithm> // std::copy\n#include <vector>\n\n#include <boost/config.hpp>\n\n#include <boost/detail/workaround.hpp>\n#if defined(BOOST_NO_STDC_NAMESPACE)\nnamespace std{\n    using ::rand;\n    using ::remove;\n    using ::size_t;\n}\n#endif\n\n#include \"test_tools.hpp\"\n\n#include <boost/serialization/nvp.hpp>\n#include <boost/serialization/hash_map.hpp>\n\n#include \"A.hpp\"\n#include \"A.ipp\"\n\n#ifndef BOOST_HAS_HASH\n#error \"BOOST_HAS_HASH not defined!\"\n#endif\n\n#include BOOST_HASH_MAP_HEADER\n\n///////////////////////////////////////////////////////\n// a key value initialized with a random value for use\n// in testing STL map serialization\nstruct random_key {\n    friend class boost::serialization::access;\n    template<class Archive>\n    void serialize(\n        Archive & ar,\n        const unsigned int /* file_version */\n    ){\n        ar & boost::serialization::make_nvp(\"random_key\", m_i);\n    }\n    int m_i;\n    random_key() : m_i(std::rand()){};\n    bool operator<(const random_key &rhs) const {\n        return m_i < rhs.m_i;\n    }\n    bool operator==(const random_key &rhs) const {\n        return m_i == rhs.m_i;\n    }\n    operator std::size_t () const {    // required by hash_map\n        return m_i;\n    }\n};\n\nnamespace BOOST_STD_EXTENSION_NAMESPACE {\n    template<>\n    struct hash<random_key>{\n        std::size_t operator()(const random_key& r) const {\n            return static_cast<std::size_t>(r);\n        }\n    };\n} // namespace BOOST_STD_EXTENSION_NAMESPACE\n\nvoid\ntest_hash_map(){\n    const char * testfile = boost::archive::tmpnam(NULL);\n    BOOST_REQUIRE(NULL != testfile);\n\n    BOOST_CHECKPOINT(\"hash_map\");\n    // test hash_map of objects\n    BOOST_STD_EXTENSION_NAMESPACE::hash_map<random_key, A> ahash_map;\n    ahash_map.insert(std::make_pair(random_key(), A()));\n    ahash_map.insert(std::make_pair(random_key(), A()));\n    {\n        test_ostream os(testfile, TEST_STREAM_FLAGS);\n        test_oarchive oa(os, TEST_ARCHIVE_FLAGS);\n        oa << boost::serialization::make_nvp(\"ahashmap\",ahash_map);\n    }\n    BOOST_STD_EXTENSION_NAMESPACE::hash_map<random_key, A> ahash_map1;\n    {\n        test_istream is(testfile, TEST_STREAM_FLAGS);\n        test_iarchive ia(is, TEST_ARCHIVE_FLAGS);\n        ia >> boost::serialization::make_nvp(\"ahashmap\",ahash_map1);\n    }\n\n    std::vector< std::pair<random_key, A> > tvec, tvec1;\n    std::copy(ahash_map.begin(), ahash_map.end(), std::back_inserter(tvec));\n    std::sort(tvec.begin(), tvec.end());\n    std::copy(ahash_map1.begin(), ahash_map1.end(), std::back_inserter(tvec1));\n    std::sort(tvec1.begin(), tvec1.end());\n    BOOST_CHECK(tvec == tvec1);\n\n    std::remove(testfile);\n}\n\nvoid\ntest_hash_multimap(){\n    const char * testfile = boost::archive::tmpnam(NULL);\n    BOOST_REQUIRE(NULL != testfile);\n\n    BOOST_CHECKPOINT(\"hash_multimap\");\n    BOOST_STD_EXTENSION_NAMESPACE::hash_multimap<random_key, A> ahash_multimap;\n    ahash_multimap.insert(std::make_pair(random_key(), A()));\n    ahash_multimap.insert(std::make_pair(random_key(), A()));\n    {\n        test_ostream os(testfile, TEST_STREAM_FLAGS);\n        test_oarchive oa(os, TEST_ARCHIVE_FLAGS);\n        oa << boost::serialization::make_nvp(\"ahash_multimap\", ahash_multimap);\n    }\n    BOOST_STD_EXTENSION_NAMESPACE::hash_multimap<random_key, A> ahash_multimap1;\n    {\n        test_istream is(testfile, TEST_STREAM_FLAGS);\n        test_iarchive ia(is, TEST_ARCHIVE_FLAGS);\n        ia >> boost::serialization::make_nvp(\"ahash_multimap\", ahash_multimap1);\n    }\n    std::vector< std::pair<random_key, A> > tvec, tvec1;\n    tvec.clear();\n    tvec1.clear();\n    std::copy(ahash_multimap.begin(), ahash_multimap.end(), std::back_inserter(tvec));\n    std::sort(tvec.begin(), tvec.end());\n    std::copy(ahash_multimap1.begin(), ahash_multimap1.end(), std::back_inserter(tvec1));\n    std::sort(tvec1.begin(), tvec1.end());\n    BOOST_CHECK(tvec == tvec1);\n    std::remove(testfile);\n}\nint test_main( int /* argc */, char* /* argv */[] )\n{\n    test_hash_map();\n    test_hash_multimap();\n    return EXIT_SUCCESS;\n}\n"
  },
  {
    "path": "test/test_mi.cpp",
    "content": "/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// test_mi.cpp\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n// test of serialization of base classes with multiple inheritance\n// contributed by Peter Dimov\n\n#include <cstddef>\n#include <iostream>\n#include <fstream>\n\n#include <boost/config.hpp>\n#include <cstdio> // remove\n#if defined(BOOST_NO_STDC_NAMESPACE)\nnamespace std{\n    using ::remove;\n}\n#endif\n\n#include \"test_tools.hpp\"\n\n#include <boost/serialization/nvp.hpp>\n#include <boost/serialization/base_object.hpp>\n\nclass A\n{\nprivate:\n    friend class boost::serialization::access;\n    int x;\n    template<class Archive>\n    void serialize(Archive &ar, const unsigned int /* file_version */){\n        ar & BOOST_SERIALIZATION_NVP(x);\n    }\npublic:\n    explicit A(int x = 0): x(x) {}\n    virtual ~A(); // = 0;\n    int get_x() const\n    {\n        return x;\n    }\n};\n\ninline A::~A()\n{\n}\n\nclass B\n{\nprivate:\n    int y;\n    friend class boost::serialization::access;\n    template<class Archive>\n    void serialize(Archive &ar, const unsigned int /* file_version */){\n        ar & BOOST_SERIALIZATION_NVP(y);\n    }\npublic:\n    explicit B(int y = 0): y(y) {}\n    virtual ~B(){}\n    int get_y() const\n    {\n        return y;\n    }\n};\n\nclass C: public A, public B\n{\nprivate:\n    friend class boost::serialization::access;\n    template<class Archive>\n    void serialize(Archive &ar, const unsigned int /* file_version */){\n        ar & BOOST_SERIALIZATION_BASE_OBJECT_NVP(A);\n        ar & BOOST_SERIALIZATION_BASE_OBJECT_NVP(B);\n    }\npublic:\n    C(){}\n    C(int x, int y): A(x), B(y){}\n};\n\nint\ntest_main( int /* argc */, char* /* argv */[] )\n{\n    const char * testfile = boost::archive::tmpnam(NULL);\n    BOOST_REQUIRE(NULL != testfile);\n\n    C * pc = new C(1, 2);\n    A * pa = pc;\n    B * pb = pc;\n\n    BOOST_CHECK(pa == pc);\n    BOOST_CHECK(pb == pc);\n\n    int x = pa->get_x();\n    int y = pb->get_y();\n\n    std::cout << \"pa->get_x(): \" << pa->get_x() << std::endl;\n    std::cout << \"pb->get_y(): \" << pb->get_y() << std::endl;\n\n    {\n        test_ostream ofs(testfile, TEST_STREAM_FLAGS);\n        test_oarchive oa(ofs);\n        oa << BOOST_SERIALIZATION_NVP(pc);\n        oa << BOOST_SERIALIZATION_NVP(pa);\n        oa << BOOST_SERIALIZATION_NVP(pb);\n    }\n\n    delete pc;\n    pc = NULL;\n    pa = NULL;\n    pb = NULL;\n\n    {\n        test_istream ifs(testfile, TEST_STREAM_FLAGS);\n        test_iarchive ia(ifs);\n        ia >> BOOST_SERIALIZATION_NVP(pc);\n        ia >> BOOST_SERIALIZATION_NVP(pa);\n        ia >> BOOST_SERIALIZATION_NVP(pb);\n    }\n\n    BOOST_CHECK(pa == pc);\n    BOOST_CHECK(pb == pc);\n\n    BOOST_CHECK(x == pa->get_x());\n    BOOST_CHECK(y == pb->get_y());\n\n    std::cout << \"pa->get_x(): \" << pa->get_x() << std::endl;\n    std::cout << \"pb->get_y(): \" << pb->get_y() << std::endl;\n\n    delete pc;\n    std::remove(testfile);\n    return EXIT_SUCCESS;\n}\n"
  },
  {
    "path": "test/test_mult_archive_types.cpp",
    "content": "/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// test_mult_archive_types.cpp\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n#include <cstddef>\n#include <fstream>\n\n#include <boost/config.hpp>\n#include <cstdio> // remove\n#if defined(BOOST_NO_STDC_NAMESPACE)\nnamespace std{\n    using ::remove;\n}\n#endif\n\n#include <boost/archive/text_oarchive.hpp>\n#include <boost/archive/text_iarchive.hpp>\n#include <boost/archive/xml_oarchive.hpp>\n#include <boost/archive/xml_iarchive.hpp>\n#include \"test_tools.hpp\"\n\n#include <boost/serialization/export.hpp>\n#include <boost/serialization/nvp.hpp>\n\n// This is a simple class.  It contains a counter of the number\n// of objects of this class which have been instantiated.\nclass A\n{\nprivate:\n    friend class boost::serialization::access;\n    int x;\n    template<class Archive>\n    void serialize(Archive & ar, const unsigned int /* file_version */){\n        ar & BOOST_SERIALIZATION_NVP(x);\n    }\npublic:\n    static int count;\n    A(){++count;}    // default constructor\n    virtual ~A(){--count;}   // default destructor\n};\n\nBOOST_CLASS_EXPORT(A)\n\n// B is a subclass of A\nclass B : public A\n{\nprivate:\n    friend class boost::serialization::access;\n    template<class Archive>\n    void serialize(Archive & ar, const unsigned int /* file_version */){\n        ar & BOOST_SERIALIZATION_BASE_OBJECT_NVP(A);\n    }\npublic:\n    static int count;\n    B() : A() {};\n    virtual ~B() {};\n};\n\nBOOST_CLASS_EXPORT(B)\n\nint A::count = 0;\n\n// Run tests by serializing two shared_ptrs into an archive of type\n// OARCH, clearing them (deleting the objects) and then reloading the\n// objects back from an archive of type OARCH.\ntemplate<class OA, class IA>\nvoid test_save_and_load(A * first, A * second)\n{\n    const char * testfile = boost::archive::tmpnam(NULL);\n    BOOST_REQUIRE(NULL != testfile);\n\n    // Save\n    {\n        std::ofstream os(testfile);\n        OA oa(os);\n        oa << BOOST_SERIALIZATION_NVP(first);\n        oa << BOOST_SERIALIZATION_NVP(second);\n    }\n\n    // Clear the pointers, thereby destroying the objects they contain\n    first = NULL;\n    second = NULL;\n\n    // Load\n    {\n        std::ifstream is(testfile);\n        IA ia(is);\n        ia >> BOOST_SERIALIZATION_NVP(first);\n        ia >> BOOST_SERIALIZATION_NVP(second);\n    }\n    BOOST_CHECK(first == second);\n    std::remove(testfile);\n}\n\nusing namespace boost::archive;\n\n// This does the tests\nint test_main(int /* argc */, char * /* argv */[])\n{\n    // Try to save and load pointers to As, to a text archive\n    A * a = new A;\n    A * a1 = a;\n    test_save_and_load<text_oarchive, text_iarchive>(a, a1);\n\n    // Try to save and load pointers to Bs, to a text archive\n    B * b = new B;\n    B * b1 = b;\n    test_save_and_load<text_oarchive, text_iarchive>(b, b1);\n\n    // Try to save and load pointers to As, to an xml archive\n    test_save_and_load<xml_oarchive, xml_iarchive>(a, a1);\n\n    // Try to save and load pointers to Bs, to an xml archive\n    test_save_and_load<xml_oarchive, xml_iarchive>(b, b1);\n\n    delete a;\n    delete b;\n\n    return EXIT_SUCCESS;\n}\n"
  },
  {
    "path": "test/test_multi_shared_lib.cpp",
    "content": "/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// test_multi_shared_lib.cpp: test that implementation of extented_type_info\n//\t\tworks when using multiple shared libraries\n//\n// This reproduces a crash that occurred when multiple shared libraries were\n// using Boost.Serialization built statically. That causes core singletons to be\n// instantiated in each shared library separately. Due to some destruction order\n// mixup in the context of shared libraries on linux it is possible, that\n// singletons accessed in destructors of other singletons are already destructed.\n// Accessing them will then lead to a crash or memory corruption.\n// For this we need 2 shared libraries, linked against static boost. They need to\n// instantiate extended_type_info_typeid with different types, either by serializing\n// 2 types (which will do that internally) or by accessing the singletons directly.\n\n// (C) Copyright 2018 Alexander Grund\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n#include <boost/serialization/config.hpp>\n\n// Both shall instantiate different(!) singletons and return true\nBOOST_SYMBOL_IMPORT bool f();\nBOOST_SYMBOL_IMPORT bool g();\n\nint main(int argc, char**){\n  if(f() && g())\n  \treturn 0;\n  return 1;\n}\n"
  },
  {
    "path": "test/test_multiple_inheritance.cpp",
    "content": "/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// test_multiple_inheritance.cpp\n\n// (C) Copyright 2009 Robert Ramey.\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n// test of serialization library for multiple inheritance situations\n\n#include <cassert>\n#include <fstream>\n\n#include <boost/config.hpp>\n#include <cstdio> // remove\n#if defined(BOOST_NO_STDC_NAMESPACE)\nnamespace std{\n    using ::remove;\n}\n#endif\n\n#include \"test_tools.hpp\"\n\n#include <boost/serialization/access.hpp>\n#include <boost/serialization/base_object.hpp>\n#include <boost/serialization/nvp.hpp>\n#include <boost/serialization/export.hpp>\n\nstruct Base1 {\n    int m_x;\n    Base1(){}\n    Base1(int x) : m_x(1 + x) {}\n    virtual ~Base1() {}\n    bool operator==(const Base1 & rhs) const {\n        return m_x == rhs.m_x;\n    }\n    // serialize\n    friend class boost::serialization::access;\n    template<class Archive>\n    void serialize(Archive & ar, const unsigned int /* file_version */) {\n        ar & BOOST_SERIALIZATION_NVP(m_x);\n    }\n};\n\n//BOOST_CLASS_EXPORT(Base1)\n\nstruct Base2 {\n    int m_x;\n    Base2(){}\n    Base2(int x) : m_x(2 + x) {}\n    virtual ~Base2() {}\n    bool operator==(const Base2 & rhs) const {\n        return m_x == rhs.m_x;\n    }\n    // serialize\n    friend class boost::serialization::access;\n    template<class Archive>\n    void serialize(Archive & ar, const unsigned int /* file_version */) {\n        ar & BOOST_SERIALIZATION_NVP(m_x);\n    }\n};\n\n//BOOST_CLASS_EXPORT(Base2)\n\nstruct Sub :\n    public Base1,\n    public Base2\n{\n    int m_x;\n    Sub(){}\n    Sub(int x) :\n        Base1(x),\n        Base2(x),\n        m_x(x)\n    {}\n    bool operator==(const Sub & rhs) const {\n        if(! Base2::operator==(rhs))\n            return false;\n        if(! Base1::operator==(rhs))\n            return false;\n        return m_x == rhs.m_x;\n    }\n    virtual ~Sub() {}\n\n    // serialize\n    friend class boost::serialization::access;\n    template<class Archive>\n    void serialize(Archive &ar, const unsigned int /* file_version */)\n    {\n        ar & BOOST_SERIALIZATION_BASE_OBJECT_NVP(Base1);\n        ar & BOOST_SERIALIZATION_BASE_OBJECT_NVP(Base2);\n        ar & BOOST_SERIALIZATION_NVP(m_x);\n    }\n};\n\nBOOST_CLASS_EXPORT(Sub)\n\nint\ntest_main( int /* argc */, char* /* argv */[] )\n{\n    const char * testfile = boost::archive::tmpnam(NULL);\n    BOOST_REQUIRE(NULL != testfile);\n    Base2 * pb2;\n    {\n        // serialize\n        pb2 = new Sub(2);\n\n        test_ostream ofs(testfile);\n        test_oarchive oa(ofs);\n        oa << boost::serialization::make_nvp(\"Base2\", pb2);\n    }\n    Base2 * pb2_1;\n    {\n        // de-serialize\n        test_istream ifs(testfile);\n        test_iarchive ia(ifs);\n        ia >> boost::serialization::make_nvp(\"Base2\", pb2_1);\n    }\n    Sub *s1 = dynamic_cast<Sub *>(pb2);\n    BOOST_CHECK(0 != s1);\n    Sub *s2 = dynamic_cast<Sub *>(pb2_1);\n    BOOST_CHECK(0 != s2);\n    BOOST_CHECK(*s1 == *s2);\n    return EXIT_SUCCESS;\n}\n"
  },
  {
    "path": "test/test_multiple_ptrs.cpp",
    "content": "/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// test_archive_derivation.cpp\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n// should pass compilation and execution\n\n#include <cstddef>\n#include <fstream>\n\n#include <boost/config.hpp>\n#include <cstdio> // remove\n#if defined(BOOST_NO_STDC_NAMESPACE)\nnamespace std{\n    using ::remove;\n}\n#endif\n\n#include \"test_tools.hpp\"\n\n#include \"D.hpp\"\n#include \"A.ipp\"\n\nint test_main( int /* argc */, char* /* argv */[] )\n{\n    const char * testfile = boost::archive::tmpnam(NULL);\n    BOOST_REQUIRE(NULL != testfile);\n\n    const A a;\n    A a1;\n\n    {\n        test_ostream os(testfile, TEST_STREAM_FLAGS);\n        test_oarchive oa(os, TEST_ARCHIVE_FLAGS);\n        oa << boost::serialization::make_nvp(\"a\", a);\n    }\n    {\n        test_istream is(testfile, TEST_STREAM_FLAGS);\n        test_iarchive ia(is, TEST_ARCHIVE_FLAGS);\n        ia >> boost::serialization::make_nvp(\"a\", a1);\n    }\n    BOOST_CHECK(a == a1);\n    std::remove(testfile);\n    return EXIT_SUCCESS;\n}\n\n// EOF\n"
  },
  {
    "path": "test/test_native_array.cpp",
    "content": "/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// test_array.cpp\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n// should pass compilation and execution\n\n#include <stdlib.h>\n\n#include <boost/config.hpp>\n#include <cstddef>\n#include <fstream>\n#include <algorithm> // equal\n#include <cstdio> // remove\n#if defined(BOOST_NO_STDC_NAMESPACE)\nnamespace std{\n    using ::remove;\n}\n#endif\n#include \"test_tools.hpp\"\n#include <boost/core/no_exceptions_support.hpp>\n#include <boost/archive/archive_exception.hpp>\n\n#include \"A.hpp\"\n#include \"A.ipp\"\n\ntemplate <class T>\nint test_native_array(){\n    const char * testfile = boost::archive::tmpnam(NULL);\n    BOOST_REQUIRE(NULL != testfile);\n\n    // test array of objects\n    const T a_array[10]={T(),T(),T(),T(),T(),T(),T(),T(),T(),T()};\n    const T b_array[2][3]={{T(),T(),T()},{T(),T(),T()}};\n    {\n        test_ostream os(testfile, TEST_STREAM_FLAGS);\n        {\n            test_oarchive oa(os, TEST_ARCHIVE_FLAGS);\n            oa << boost::serialization::make_nvp(\"a_array\", a_array);\n            oa << boost::serialization::make_nvp(\"b_array\", b_array);\n        }\n        os.close();\n    }\n    {\n        T a_array1[10];\n        T b_array1[2][3];\n        test_istream is(testfile, TEST_STREAM_FLAGS);\n        {\n            test_iarchive ia(is, TEST_ARCHIVE_FLAGS);\n            ia >> boost::serialization::make_nvp(\"a_array\", a_array1);\n            ia >> boost::serialization::make_nvp(\"b_array\", b_array1);\n        }\n        is.close();\n        BOOST_CHECK(std::equal(& a_array[0], & a_array[10], & a_array1[0]));\n        BOOST_CHECK(b_array[0][0] == b_array1[0][0]);\n        BOOST_CHECK(b_array[1][0] == b_array1[1][0]);\n    }\n    {\n        T a_array1[9];\n        T b_array1[2][3];\n        test_istream is(testfile, TEST_STREAM_FLAGS);\n        {\n            test_iarchive ia(is, TEST_ARCHIVE_FLAGS);\n            bool exception_invoked = false;\n            BOOST_TRY {\n                ia >> boost::serialization::make_nvp(\"a_array\", a_array1);\n                ia >> boost::serialization::make_nvp(\"b_array\", b_array1);\n            }\n            BOOST_CATCH (boost::archive::archive_exception const& ae){\n                BOOST_CHECK(\n                    boost::archive::archive_exception::array_size_too_short\n                    == ae.code\n                );\n                exception_invoked = true;\n            }\n            BOOST_CATCH_END\n            BOOST_CHECK(exception_invoked);\n        }\n        is.close();\n    }\n    std::remove(testfile);\n    return EXIT_SUCCESS;\n}\n\nint test_main( int /* argc */, char* /* argv */[] ){\n    int res;\n\n    // native array\n    res = test_native_array<A>();\n    if (res != EXIT_SUCCESS)\n        return EXIT_FAILURE;\n    // test an int array for which optimized versions should be available\n    res = test_native_array<int>();\n    if (res != EXIT_SUCCESS)\n        return EXIT_FAILURE;\n\n    return EXIT_SUCCESS;\n}\n\n// EOF\n"
  },
  {
    "path": "test/test_new_operator.cpp",
    "content": "/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// test_new_operator.cpp\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n// should pass compilation and execution\n\n#include <cstddef> // NULL\n#include <cstdio> // remove\n#include <fstream>\n#include <new>\n\n#include <boost/config.hpp>\n#if defined(BOOST_NO_STDC_NAMESPACE)\nnamespace std{\n    using ::remove;\n}\n#endif\n\n#include <boost/serialization/access.hpp>\n\n#include \"test_tools.hpp\"\n\n#include \"A.hpp\"\n#include \"A.ipp\"\n\nclass ANew : public A {\n    friend class boost::serialization::access;\n    template<class Archive>\n    void serialize(Archive & ar, const unsigned /*file_version*/){\n        ar & BOOST_SERIALIZATION_BASE_OBJECT_NVP(A);\n    }\npublic:\n    static unsigned int m_new_calls;\n    static unsigned int m_delete_calls;\n    // implement class specific new/delete in terms standard\n    // implementation - we're testing serialization\n    // not \"new\" here.\n    static void * operator new(size_t s){\n        ++m_new_calls;\n        return  ::operator new(s);\n    }\n    static void operator delete(void *p, std::size_t){\n        ++m_delete_calls;\n        ::operator delete(p);\n    }\n};\nunsigned int ANew::m_new_calls = 0;\nunsigned int ANew::m_delete_calls = 0;\n\nclass ANew1 : public A {\n    friend class boost::serialization::access;\n    template<class Archive>\n    void serialize(Archive & ar, const unsigned /*file_version*/){\n        ar & BOOST_SERIALIZATION_BASE_OBJECT_NVP(A);\n    }\npublic:\n    static unsigned int m_new_calls;\n    static unsigned int m_delete_calls;\n    // implement class specific new/delete in terms standard\n    // implementation - we're testing serialization\n    // not \"new\" here.\n    static void * operator new(size_t s){\n        ++m_new_calls;\n        return  ::operator new(s);\n    }\n    static void operator delete(void *p){\n        ++m_delete_calls;\n        ::operator delete(p);\n    }\n};\nunsigned int ANew1::m_new_calls = 0;\nunsigned int ANew1::m_delete_calls = 0;\n\n\nclass ANew2 : public A {\n    friend class boost::serialization::access;\n    template<class Archive>\n    void serialize(Archive & ar, const unsigned /*file_version*/){\n        ar & BOOST_SERIALIZATION_BASE_OBJECT_NVP(A);\n    }\npublic:\n    static unsigned int m_new_calls;\n    static unsigned int m_delete_calls;\n    // implement class specific new/delete in terms standard\n    // implementation - we're testing serialization\n    // not \"new\" here.\n    static void * operator new(size_t s){\n        ++m_new_calls;\n        return  ::operator new(s);\n    }\n};\nunsigned int ANew2::m_new_calls = 0;\nunsigned int ANew2::m_delete_calls = 0;\n\ntemplate<typename T>\nint test(){\n    const char * testfile = boost::archive::tmpnam(NULL);\n\n    BOOST_REQUIRE(NULL != testfile);\n\n\n    T *ta = new T();\n\n    BOOST_CHECK(1 == T::m_new_calls);\n    BOOST_CHECK(0 == T::m_delete_calls);\n\n    T *ta1 = NULL;\n\n    {\n        test_ostream os(testfile, TEST_STREAM_FLAGS);\n        test_oarchive oa(os, TEST_ARCHIVE_FLAGS);\n        oa << boost::serialization::make_nvp(\"ta\", ta);\n    }\n    {\n        test_istream is(testfile, TEST_STREAM_FLAGS);\n        test_iarchive ia(is, TEST_ARCHIVE_FLAGS);\n        ia >> boost::serialization::make_nvp(\"ta\", ta1);\n    }\n    BOOST_CHECK(ta != ta1);\n    BOOST_CHECK(*ta == *ta1);\n\n    BOOST_CHECK(2 == T::m_new_calls);\n    BOOST_CHECK(0 == T::m_delete_calls);\n\n    std::remove(testfile);\n\n    delete ta;\n    delete ta1;\n\n    BOOST_CHECK(2 == T::m_new_calls);\n    BOOST_CHECK(2 == T::m_delete_calls);\n\n    return EXIT_SUCCESS;\n}\nint test_main( int /* argc */, char* /* argv */[] ){\n    if(EXIT_SUCCESS != test<ANew>())\n        return EXIT_FAILURE;\n    if(EXIT_SUCCESS != test<ANew1>())\n        return EXIT_FAILURE;\n    // Note the following test fails.  To see why this is, look into the file\n    // iserializer line # 247. Feel free to send a patch to detect the absence\n    // of a class specific delete.\n    /*\n    if(EXIT_SUCCESS != test<ANew2>())\n        return EXIT_FAILURE;\n    */\n    return EXIT_SUCCESS;\n}\n\n// EOF\n"
  },
  {
    "path": "test/test_no_rtti.cpp",
    "content": "/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// test_no_rtti.cpp\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n// note: this program tests the inter-operability of different\n// extended typeinfo systems.  In this example, one class is\n// identified using the default RTTI while the other uses a custom\n// system based on the export key.\n//\n// As this program uses RTTI for one of the types, the test will fail\n// on a system for which RTTI is not enabled or not existent.\n\n#include <cstddef>\n#include <fstream>\n#include <iostream>\n\n#include <boost/config.hpp>\n#include <cstdio> // remove\n#if defined(BOOST_NO_STDC_NAMESPACE)\nnamespace std{\n    using ::remove;\n}\n#endif\n\n#include <boost/serialization/type_info_implementation.hpp>\n#include <boost/serialization/export.hpp>\n#include <boost/serialization/nvp.hpp>\n\n#include \"test_tools.hpp\"\n\n#include <boost/archive/polymorphic_oarchive.hpp>\n#include <boost/archive/polymorphic_iarchive.hpp>\n\n#include \"polymorphic_base.hpp\"\n\n#include \"polymorphic_derived1.hpp\"\n\n#include \"polymorphic_derived2.hpp\"\n\n// save derived polymorphic class\nvoid save_derived(const char *testfile)\n{\n    test_ostream os(testfile, TEST_STREAM_FLAGS);\n    test_oarchive oa_implementation(os, TEST_ARCHIVE_FLAGS);\n    boost::archive::polymorphic_oarchive & oa_interface = oa_implementation;\n\n    polymorphic_derived1 *rd1 = new polymorphic_derived1;\n    polymorphic_derived2 *rd2 = new polymorphic_derived2;\n\n    std::cout << \"saving polymorphic_derived1 (no_rtti)\\n\";\n    oa_interface << BOOST_SERIALIZATION_NVP(rd1);\n\n    std::cout << \"saving polymorphic_derived2\\n\";\n    oa_interface << BOOST_SERIALIZATION_NVP(rd2);\n\n    const polymorphic_base *rb1 =  rd1;\n    polymorphic_base *rb2 = rd2;\n    std::cout << \"saving polymorphic_derived1 (no_rtti) through base (rtti)\\n\";\n    oa_interface << BOOST_SERIALIZATION_NVP(rb1);\n    std::cout << \"saving polymorphic_derived2 through base\\n\";\n    oa_interface << BOOST_SERIALIZATION_NVP(rb2);\n\n    delete rd1;\n    delete rd2;\n}\n\nvoid load_derived(const char *testfile)\n{\n    test_istream is(testfile, TEST_STREAM_FLAGS);\n    test_iarchive  ia_implementation(is, TEST_ARCHIVE_FLAGS);\n    boost::archive::polymorphic_iarchive & ia_interface = ia_implementation;\n\n    polymorphic_derived1 *rd1 = NULL;\n    polymorphic_derived2 *rd2 = NULL;\n\n    std::cout << \"loading polymorphic_derived1 (no_rtti)\\n\";\n    ia_interface >> BOOST_SERIALIZATION_NVP(rd1);\n    BOOST_CHECK_MESSAGE(\n        boost::serialization::type_info_implementation<\n            polymorphic_derived1\n        >::type::get_const_instance()\n        ==\n        * boost::serialization::type_info_implementation<\n            polymorphic_derived1\n        >::type::get_const_instance().get_derived_extended_type_info(*rd1)\n        ,\n        \"restored pointer d1 not of correct type\"\n    );\n\n    std::cout << \"loading polymorphic_derived2\\n\";\n    ia_interface >> BOOST_SERIALIZATION_NVP(rd2);\n    BOOST_CHECK_MESSAGE(\n        boost::serialization::type_info_implementation<\n            polymorphic_derived2\n        >::type::get_const_instance()\n        ==\n        * boost::serialization::type_info_implementation<\n            polymorphic_derived2\n        >::type::get_const_instance().get_derived_extended_type_info(*rd2)\n        ,\n        \"restored pointer d2 not of correct type\"\n    );\n    polymorphic_base *rb1 = NULL;\n    polymorphic_base *rb2 = NULL;\n\n    // the above operation registers the derived classes as a side\n    // effect.  Hence, instances can now be correctly serialized through\n    // a base class pointer.\n    std::cout << \"loading polymorphic_derived1 (no_rtti) through base (no_rtti)\\n\";\n    ia_interface >> BOOST_SERIALIZATION_NVP(rb1);\n\n    BOOST_CHECK_MESSAGE(\n        rb1 == dynamic_cast<polymorphic_base *>(rd1),\n        \"serialized pointers not correctly restored\"\n    );\n\n    BOOST_CHECK_MESSAGE(\n        boost::serialization::type_info_implementation<\n            polymorphic_derived1\n        >::type::get_const_instance()\n        ==\n        * boost::serialization::type_info_implementation<\n            polymorphic_base\n        >::type::get_const_instance().get_derived_extended_type_info(*rb1)\n        ,\n        \"restored pointer b1 not of correct type\"\n    );\n    std::cout << \"loading polymorphic_derived2 through base (no_rtti)\\n\";\n    ia_interface >> BOOST_SERIALIZATION_NVP(rb2);\n\n    BOOST_CHECK_MESSAGE(\n        rb2 ==  dynamic_cast<polymorphic_base *>(rd2),\n        \"serialized pointers not correctly restored\"\n    );\n    BOOST_CHECK_MESSAGE(\n        boost::serialization::type_info_implementation<\n            polymorphic_derived2\n        >::type::get_const_instance()\n        ==\n        * boost::serialization::type_info_implementation<\n            polymorphic_base\n        >::type::get_const_instance().get_derived_extended_type_info(*rb2)\n        ,\n        \"restored pointer b2 not of correct type\"\n    );\n    delete rb1;\n    delete rb2;\n}\n\nint\ntest_main( int /* argc */, char* /* argv */[] )\n{\n    const char * testfile = boost::archive::tmpnam(NULL);\n    BOOST_REQUIRE(NULL != testfile);\n\n    save_derived(testfile);\n    load_derived(testfile);\n    std::remove(testfile);\n    return EXIT_SUCCESS;\n}\n\n// EOF\n"
  },
  {
    "path": "test/test_non_default_ctor.cpp",
    "content": "/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// test_non_default_ctor.cpp\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n// should pass compilation and execution\n\n// this tests:\n// a) non-intrusive method of implementing serialization\n// b) usage of a non-default constructor\n\n#include <cstddef> // NULL\n#include <cstdio>  // remove()\n#include <fstream>\n#include <cstdlib> // for rand()\n#include <boost/config.hpp>\n#include <boost/detail/workaround.hpp>\n#include <boost/limits.hpp>\n#if BOOST_CXX_VERSION > 199711L // only include floating point if C++ version >= C++11\n#include <boost/math/special_functions/next.hpp>\n#endif\n#if defined(BOOST_NO_STDC_NAMESPACE)\nnamespace std{\n    using ::rand;\n    using ::remove;\n    #if BOOST_WORKAROUND(BOOST_MSVC, >= 1400) && !defined(UNDER_CE)\n        using ::numeric_limits;\n    #endif\n}\n#endif\n\n#include <boost/archive/archive_exception.hpp>\n#include \"test_tools.hpp\"\n\n///////////////////////////////////////////////////////\n// simple class test - using non-intrusive syntax\n// illustrates the usage of the non-intrusive syntax\nclass A\n{\n    friend class boost::serialization::access;\n\n    // note const values can only be initialized with a non\n    // non-default constructor\n    const int i;\n\n    signed char s;\n    unsigned char t;\n    signed int u;\n    unsigned int v;\n    float w;\n    double x;\n    bool operator==(const A & rhs) const;\n    bool operator<(const A & rhs) const;\n\n    template<class Archive>\n    void serialize(Archive & ar,const unsigned int /* file_version */){\n        ar & BOOST_SERIALIZATION_NVP(s);\n        ar & BOOST_SERIALIZATION_NVP(t);\n        ar & BOOST_SERIALIZATION_NVP(u);\n        ar & BOOST_SERIALIZATION_NVP(v);\n        ar & BOOST_SERIALIZATION_NVP(w);\n        ar & BOOST_SERIALIZATION_NVP(x);\n    }\n    A(const A & rhs);\n    A & operator=(const A & rhs);\npublic:\n    static int count;\n    const int & get_i() const {\n        return i;\n    }\n    A(int i_);\n    ~A();\n};\n\nint A::count = 0;\n\nA::A(int i_) :\n    i(i_),\n    s(static_cast<signed char>(0xff & std::rand())),\n    t(static_cast<signed char>(0xff & std::rand())),\n    u(std::rand()),\n    v(std::rand()),\n    w((float)std::rand() / std::rand()),\n    x((double)std::rand() / std::rand())\n{\n    ++count;\n}\n\nA::~A(){\n    --count;\n}\n\nbool A::operator==(const A &rhs) const\n{\n    return\n        s == rhs.s\n        && t == rhs.t\n        && u == rhs.u\n        && v == rhs.v\n        #if BOOST_CXX_VERSION > 199711L // only include floating point if C++ version >= C++11\n            && std::abs( boost::math::float_distance(w, rhs.w)) < 2\n            && std::abs( boost::math::float_distance(x, rhs.x)) < 2\n        #endif\n        ;\n}\n\n  bool A::operator<(const A &rhs) const\n{\n    if(! (s == rhs.s) )\n        return s < rhs.s;\n    if(! (t == rhs.t) )\n        return t < rhs.t;\n    if(! (u == rhs.u) )\n        return t < rhs.u;\n    if(! (v == rhs.v) )\n        return t < rhs.v;\n    #if BOOST_CXX_VERSION > 199711L // only include floating point if C++ version >= C++11\n        if(std::abs( boost::math::float_distance(w, rhs.w)) > 1)\n            return false;\n        if(std::abs( boost::math::float_distance(x, rhs.x)) > 1)\n            return false;\n    #endif\n    return false;\n}\n\nnamespace boost {\nnamespace serialization {\n\ntemplate<class Archive>\ninline void save_construct_data(\n    Archive & ar,\n    const A * a,\n    const unsigned int /* file_version */\n){\n    // variable used for construction\n    ar << boost::serialization::make_nvp(\"i\", a->get_i());\n}\n\ntemplate<class Archive>\ninline void load_construct_data(\n    Archive & ar,\n    A * a,\n    const unsigned int /* file_version */\n){\n    int i;\n    ar >> boost::serialization::make_nvp(\"i\", i);\n    ::new(a)A(i);\n}\n\n} // serialization\n} // namespace boost\n\nvoid save(const char * testfile){\n    test_ostream os(testfile, TEST_STREAM_FLAGS);\n    test_oarchive oa(os, TEST_ARCHIVE_FLAGS);\n    A a(2);\n\n    oa << BOOST_SERIALIZATION_NVP(a);\n\n    // save a copy pointer to this item\n    A *pa1 = &a;\n    oa << BOOST_SERIALIZATION_NVP(pa1);\n\n    // save pointer to a new object\n    A *pa2 = new A(4);\n    oa << BOOST_SERIALIZATION_NVP(pa2);\n\n    delete pa2;\n}\nvoid load(const char * testfile){\n    test_istream is(testfile, TEST_STREAM_FLAGS);\n    test_iarchive ia(is, TEST_ARCHIVE_FLAGS);\n\n    A a(4);\n    ia >> BOOST_SERIALIZATION_NVP(a);\n\n    A *pa1;\n    ia >> BOOST_SERIALIZATION_NVP(pa1);\n    BOOST_CHECK_MESSAGE(pa1 == &a, \"Copy of pointer not correctly restored\");\n\n    A *pa2;\n    ia >> BOOST_SERIALIZATION_NVP(pa2);\n    BOOST_CHECK_MESSAGE(pa2 != &a, \"Pointer not correctly restored\");\n\n    delete pa2;\n}\n\nint\ntest_main( int /* argc */, char* /* argv */[] )\n{\n    const char * testfile = boost::archive::tmpnam(NULL);\n    BOOST_REQUIRE(NULL != testfile);\n    save(testfile);\n    load(testfile);\n    BOOST_CHECK(0 == A::count);\n    std::remove(testfile);\n    return EXIT_SUCCESS;\n}\n\n// EOF\n"
  },
  {
    "path": "test/test_non_default_ctor2.cpp",
    "content": "/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// test_non_default_ctor2.cpp\n\n// (C) Copyright 2002 Martin Ecker.\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n// should pass compilation and execution\n\n// this tests complex usage of non-default constructor.  Specifically\n// the case where a constructor serializes a pointer member.\n\n#include <fstream>\n\n#include <boost/config.hpp>\n\n#include \"test_tools.hpp\"\n\nclass IntValueHolder\n{\npublic:\n    IntValueHolder()\n        : value(0)\n    {}\n\n    IntValueHolder(int newvalue)\n        : value(newvalue)\n    {}\n\n    int GetValue() const { return value; }\n\nprivate:\n    int value;\n\n    friend class boost::serialization::access;\n\n    template <class ArchiveT>\n    void serialize(ArchiveT& ar, const unsigned int /* file_version */)\n    {\n        ar & BOOST_SERIALIZATION_NVP(value);\n    }\n};\n\nclass FloatValueHolder\n{\npublic:\n    FloatValueHolder()\n        : value(0)\n    {}\n\n    FloatValueHolder(float newvalue)\n        : value(newvalue)\n    {}\n\n    float GetValue() const { return value; }\n\nprivate:\n    float value;\n\n    friend class boost::serialization::access;\n\n    template <class ArchiveT>\n    void serialize(ArchiveT& ar, const unsigned int /* file_version */)\n    {\n        ar & BOOST_SERIALIZATION_NVP(value);\n    }\n};\n\nclass A\n{\npublic:\n    A(const IntValueHolder& initialValue)\n        : value(initialValue), floatValue(new FloatValueHolder(10.0f))\n    {}\n\n    ~A()\n    {\n        delete floatValue;\n    }\n\n    IntValueHolder value;\n    FloatValueHolder* floatValue;\n\nprivate:\n    friend class boost::serialization::access;\n\n    template <class ArchiveT>\n    void serialize(ArchiveT& ar, const unsigned int /* file_version */)\n    {\n        ar & BOOST_SERIALIZATION_NVP(floatValue);\n    }\n};\n\nnamespace boost {\nnamespace serialization {\n\ntemplate <class ArchiveT>\nvoid save_construct_data(\n    ArchiveT& archive,\n    const A* p,\n    const unsigned int /*version*/\n){\n    archive & boost::serialization::make_nvp(\"initialValue\", p->value);\n}\n\ntemplate <class ArchiveT>\nvoid load_construct_data(\n    ArchiveT& archive,\n    A* p,\n    const unsigned int /*version*/\n){\n    IntValueHolder initialValue;\n    archive & boost::serialization::make_nvp(\"initialValue\", initialValue);\n\n    ::new (p) A(initialValue);\n}\n\n} // serialization\n} // namespace boost\n\nint test_main( int /* argc */, char* /* argv */[] )\n{\n    const char * testfile = boost::archive::tmpnam(NULL);\n    BOOST_REQUIRE(NULL != testfile);\n    A* a = new A(5);\n\n    {\n        test_ostream os(testfile, TEST_STREAM_FLAGS);\n        test_oarchive oa(os, TEST_ARCHIVE_FLAGS);\n        oa << BOOST_SERIALIZATION_NVP(a);\n    }\n\n    A* a_new;\n\n    {\n        test_istream is(testfile, TEST_STREAM_FLAGS);\n        test_iarchive ia(is, TEST_ARCHIVE_FLAGS);\n        ia >> BOOST_SERIALIZATION_NVP(a_new);\n    }\n    delete a;\n    delete a_new;\n    return EXIT_SUCCESS;\n}\n"
  },
  {
    "path": "test/test_non_intrusive.cpp",
    "content": "/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// test_non_intrursive.cpp\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n// should pass compilation and execution\n\n// this tests:\n// a) non-intrusive method of implementing serialization\n// b) usage of a non-default constructor\n\n#include <fstream>\n#include <cstdlib> // for rand()\n#include <cstdio>  // remove\n#include <boost/config.hpp>\n#include <boost/detail/workaround.hpp>\n#include <boost/limits.hpp>\n#if BOOST_CXX_VERSION > 199711L // only include floating point if C++ version >= C++11\n#include <boost/math/special_functions/next.hpp>\n#endif\n\n#if defined(BOOST_NO_STDC_NAMESPACE)\nnamespace std{\n    using ::rand;\n    using ::remove;\n    #if BOOST_WORKAROUND(BOOST_MSVC, >= 1400) && !defined(UNDER_CE)\n        using ::numeric_limits;\n    #endif\n}\n#endif\n\n#include <boost/archive/archive_exception.hpp>\n#include \"test_tools.hpp\"\n\n///////////////////////////////////////////////////////\n// simple class test - using non-intrusive syntax\n// illustrates the usage of the non-intrusive syntax\nclass A\n{\npublic:\n    signed char s;\n    unsigned char t;\n    signed int u;\n    unsigned int v;\n    float w;\n    double x;\n    A();\n    bool operator==(const A & rhs) const;\n    bool operator<(const A & rhs) const;\n};\n\nA::A() :\n    s(static_cast<signed char>(0xff & std::rand())),\n    t(static_cast<signed char>(0xff & std::rand())),\n    u(std::rand()),\n    v(std::rand()),\n    w((float)std::rand() / std::rand()),\n    x((double)std::rand() / std::rand())\n{\n}\n\nbool A::operator==(const A &rhs) const\n{\n    return\n        s == rhs.s\n        && t == rhs.t\n        && u == rhs.u\n        && v == rhs.v\n        #if BOOST_CXX_VERSION > 199711L // only include floating point if C++ version >= C++11\n            && std::abs( boost::math::float_distance(w, rhs.w)) < 2\n            && std::abs( boost::math::float_distance(x, rhs.x)) < 2\n        #endif\n    ;\n}\n\nbool A::operator<(const A &rhs) const\n{\n    if(! (s == rhs.s) )\n        return s < rhs.s;\n    if(! (t == rhs.t) )\n        return t < rhs.t;\n    if(! (u == rhs.u) )\n        return t < rhs.u;\n    if(! (v == rhs.v) )\n        return t < rhs.v;\n    #if BOOST_CXX_VERSION > 199711L // only include floating point if C++ version >= C++11\n        if(std::abs( boost::math::float_distance(w, rhs.w)) > 1)\n            return false;\n        if(std::abs( boost::math::float_distance(x, rhs.x)) > 1)\n            return false;\n    #endif\n    return false;\n}\n\n// note the following:\n\n// function specializations must be defined in the appropriate\n// namespace - boost::serialization\nnamespace boost {\nnamespace serialization {\n\n// This first set of overrides should work with all compilers.\n\n// The last argument is int while the default versions\n// defined in serialization.hpp have long as the last argument.\n// This is part of the work around for compilers that don't\n// support correct function template ordering.  These functions\n// are always called with 0 (i.e. an int) as the last argument.\n// Our specialized versions also have int as the last argument\n// while the default versions have a long as the last argument.\n// This makes our specialized versions a better match than the\n// default ones as no argument conversion is required to make a match\ntemplate<class Archive>\nvoid serialize(\n    Archive & ar,\n    A & a,\n    const unsigned int /* file_version */\n){\n    ar & boost::serialization::make_nvp(\"s\", a.s);\n    ar & boost::serialization::make_nvp(\"t\", a.t);\n    ar & boost::serialization::make_nvp(\"u\", a.u);\n    ar & boost::serialization::make_nvp(\"v\", a.v);\n    ar & boost::serialization::make_nvp(\"w\", a.w);\n    ar & boost::serialization::make_nvp(\"x\", a.x);\n}\n\n} // serialization\n} // namespace boost\n\nvoid save(const char * testfile){\n    test_ostream os(testfile, TEST_STREAM_FLAGS);\n    test_oarchive oa(os, TEST_ARCHIVE_FLAGS);\n    A a;\n\n    oa << BOOST_SERIALIZATION_NVP(a);\n\n    // save a copy pointer to this item\n    A *pa1 = &a;\n    oa << BOOST_SERIALIZATION_NVP(pa1);\n\n    // save pointer to a new object\n    A *pa2 = new A();\n    oa << BOOST_SERIALIZATION_NVP(pa2);\n\n    delete pa2;\n}\n\nvoid load(const char * testfile){\n    test_istream is(testfile, TEST_STREAM_FLAGS);\n    test_iarchive ia(is, TEST_ARCHIVE_FLAGS);\n\n    A a;\n    ia >> BOOST_SERIALIZATION_NVP(a);\n\n    A *pa1;\n    ia >> BOOST_SERIALIZATION_NVP(pa1);\n    BOOST_CHECK_MESSAGE(pa1 == &a, \"Copy of pointer not correctly restored\");\n\n    A *pa2;\n    ia >> BOOST_SERIALIZATION_NVP(pa2);\n    BOOST_CHECK_MESSAGE(pa2 != &a, \"Pointer not correctly restored\");\n\n    delete pa2;\n}\n\nint\ntest_main( int /* argc */, char* /* argv */[] )\n{\n    const char * testfile = boost::archive::tmpnam(NULL);\n    BOOST_REQUIRE(NULL != testfile);\n    save(testfile);\n    load(testfile);\n    std::remove(testfile);\n    return EXIT_SUCCESS;\n}\n\n// EOF\n"
  },
  {
    "path": "test/test_not_serializable.cpp",
    "content": "/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// test_non_serializable.cpp: test implementation level trait\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n// test implementation level \"not_serializable\"\n// should fail compilation\n\n#include <fstream>\n\n#include \"test_tools.hpp\"\n#include <boost/serialization/level.hpp>\n#include <boost/serialization/nvp.hpp>\n\nclass A\n{\n};\n\nBOOST_CLASS_IMPLEMENTATION(A, boost::serialization::not_serializable)\n\nvoid out(A & a)\n{\n    test_ostream os(\"testfile\", TEST_STREAM_FLAGS);\n    test_oarchive oa(os, TEST_ARCHIVE_FLAGS);\n    oa << BOOST_SERIALIZATION_NVP(a);\n}\n\nvoid in(A & a)\n{\n    test_istream is(\"testfile\", TEST_STREAM_FLAGS);\n    test_iarchive ia(is, TEST_ARCHIVE_FLAGS);\n    ia >> BOOST_SERIALIZATION_NVP(a);\n}\n\nint\ntest_main( int /* argc */, char* /* argv */[] )\n{\n    A a;\n    out(a);\n    in(a);\n    return EXIT_SUCCESS;\n}\n\n// EOF\n"
  },
  {
    "path": "test/test_null_ptr.cpp",
    "content": "/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// test_null_ptr.cpp: test implementation level trait\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n// should pass compilation and execution\n\n#include <cstddef> // NULL\n#include <cstdio> // remove\n#include <fstream>\n\n#include <boost/config.hpp>\n#if defined(BOOST_NO_STDC_NAMESPACE)\nnamespace std{\n    using ::remove;\n}\n#endif\n\n#include \"test_tools.hpp\"\n#include <boost/serialization/base_object.hpp>\n\nclass polymorphic_base\n{\n    friend class boost::serialization::access;\n    template<class Archive>\n    void serialize(Archive & /* ar */, const unsigned int /* file_version */){\n    }\npublic:\n    virtual ~polymorphic_base(){};\n};\n\nclass polymorphic_derived1 : public polymorphic_base\n{\n    friend class boost::serialization::access;\n    template<class Archive>\n    void serialize(Archive &ar, const unsigned int /* file_version */){\n        ar & BOOST_SERIALIZATION_BASE_OBJECT_NVP(polymorphic_base);\n    }\n};\n\n// save unregistered polymorphic classes\nvoid save(const char *testfile)\n{\n    test_ostream os(testfile, TEST_STREAM_FLAGS);\n    test_oarchive oa(os, TEST_ARCHIVE_FLAGS);\n\n    polymorphic_base *rb1 =  NULL;\n    polymorphic_derived1 *rd1 = NULL;\n\n    oa << BOOST_SERIALIZATION_NVP(rb1);\n    oa << BOOST_SERIALIZATION_NVP(rd1);\n}\n\n// load unregistered polymorphic classes\nvoid load(const char *testfile)\n{\n    test_istream is(testfile, TEST_STREAM_FLAGS);\n    test_iarchive ia(is, TEST_ARCHIVE_FLAGS);\n\n    polymorphic_derived1 dummy;\n\n    polymorphic_base *rb1 = & dummy;\n    polymorphic_derived1 *rd1 = & dummy;\n\n    ia >> BOOST_SERIALIZATION_NVP(rb1);\n    BOOST_CHECK_MESSAGE(NULL == rb1, \"Null pointer not restored\");\n\n    ia >> BOOST_SERIALIZATION_NVP(rd1);\n    BOOST_CHECK_MESSAGE(NULL == rd1, \"Null pointer not restored\");\n\n    delete rb1;\n    delete rd1;\n}\n\nint\ntest_main( int /* argc */, char* /* argv */[] )\n{\n    const char * testfile = boost::archive::tmpnam(NULL);\n    BOOST_REQUIRE(NULL != testfile);\n    save(testfile);\n    load(testfile);\n    std::remove(testfile);\n    return EXIT_SUCCESS;\n}\n\n// EOF\n"
  },
  {
    "path": "test/test_nvp.cpp",
    "content": "/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// test_nvp.cpp\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n// should pass compilation and execution\n\n#include <cstddef> // NULL\n#include <cstdio> // remove\n#include <fstream>\n\n#include <boost/config.hpp>\n#if defined(BOOST_NO_STDC_NAMESPACE)\nnamespace std{\n    using ::remove;\n}\n#endif\n\n#include \"test_tools.hpp\"\n\n#include <boost/serialization/nvp.hpp>\n\n#include \"B.hpp\"\n#include \"A.ipp\"\n\nint\ntest_main( int /* argc */, char* /* argv */[] )\n{\n    const char * testfile = boost::archive::tmpnam(NULL);\n    BOOST_REQUIRE(NULL != testfile);\n\n    B b, b1;\n\n    {\n        test_ostream os(testfile, TEST_STREAM_FLAGS);\n        test_oarchive oa(os, TEST_ARCHIVE_FLAGS);\n        oa << BOOST_SERIALIZATION_NVP(b);\n    }\n    {\n        test_istream is(testfile, TEST_STREAM_FLAGS);\n        test_iarchive ia(is, TEST_ARCHIVE_FLAGS);\n        ia >> BOOST_SERIALIZATION_NVP(b1);\n    }\n    BOOST_CHECK(b == b1);\n\n    B *bptr = &b;\n    B *bptr1;\n\n    {\n        test_ostream os(testfile, TEST_STREAM_FLAGS);\n        test_oarchive oa(os, TEST_ARCHIVE_FLAGS);\n        oa << BOOST_SERIALIZATION_NVP(bptr);\n    }\n    {\n        test_istream is(testfile, TEST_STREAM_FLAGS);\n        test_iarchive ia(is, TEST_ARCHIVE_FLAGS);\n        ia >> BOOST_SERIALIZATION_NVP(bptr1);\n    }\n    BOOST_CHECK(b == *bptr1);\n\n    std::remove(testfile);\n    return EXIT_SUCCESS;\n}\n\n// EOF\n"
  },
  {
    "path": "test/test_object.cpp",
    "content": "/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// test_object.cpp\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n// test implementation level \"object_serializable\"\n// should pass compilation and execution\n\n#include <cstddef> // NULL\n#include <cstdio> // remove\n#include <fstream>\n\n#include <boost/config.hpp>\n#if defined(BOOST_NO_STDC_NAMESPACE)\nnamespace std{\n    using ::remove;\n}\n#endif\n\n#include \"test_tools.hpp\"\n\n#include <boost/serialization/level.hpp>\n#include <boost/serialization/nvp.hpp>\n\nclass A\n{\n    friend class boost::serialization::access;\n    template<class Archive>\n    void serialize(Archive & /* ar */, const unsigned int /* file_version */){\n    }\n};\n\nBOOST_CLASS_IMPLEMENTATION(A, boost::serialization::object_serializable)\n\n// note: version can be assigned only to objects whose implementation\n// level is object_class_info.  So, doing the following will result in\n// a static assertion\n// BOOST_CLASS_VERSION(A, 2);\n\nvoid out(const char *testfile, A & a)\n{\n    test_ostream os(testfile, TEST_STREAM_FLAGS);\n    test_oarchive oa(os, TEST_ARCHIVE_FLAGS);\n    oa << BOOST_SERIALIZATION_NVP(a);\n}\n\nvoid in(const char *testfile, A & a)\n{\n    test_istream is(testfile, TEST_STREAM_FLAGS);\n    test_iarchive ia(is, TEST_ARCHIVE_FLAGS);\n    ia >> BOOST_SERIALIZATION_NVP(a);\n}\n\nint\ntest_main( int /* argc */, char* /* argv */[] )\n{\n    const char * testfile = boost::archive::tmpnam(NULL);\n    BOOST_REQUIRE(NULL != testfile);\n\n    A a;\n    out(testfile, a);\n    in(testfile, a);\n    std::remove(testfile);\n    return EXIT_SUCCESS;\n}\n\n// EOF\n"
  },
  {
    "path": "test/test_optional.cpp",
    "content": "/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// test_optional.cpp\n\n// (C) Copyright 2004 Pavel Vozenilek\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n// should pass compilation and execution\n\n#include <cstddef> // NULL\n#include <cstdio> // remove\n#include <fstream>\n\n#include <boost/config.hpp>\n\n#if defined(BOOST_NO_STDC_NAMESPACE)\nnamespace std{\n    using ::remove;\n}\n#endif\n\n#include <boost/archive/archive_exception.hpp>\n#include \"test_tools.hpp\"\n\n\nstruct A {\n    int m_x;\n    template<class Archive>\n    void serialize(Archive & ar, const unsigned int /* version */){\n        ar & boost::serialization::make_nvp(\"x\", m_x);\n    };\n    bool operator==(const A & rhs) const {\n        return m_x == rhs.m_x;\n    }\n    // note that default constructor is not trivial\n    A() :\n        m_x(0)\n    {}\n    A(int x) :\n        m_x(x)\n    {}\n};\n\n// Optional is the class optional implementation you use\ntemplate<template<class> class Optional>\nint test(){\n    const char * testfile = boost::archive::tmpnam(NULL);\n    BOOST_REQUIRE(NULL != testfile);\n\n    const Optional<int> aoptional1;\n    const Optional<int> aoptional2(123);\n    const Optional<A> aoptional3;\n    A a(1);\n    const Optional<A> aoptional4(a);\n    const Optional<A *> aoptional5;\n    const Optional<A *> aoptional6(& a);\n    {\n        test_ostream os(testfile, TEST_STREAM_FLAGS);\n        test_oarchive oa(os, TEST_ARCHIVE_FLAGS);\n        oa << boost::serialization::make_nvp(\"aoptional1\",aoptional1);\n        oa << boost::serialization::make_nvp(\"aoptional2\",aoptional2);\n        oa << boost::serialization::make_nvp(\"aoptional3\",aoptional3);\n        oa << boost::serialization::make_nvp(\"aoptional4\",aoptional4);\n        oa << boost::serialization::make_nvp(\"aoptional5\",aoptional5);\n        oa << boost::serialization::make_nvp(\"aoptional6\",aoptional6);\n    }\n    Optional<int> aoptional1a(999);\n    Optional<int> aoptional2a;\n    Optional<A> aoptional3a;\n    Optional<A> aoptional4a;\n    Optional<A *> aoptional5a;\n    Optional<A *> aoptional6a;\n    {\n        test_istream is(testfile, TEST_STREAM_FLAGS);\n        test_iarchive ia(is, TEST_ARCHIVE_FLAGS);\n        ia >> boost::serialization::make_nvp(\"aoptional1\",aoptional1a);\n        ia >> boost::serialization::make_nvp(\"aoptional2\",aoptional2a);\n        ia >> boost::serialization::make_nvp(\"aoptional3\",aoptional3a);\n        ia >> boost::serialization::make_nvp(\"aoptional4\",aoptional4a);\n        ia >> boost::serialization::make_nvp(\"aoptional5\",aoptional5a);\n        ia >> boost::serialization::make_nvp(\"aoptional6\",aoptional6a);\n    }\n    BOOST_CHECK(aoptional1 == aoptional1a);\n    BOOST_CHECK(aoptional2 == aoptional2a);\n    BOOST_CHECK(aoptional3 == aoptional3a);\n    BOOST_CHECK(aoptional4 == aoptional4a);\n    BOOST_CHECK(aoptional5 == aoptional5a);  // not initialized\n    BOOST_CHECK(**aoptional6 == **aoptional6a);\n\n    std::remove(testfile);\n    return EXIT_SUCCESS;\n}\n\n#include <boost/serialization/optional.hpp>\n#ifndef BOOST_NO_CXX17_HDR_OPTIONAL\n#include <optional>\n#endif\n\nint test_main( int /* argc */, char* /* argv */[] ){\n    test<boost::optional>();\n    #ifndef BOOST_NO_CXX17_HDR_OPTIONAL\n    test<std::optional>();\n    #endif\n    return EXIT_SUCCESS;\n}\n"
  },
  {
    "path": "test/test_p_helper.cpp",
    "content": "/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// test_polymorphic.cpp\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n// should pass compilation and execution\n\n#include <cstddef> // NULL\n#include <cstdio> // remove\n#include <fstream>\n\n#include <boost/config.hpp>\n#if defined(BOOST_NO_STDC_NAMESPACE)\nnamespace std{\n    using ::remove;\n}\n#endif\n\n// the following is to ensure that when one of the libraries changes\n// BJAM rebuilds and relinks the test.\n/*\n#include \"polymorphic_text_archive.hpp\"\n#include \"polymorphic_text_warchive.hpp\"\n#include \"polymorphic_binary_archive.hpp\"\n#include \"polymorphic_xml_archive.hpp\"\n#include \"polymorphic_xml_warchive.hpp\"\n*/\n\n#include <string>\n#include <vector>\n\n#include \"test_tools.hpp\"\n#include <boost/serialization/split_free.hpp>\n#include <boost/serialization/vector.hpp>\n#include <boost/serialization/nvp.hpp>\n// this test uses a special string (my_string) whose contents are shared\n// and hence saved in the archive only once.  We need a helper in order\n// to convert my_string into a serializable type\n\nclass my_string:public std::string\n{\n    typedef std::string super;\n\npublic:\n    my_string(){}\n    my_string(const super & str): super(str){}\n    my_string & operator=(const super& rhs) {\n      super::operator=(rhs);\n      return *this;\n    }\n};\n\nstruct my_string_helper\n{\n  typedef std::vector<my_string> table;\n  table m_t;\n};\n\nBOOST_SERIALIZATION_SPLIT_FREE(my_string)\n\nnamespace boost {\nnamespace serialization {\n\ntemplate<class Archive>\nvoid save(Archive & ar, const my_string & str, const unsigned int /* version */)\n{\n    void (* const idx)(Archive &, const my_string &, const unsigned int) = & save;\n    void * const id = reinterpret_cast<void * const>(idx);\n    my_string_helper & msh = ar.template get_helper<my_string_helper>(id);\n\n    my_string_helper::table t = msh.m_t;\n    my_string_helper::table::iterator it = std::find(t.begin(), t.end(), str);\n    if(it == t.end()){\n        my_string_helper::table::size_type s = t.size();\n        ar << make_nvp(\"index\", s);\n        t.push_back(str);\n        ar << make_nvp(\"string\", static_cast<const std::string &>(str));\n    }\n    else{\n        my_string_helper::table::size_type s = it - t.begin();\n        ar << make_nvp(\"index\", s);\n    }\n}\n\ntemplate<class Archive>\nvoid load(Archive & ar, my_string & str, const unsigned int /* version */)\n{\n    void (* const idx)(Archive &, my_string &, const unsigned int) = & load;\n    void * const id = reinterpret_cast<void * const>(idx);\n    my_string_helper & msh = ar.template get_helper<my_string_helper>(id);\n\n    my_string_helper::table t = msh.m_t;\n\n    my_string_helper::table::size_type s;\n    ar >> make_nvp(\"index\", s);\n    t.reserve(s);\n    if(s >= t.size()){\n        std::string tmp;\n        ar >> make_nvp(\"string\", tmp);\n        str = tmp;\n        t.push_back(str);\n    }\n    else{\n        str = t[s];\n    }\n}\n\n} // namespace serialization\n} // namespace boost\n#include <boost/archive/polymorphic_oarchive.hpp>\n#include <boost/archive/polymorphic_iarchive.hpp>\n\nint test_main(int /* argc */, char * /* argv */ [])\n{\n    const char * testfile = boost::archive::tmpnam(NULL);\n    BOOST_REQUIRE(NULL != testfile);\n\n    std::vector<my_string> v1;\n    for(int i=0; i<1000; ++i){\n        char sbuffer[10];\n        std::snprintf(sbuffer, sizeof(sbuffer), \"%i\", i % 100);\n        v1.push_back(my_string(sbuffer));\n    }\n\n    // test using using polymorphic implementation.\n    {\n        test_ostream os(testfile, TEST_STREAM_FLAGS);\n        test_oarchive oa_implementation(os, TEST_ARCHIVE_FLAGS);\n        oa_implementation << boost::serialization::make_nvp(\"vector\", v1);\n    }\n    {\n        std::vector<my_string> v2;\n        test_istream is(testfile, TEST_STREAM_FLAGS);\n        test_iarchive  ia_implementation(is, TEST_ARCHIVE_FLAGS);\n        ia_implementation >> boost::serialization::make_nvp(\"vector\", v2);\n        BOOST_CHECK(v1 == v2);\n    }\n    std::remove(testfile);\n\n    // test using using polymorphic interface.\n    {\n        test_ostream os(testfile, TEST_STREAM_FLAGS);\n        test_oarchive oa_implementation(os, TEST_ARCHIVE_FLAGS);\n        boost::archive::polymorphic_oarchive & oa_interface = oa_implementation;\n        oa_interface << boost::serialization::make_nvp(\"vector\", v1);\n    }\n    {\n        std::vector<my_string> v2;\n        test_istream is(testfile, TEST_STREAM_FLAGS);\n        test_iarchive  ia_implementation(is, TEST_ARCHIVE_FLAGS);\n        boost::archive::polymorphic_iarchive & ia_interface = ia_implementation;\n        ia_interface >> boost::serialization::make_nvp(\"vector\", v2);\n        BOOST_CHECK(v1 == v2);\n    }\n    std::remove(testfile);\n    std::remove(testfile);\n    return EXIT_SUCCESS;\n}\n"
  },
  {
    "path": "test/test_pimpl.cpp",
    "content": "/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// test_pimpl.cpp\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n// should pass compilation and execution\n\n#include <boost/compatibility/cpp_c_headers/cstdio> // for tmpnam\n\n#include <fstream>\n#include <boost/serialization/nvp.hpp>\n\n#include \"test_tools.hpp\"\n\nclass B;\n\nclass A {\n    friend boost::serialization::access;\n    B *pimpl;\n    template<class Archive>\n    void serialize(Archive & ar, const unsigned int file_version);\n};\n\nint test_main( int argc, char* argv[] )\n{\n    char testfile[TMP_MAX];\n    std::tmpnam(testfile);\n//    BOOST_REQUIRE(NULL != testfile);\n\n    A a, a1;\n    {\n        test_ostream os(testfile, TEST_STREAM_FLAGS);\n        test_oarchive oa(os);\n        oa << BOOST_SERIALIZATION_NVP(a);\n    }\n    {\n        test_istream is(testfile, TEST_STREAM_FLAGS);\n        test_iarchive ia(is);\n        BOOST_SERIALIZATION_NVP(a1);\n    }\n//    BOOST_CHECK(a != a1);\n    return 0;\n}\n\n// EOF\n"
  },
  {
    "path": "test/test_polymorphic.cpp",
    "content": "/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// test_polymorphic.cpp\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n// should pass compilation and execution\n\n#include <cstddef> // NULL\n#include <cstdio> // remove\n#include <fstream>\n\n#include <boost/config.hpp>\n#if defined(BOOST_NO_STDC_NAMESPACE)\nnamespace std{\n    using ::remove;\n}\n#endif\n\n// the following is to ensure that when one of the libraries changes\n// BJAM rebuilds and relinks the test.\n/*\n#include \"polymorphic_text_archive.hpp\"\n#include \"polymorphic_text_warchive.hpp\"\n#include \"polymorphic_binary_archive.hpp\"\n#include \"polymorphic_xml_archive.hpp\"\n#include \"polymorphic_xml_warchive.hpp\"\n*/\n\n#include \"test_tools.hpp\"\n\n#include <boost/archive/polymorphic_oarchive.hpp>\n#include <boost/archive/polymorphic_iarchive.hpp>\n\n#include <boost/serialization/nvp.hpp>\n#include \"test_polymorphic_A.hpp\"\n\nint test_main(int /* argc */, char * /* argv */ [])\n{\n    const char * testfile = boost::archive::tmpnam(NULL);\n    BOOST_REQUIRE(NULL != testfile);\n    const data d;\n    data d1;\n    // test using using polymorphic interface\n    {\n        test_ostream os(testfile, TEST_STREAM_FLAGS);\n        test_oarchive oa_implementation(os, TEST_ARCHIVE_FLAGS);\n        boost::archive::polymorphic_oarchive & oa_interface = oa_implementation;\n        oa_interface << BOOST_SERIALIZATION_NVP(d);\n    }\n    {\n        test_istream is(testfile, TEST_STREAM_FLAGS);\n        test_iarchive  ia_implementation(is, TEST_ARCHIVE_FLAGS);\n        boost::archive::polymorphic_iarchive & ia_interface = ia_implementation;\n        ia_interface >> BOOST_SERIALIZATION_NVP(d1);\n    }\n    BOOST_CHECK(d == d1);\n    std::remove(testfile);\n\n    // test using using polymorphic implementation.\n    {\n        test_ostream os(testfile, TEST_STREAM_FLAGS);\n        test_oarchive oa_implementation(os, TEST_ARCHIVE_FLAGS);\n        oa_implementation << BOOST_SERIALIZATION_NVP(d);\n    }\n    {\n        test_istream is(testfile, TEST_STREAM_FLAGS);\n        test_iarchive  ia_implementation(is, TEST_ARCHIVE_FLAGS);\n        ia_implementation >> BOOST_SERIALIZATION_NVP(d1);\n    }\n    BOOST_CHECK(d == d1);\n    std::remove(testfile);\n\n    // test using using polymorphic interface.\n    {\n        test_ostream os(testfile, TEST_STREAM_FLAGS);\n        boost::archive::polymorphic_oarchive * oa_implementation\n            = new test_oarchive(os, TEST_ARCHIVE_FLAGS);\n        *oa_implementation << BOOST_SERIALIZATION_NVP(d);\n        delete oa_implementation;\n    }\n    {\n        test_istream is(testfile, TEST_STREAM_FLAGS);\n        boost::archive::polymorphic_iarchive * ia_implementation\n            = new test_iarchive(is, TEST_ARCHIVE_FLAGS);\n        *ia_implementation >> BOOST_SERIALIZATION_NVP(d1);\n        delete ia_implementation;\n    }\n    BOOST_CHECK(d == d1);\n    std::remove(testfile);\n    return EXIT_SUCCESS;\n}\n"
  },
  {
    "path": "test/test_polymorphic2.cpp",
    "content": "/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// test_polymorphic2.cpp\n\n// (C) Copyright 2009 Robert Ramey - http://www.rrsd.com .\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n// should pass compilation and execution\n#include <fstream>\n\n#include \"test_tools.hpp\"\n\n#include \"test_polymorphic2.hpp\"\n\nint test_main(int /*argc*/, char* /*argv*/[])\n{\n    A *a = new B();\n    a->i = 3;\n\n    const char * testfile = boost::archive::tmpnam(NULL);\n    BOOST_REQUIRE(NULL != testfile);\n    {\n        test_ostream os(testfile, TEST_STREAM_FLAGS);\n        test_oarchive oa_implementation(os, TEST_ARCHIVE_FLAGS);\n        boost::archive::polymorphic_oarchive & opa = oa_implementation;\n        opa << BOOST_SERIALIZATION_NVP(a);\n    }\n    A *loaded = 0;\n    {\n        test_istream is(testfile, TEST_STREAM_FLAGS);\n        test_iarchive ia_implementation(is, TEST_ARCHIVE_FLAGS);\n        boost::archive::polymorphic_iarchive & ipa = ia_implementation;\n        ipa >> BOOST_SERIALIZATION_NVP(loaded);\n    }\n    BOOST_CHECK(a->i == loaded->i);\n    delete a;\n    delete loaded;\n    return EXIT_SUCCESS;\n}\n"
  },
  {
    "path": "test/test_polymorphic2.hpp",
    "content": "/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// test_polymorphic2.hpp\n\n// (C) Copyright 2009 Robert Ramey - http://www.rrsd.com .\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n// should pass compilation and execution\nnamespace boost {\nnamespace archive {\n    class polymorphic_oarchive;\n    class polymorphic_iarchive;\n}\n}\n\nstruct A {\npublic:\n    A() {}\n    virtual ~A() {}\n\n    void serialize(\n        boost::archive::polymorphic_oarchive &ar,\n        const unsigned int /*version*/\n    );\n    void serialize(\n        boost::archive::polymorphic_iarchive &ar,\n        const unsigned int /*version*/\n    );\n\n    int i;\n};\n\nstruct B : A {\n    void serialize(\n        boost::archive::polymorphic_oarchive &ar,\n        const unsigned int /*version*/\n    );\n    void serialize(\n        boost::archive::polymorphic_iarchive &ar,\n        const unsigned int /*version*/\n    );\n};\n"
  },
  {
    "path": "test/test_polymorphic2imp.cpp",
    "content": "/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// test_polymorphic2imp.cpp\n\n// (C) Copyright 2009 Robert Ramey - http://www.rrsd.com .\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n// should pass compilation and execution\n\n#include <boost/serialization/export.hpp>\n#include <boost/archive/polymorphic_oarchive.hpp>\n#include <boost/archive/polymorphic_iarchive.hpp>\n\n#include \"test_polymorphic2.hpp\"\n\nvoid A::serialize(\n    boost::archive::polymorphic_oarchive &ar,\n    const unsigned int /*version*/\n){\n    ar & BOOST_SERIALIZATION_NVP(i);\n}\nvoid A::serialize(\n    boost::archive::polymorphic_iarchive &ar,\n    const unsigned int /*version*/\n){\n    ar & BOOST_SERIALIZATION_NVP(i);\n}\n// note: only the most derived classes need be exported\n// BOOST_CLASS_EXPORT(A)\n\nvoid B::serialize(\n    boost::archive::polymorphic_oarchive &ar,\n    const unsigned int /*version*/\n){\n    ar & BOOST_SERIALIZATION_BASE_OBJECT_NVP(A);\n}\nvoid B::serialize(\n    boost::archive::polymorphic_iarchive &ar,\n    const unsigned int /*version*/\n){\n    ar & BOOST_SERIALIZATION_BASE_OBJECT_NVP(A);\n}\nBOOST_CLASS_EXPORT(B)\n"
  },
  {
    "path": "test/test_polymorphic_A.cpp",
    "content": "/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// test_polymorphic_A.cpp\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n#include \"test_polymorphic_A.hpp\"\n#include <boost/serialization/nvp.hpp>\n\n#include \"A.hpp\"\n#include \"A.ipp\"\n\ndata::data() :\n    a(new A)\n{}\ndata::~data(){\n    delete a;\n}\n\nbool data::operator==(const data & rhs) const {\n    return * (a) == *(rhs.a);\n}\n\n#if 0 // this method fails with msvc 6.0 and borland\n// now we can define the serialization for class A\ntemplate<class Archive>\nvoid data::serialize(Archive & ar, const unsigned int /* file_version */){\n    ar & BOOST_SERIALIZATION_NVP(a);\n}\n\n// without the explicit instantiation below, the program will\n// fail to link for lack of instantiation of the above function\n// note: the following failed to fix link errors for vc 7.0 !\n#include <boost/archive/polymorphic_oarchive.hpp>\n\ntemplate void data::serialize<boost::archive::polymorphic_oarchive>(\n    boost::archive::polymorphic_oarchive & ar,\n    const unsigned int file_version\n);\n\n#include <boost/archive/polymorphic_iarchive.hpp>\n\ntemplate void data::serialize<boost::archive::polymorphic_iarchive>(\n    boost::archive::polymorphic_iarchive & ar,\n    const unsigned int file_version\n);\n#endif\n\n// so use this\nvoid data::serialize(boost::archive::polymorphic_oarchive & ar, const unsigned int /* file_version */){\n    ar & BOOST_SERIALIZATION_NVP(a);\n}\n\nvoid data::serialize(boost::archive::polymorphic_iarchive & ar, const unsigned int /* file_version */){\n    ar & BOOST_SERIALIZATION_NVP(a);\n}\n"
  },
  {
    "path": "test/test_polymorphic_A.hpp",
    "content": "/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// test_polymorphic_A.hpp\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n// class whose declaration is hidden by a pointer\n// #include <boost/serialization/scoped_ptr.hpp>\n\n#include <boost/archive/polymorphic_oarchive.hpp>\n#include <boost/archive/polymorphic_iarchive.hpp>\n\nclass A;\n\nstruct data {\n    // class a contains a pointer to a \"hidden\" declaration\n    // borland scoped_ptr doesn't work !!!\n    // boost::scoped_ptr<A> a;\n    A * a;\n//    template<class Archive>\n//    void serialize(Archive & ar, const unsigned int file_version);\n    void serialize(boost::archive::polymorphic_oarchive & ar, const unsigned int file_version);\n    void serialize(boost::archive::polymorphic_iarchive & ar, const unsigned int file_version);\n    data();\n    ~data();\n    bool operator==(const data & rhs) const;\n};\n\n"
  },
  {
    "path": "test/test_primitive.cpp",
    "content": "/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// test_primitive.cpp\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n// test implementation level \"primitive_type\"\n\n#include <cstddef> // NULL\n#include <fstream>\n\n#include <boost/config.hpp>\n\n#include \"test_tools.hpp\"\n\n#include <boost/serialization/level.hpp>\n#include <boost/serialization/nvp.hpp>\n\nstruct A\n{\n    template<class Archive>\n    void serialize(Archive &ar, const unsigned int /* file_version */){\n        // note: should never fail here\n        BOOST_STATIC_ASSERT(0 == sizeof(Archive));\n    }\n};\n\nstd::ostream & operator<<(std::ostream &os, const A & /* a */){ return os;}\nstd::istream & operator>>(std::istream &is, A & /* a */){return is;}\n\n#ifndef BOOST_NO_STD_WSTREAMBUF\nstd::wostream & operator<<(std::wostream &os, const A & /* a */){ return os;}\nstd::wistream & operator>>(std::wistream &is, A & /* a */){return is;}\n#endif\n\nBOOST_CLASS_IMPLEMENTATION(A, boost::serialization::primitive_type)\n\nvoid out(const char *testfile, A & a)\n{\n    test_ostream os(testfile, TEST_STREAM_FLAGS);\n    test_oarchive oa(os, TEST_ARCHIVE_FLAGS);\n    oa << BOOST_SERIALIZATION_NVP(a);\n}\n\nvoid in(const char *testfile, A & a)\n{\n    test_istream is(testfile, TEST_STREAM_FLAGS);\n    test_iarchive ia(is, TEST_ARCHIVE_FLAGS);\n    ia >> BOOST_SERIALIZATION_NVP(a);\n}\n\nint\ntest_main( int /* argc */, char* /* argv */[] )\n{\n    const char * testfile = boost::archive::tmpnam(NULL);\n    BOOST_REQUIRE(NULL != testfile);\n\n    A a;\n    out(testfile, a);\n    in(testfile, a);\n    return EXIT_SUCCESS;\n}\n\n// EOF\n"
  },
  {
    "path": "test/test_priority_queue.cpp",
    "content": "/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// test_priority_queue.cpp\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n// should pass compilation and execution\n\n#include <cstddef>\n#include <fstream>\n\n#include <cstdio> // remove\n#include <boost/config.hpp>\n#if defined(BOOST_NO_STDC_NAMESPACE)\nnamespace std{\n    using ::remove;\n}\n#endif\n\n#include \"test_tools.hpp\"\n\n#include <boost/serialization/vector.hpp>\n#include <boost/serialization/priority_queue.hpp>\n\n#include \"A.hpp\"\n#include \"A.ipp\"\n\nint test_main( int /* argc */, char* /* argv */[] )\n{\n    const char * testfile = boost::archive::tmpnam(NULL);\n    BOOST_REQUIRE(NULL != testfile);\n\n    // test array of objects\n    std::priority_queue<A, std::vector<A> > a_priority_queue, a_priority_queue1;\n    a_priority_queue.push(A());\n    a_priority_queue.push(A());\n    a_priority_queue.push(A());\n    a_priority_queue.push(A());\n    {\n        test_ostream os(testfile, TEST_STREAM_FLAGS);\n        test_oarchive oa(os, TEST_ARCHIVE_FLAGS);\n        oa << boost::serialization::make_nvp(\"a_priority_queue\",a_priority_queue);\n    }\n    {\n        test_istream is(testfile, TEST_STREAM_FLAGS);\n        test_iarchive ia(is, TEST_ARCHIVE_FLAGS);\n        ia >> boost::serialization::make_nvp(\"a_priority_queue\",a_priority_queue1);\n    }\n    BOOST_CHECK(a_priority_queue.size() == a_priority_queue1.size());\n\n    for(int i = a_priority_queue.size(); i-- > 0;){\n        const A & a1 = a_priority_queue.top();\n        const A & a2 = a_priority_queue1.top();\n        BOOST_CHECK(a1 == a2);\n        a_priority_queue.pop();\n        a_priority_queue1.pop();\n    }\n\n    std::remove(testfile);\n    return EXIT_SUCCESS;\n}\n\n// EOF\n"
  },
  {
    "path": "test/test_private_base.cpp",
    "content": "/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// test_private_base.cpp\n\n// (C) Copyright 2009 Eric Moyer - http://www.rrsd.com .\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n// should pass compilation and execution\n\n// invoke header for a custom archive test.\n\n#include <fstream>\n#include <boost/config.hpp>\n#if defined(BOOST_NO_STDC_NAMESPACE)\nnamespace std{\n    using ::remove;\n}\n#endif\n\n#include <boost/serialization/access.hpp>\n#include <boost/serialization/base_object.hpp>\n#include <boost/serialization/export.hpp>\n\n#include \"test_tools.hpp\"\n\nclass Base {\n    friend class boost::serialization::access;\n    int m_i;\n    template<class Archive>\n    void serialize(Archive & ar, const unsigned int version){\n        ar & BOOST_SERIALIZATION_NVP(m_i);\n    }\nprotected:\n    bool equals(const Base &rhs) const {\n        return m_i == rhs.m_i;\n    }\n    Base(int i = 0) :\n        m_i(i)\n    {}\npublic:\n};\n\nclass Derived : private Base {\n    friend class boost::serialization::access;\nprivate:\n    Base & base_cast(){\n        return static_cast<Base &>(*this);\n    }\n    template<class Archive>\n    void serialize(Archive & ar, const unsigned int version){\n        ar & BOOST_SERIALIZATION_BASE_OBJECT_NVP(Base);\n    }\npublic:\n    bool operator==(const Derived &rhs) const {\n        return Base::equals(static_cast<const Base &>(rhs));\n    }\n    Derived(int i = 0) :\n        Base(i)\n    {}\n};\n\nint\ntest_main( int /* argc */, char* /* argv */[] )\n{\n    const char * testfile = boost::archive::tmpnam(NULL);\n    BOOST_REQUIRE(NULL != testfile);\n\n    Derived a(1), a1(2);\n    {\n        test_ostream os(testfile, TEST_STREAM_FLAGS);\n        test_oarchive oa(os, TEST_ARCHIVE_FLAGS);\n        oa << boost::serialization::make_nvp(\"a\", a);\n    }\n    {\n        test_istream is(testfile, TEST_STREAM_FLAGS);\n        test_iarchive ia(is, TEST_ARCHIVE_FLAGS);\n        ia >> boost::serialization::make_nvp(\"a\", a1);\n    }\n    BOOST_CHECK_EQUAL(a, a1);\n    std::remove(testfile);\n\n    return 0;\n}\n"
  },
  {
    "path": "test/test_private_base2.cpp",
    "content": "/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// test_private_base.cpp\n\n// (C) Copyright 2009 Eric Moyer - http://www.rrsd.com .\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n// should pass compilation and execution\n\n// invoke header for a custom archive test.\n\n#include <fstream>\n#include <boost/config.hpp>\n#if defined(BOOST_NO_STDC_NAMESPACE)\nnamespace std{\n    using ::remove;\n}\n#endif\n\n#include <boost/serialization/access.hpp>\n#include <boost/serialization/base_object.hpp>\n#include <boost/serialization/export.hpp>\n\n#include \"test_tools.hpp\"\n\nclass Base {\n    friend class boost::serialization::access;\n    int m_i;\n    template<class Archive>\n    void serialize(Archive & ar, const unsigned int version){\n        ar & BOOST_SERIALIZATION_NVP(m_i);\n    }\nprotected:\n    bool equals(const Base &rhs) const {\n        return m_i == rhs.m_i;\n    }\n    Base(int i = 0) :\n        m_i(i)\n    {}\n    virtual ~Base(){};\npublic:\n    virtual bool operator==(const Base &rhs) const {\n        return false;\n    }// = 0;\n};\n\nclass Derived : private Base {\n    friend class boost::serialization::access;\npublic:\n    virtual bool operator==(const Derived &rhs) const {\n        return Base::equals(static_cast<const Base &>(rhs));\n    }\n    Derived(int i = 0) :\n        Base(i)\n    {}\n};\n\n//BOOST_CLASS_EXPORT(Derived)\n\nint\ntest_main( int /* argc */, char* /* argv */[] )\n{\n    const char * testfile = boost::archive::tmpnam(NULL);\n    BOOST_REQUIRE(NULL != testfile);\n\n    Derived a(1), a1(2);\n    {\n        test_ostream os(testfile, TEST_STREAM_FLAGS);\n        test_oarchive oa(os, TEST_ARCHIVE_FLAGS);\n        oa << boost::serialization::make_nvp(\"a\", a);\n    }\n    {\n        test_istream is(testfile, TEST_STREAM_FLAGS);\n        test_iarchive ia(is, TEST_ARCHIVE_FLAGS);\n        ia >> boost::serialization::make_nvp(\"a\", a1);\n    }\n    BOOST_CHECK_EQUAL(a, a1);\n    std::remove(testfile);\n\n    //Base *ta = static_cast<Base *>(&a);\n    //Base *ta1 = NULL;\n\n    Derived *ta = &a;\n    Derived *ta1 = NULL;\n\n    {\n        test_ostream os(testfile, TEST_STREAM_FLAGS);\n        test_oarchive oa(os, TEST_ARCHIVE_FLAGS);\n        oa << boost::serialization::make_nvp(\"ta\", ta);\n    }\n    {\n        test_istream is(testfile, TEST_STREAM_FLAGS);\n        test_iarchive ia(is, TEST_ARCHIVE_FLAGS);\n        ia >> boost::serialization::make_nvp(\"ta\", ta1);\n    }\n    BOOST_CHECK(ta != ta1);\n    BOOST_CHECK(*ta == *ta1);\n    //BOOST_CHECK(*static_cast<Derived *>(ta) == *static_cast<Derived *>(ta1));\n\n    std::remove(testfile);\n\n    return 0;\n}\n"
  },
  {
    "path": "test/test_private_ctor.cpp",
    "content": "/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// test_private_ctor.cpp\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n#include <sstream>\n\n#include \"test_tools.hpp\"\n\n#include <boost/serialization/vector.hpp>\n\n#include <boost/archive/text_iarchive.hpp>\n#include <boost/archive/text_oarchive.hpp>\n\nclass V {\nprivate:\n    friend int test_main(int /* argc */, char * /* argv */[]);\n    friend class boost::serialization::access;\n    int m_i;\n    V() :\n        m_i(0)\n    {}\n    template<class Archive>\n    void serialize(Archive& ar, unsigned /*version*/)\n    {\n        ar & m_i;\n    }\npublic:\n    ~V(){}\n    bool operator==(const V & v) const {\n        return m_i == v.m_i;\n    }\n};\n\nint test_main(int /* argc */, char * /* argv */[])\n{\n    std::stringstream ss;\n    const V v;\n    {\n        boost::archive::text_oarchive oa(ss);\n        oa << v;\n        ss.flush();\n    }\n    V v1;\n    {\n        boost::archive::text_iarchive ia(ss);\n        ia >> v1;\n    }\n    BOOST_CHECK(v == v1);\n\n    const V *vptr = & v;\n    {\n        boost::archive::text_oarchive oa(ss);\n        oa << vptr;\n        ss.flush();\n    }\n    V *vptr1;\n    {\n        boost::archive::text_iarchive ia(ss);\n        ia >> vptr1;\n    }\n    BOOST_CHECK(*vptr == *vptr1);\n\n    return EXIT_SUCCESS;\n}\n"
  },
  {
    "path": "test/test_queue.cpp",
    "content": "/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// test_queue.cpp\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n// should pass compilation and execution\n\n#include <cstddef>\n#include <fstream>\n\n#include <cstdio> // remove\n#include <boost/config.hpp>\n#if defined(BOOST_NO_STDC_NAMESPACE)\nnamespace std{\n    using ::remove;\n}\n#endif\n\n#include <boost/archive/archive_exception.hpp>\n#include \"test_tools.hpp\"\n\n#include <boost/serialization/deque.hpp>\n#include <boost/serialization/queue.hpp>\n\n#include \"A.hpp\"\n#include \"A.ipp\"\n\nint test_main( int /* argc */, char* /* argv */[] )\n{\n    const char * testfile = boost::archive::tmpnam(NULL);\n    BOOST_REQUIRE(NULL != testfile);\n\n    // test array of objects\n    std::queue<A> aqueue, aqueue1;\n    aqueue.push(A());\n    aqueue.push(A());\n    {\n        test_ostream os(testfile, TEST_STREAM_FLAGS);\n        test_oarchive oa(os, TEST_ARCHIVE_FLAGS);\n        oa << boost::serialization::make_nvp(\"aqueue\",aqueue);\n    }\n    {\n        test_istream is(testfile, TEST_STREAM_FLAGS);\n        test_iarchive ia(is, TEST_ARCHIVE_FLAGS);\n        ia >> boost::serialization::make_nvp(\"aqueue\",aqueue1);\n    }\n    BOOST_CHECK(aqueue == aqueue1);\n\n    std::remove(testfile);\n    return EXIT_SUCCESS;\n}\n\n// EOF\n"
  },
  {
    "path": "test/test_recursion.cpp",
    "content": "/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// test_recurrsion.cpp\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n// should pass compilation and execution\n\n#include <cstddef> // NULL\n#include <cstdio> // remove\n#include <fstream>\n\n#include <boost/config.hpp>\n#if defined(BOOST_NO_STDC_NAMESPACE)\nnamespace std{\n    using ::remove;\n}\n#endif\n\n#include \"test_tools.hpp\"\n\n#include \"J.hpp\"\n#include \"A.ipp\"\n\nint test_main( int /* argc */, char* /* argv */[] )\n{\n    const char * testfile = boost::archive::tmpnam(NULL);\n    BOOST_REQUIRE(NULL != testfile);\n\n    // test recursive structure\n    J j, j1;\n    j.j = &j;\n\n    {\n        test_ostream os(testfile, TEST_STREAM_FLAGS);\n        test_oarchive oa(os, TEST_ARCHIVE_FLAGS);\n        oa << BOOST_SERIALIZATION_NVP(j);\n    }\n    {\n        test_istream is(testfile, TEST_STREAM_FLAGS);\n        test_iarchive ia(is, TEST_ARCHIVE_FLAGS);\n        ia >> BOOST_SERIALIZATION_NVP(j1);\n    }\n    BOOST_CHECK(j == j1);\n    std::remove(testfile);\n    return EXIT_SUCCESS;\n}\n\n// EOF\n"
  },
  {
    "path": "test/test_registered.cpp",
    "content": "/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// test_registered.cpp\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n// should pass compilation and execution\n\n#include <cstddef> // NULL\n#include <cstdio> // remove\n#include <fstream>\n\n#include <boost/config.hpp>\n#if defined(BOOST_NO_STDC_NAMESPACE)\nnamespace std{\n    using ::remove;\n}\n#endif\n\n#include <boost/archive/archive_exception.hpp>\n#include \"test_tools.hpp\"\n\n#include <boost/serialization/base_object.hpp>\n#include <boost/serialization/type_info_implementation.hpp>\n\nclass polymorphic_base\n{\n    friend class boost::serialization::access;\n    template<class Archive>\n    void serialize(Archive & /* ar */, const unsigned int /* file_version */){\n    }\npublic:\n    virtual ~polymorphic_base(){};\n};\n\nclass polymorphic_derived1 : public polymorphic_base\n{\n    friend class boost::serialization::access;\n    template<class Archive>\n    void serialize(Archive &ar, const unsigned int /* file_version */){\n        ar & BOOST_SERIALIZATION_BASE_OBJECT_NVP(polymorphic_base);\n    }\n};\n\nclass polymorphic_derived2 : public polymorphic_base\n{\n    friend class boost::serialization::access;\n    template<class Archive>\n    void serialize(Archive &ar, const unsigned int /* file_version */){\n        ar & BOOST_SERIALIZATION_BASE_OBJECT_NVP(polymorphic_base);\n    }\n};\n\n// save derived polymorphic class\nvoid save_derived(const char *testfile)\n{\n    test_ostream os(testfile, TEST_STREAM_FLAGS);\n    test_oarchive oa(os, TEST_ARCHIVE_FLAGS);\n\n    polymorphic_derived1 *rd1 = new polymorphic_derived1;\n    polymorphic_derived2 *rd2 = new polymorphic_derived2;\n\n    // registration IS necessary when serializing pointers of\n    // polymorphic classes\n    oa.register_type(static_cast<polymorphic_derived1 *>(NULL));\n    oa.register_type(static_cast<polymorphic_derived2 *>(NULL));\n    oa << BOOST_SERIALIZATION_NVP(rd1);\n    oa << BOOST_SERIALIZATION_NVP(rd2);\n\n    // the above operation registers the derived classes as a side\n    // effect.  Hence, instances can now be correctly serialized through\n    // a base class pointer.\n    polymorphic_base *rb1 =  rd1;\n    polymorphic_base *rb2 =  rd2;\n    oa << BOOST_SERIALIZATION_NVP(rb1);\n    oa << BOOST_SERIALIZATION_NVP(rb2);\n\n    delete rd1;\n    delete rd2;\n}\n\n// save derived polymorphic class\nvoid load_derived(const char *testfile)\n{\n    test_istream is(testfile, TEST_STREAM_FLAGS);\n    test_iarchive ia(is, TEST_ARCHIVE_FLAGS);\n\n    polymorphic_derived1 *rd1 = NULL;\n    polymorphic_derived2 *rd2 = NULL;\n\n    // registration IS necessary when serializing pointers of\n    // polymorphic classes\n    ia.register_type(static_cast<polymorphic_derived1 *>(NULL));\n    ia.register_type(static_cast<polymorphic_derived2 *>(NULL));\n\n    ia >> BOOST_SERIALIZATION_NVP(rd1);\n\n    const boost::serialization::extended_type_info * p1;\n    p1 = & boost::serialization::type_info_implementation<polymorphic_derived1>\n        ::type::get_const_instance();\n\n    BOOST_CHECK(NULL != p1);\n\n    const boost::serialization::extended_type_info * p2;\n    p2 = boost::serialization::type_info_implementation<polymorphic_derived1>\n        ::type::get_const_instance().get_derived_extended_type_info(*rd1);\n\n    BOOST_CHECK(NULL != p2);\n\n    BOOST_CHECK_MESSAGE(p1 == p2, \"restored pointer d1 not of correct type\");\n\n    ia >> BOOST_SERIALIZATION_NVP(rd2);\n\n    BOOST_CHECK_MESSAGE(\n        & boost::serialization::type_info_implementation<polymorphic_derived2>\n            ::type::get_const_instance()\n        ==\n        boost::serialization::type_info_implementation<polymorphic_derived2>\n            ::type::get_const_instance().get_derived_extended_type_info(*rd2),\n        \"restored pointer d2 not of correct type\"\n    );\n\n    polymorphic_base *rb1 = NULL;\n    polymorphic_base *rb2 = NULL;\n\n    // the above operation registers the derived classes as a side\n    // effect.  Hence, instances can now be correctly serialized through\n    // a base class pointer.\n    ia >> BOOST_SERIALIZATION_NVP(rb1);\n\n    BOOST_CHECK_MESSAGE(\n        rb1 == dynamic_cast<polymorphic_base *>(rd1),\n        \"serialized pointers not correctly restored\"\n    );\n\n    p1 = & boost::serialization::type_info_implementation<polymorphic_derived1>\n        ::type::get_const_instance();\n\n    BOOST_CHECK(NULL != p1);\n\n    p2 = boost::serialization::type_info_implementation<polymorphic_base>\n        ::type::get_const_instance().get_derived_extended_type_info(*rb1);\n\n    BOOST_CHECK(NULL != p2);\n\n    BOOST_CHECK_MESSAGE(p1 == p2, \"restored pointer b1 not of correct type\");\n\n    ia >> BOOST_SERIALIZATION_NVP(rb2);\n\n    BOOST_CHECK_MESSAGE(\n        rb2 ==  dynamic_cast<polymorphic_base *>(rd2),\n        \"serialized pointers not correctly restored\"\n    );\n\n    BOOST_CHECK_MESSAGE(\n        & boost::serialization::type_info_implementation<polymorphic_derived2>\n            ::type::get_const_instance()\n        == boost::serialization::type_info_implementation<polymorphic_base>\n            ::type::get_const_instance().get_derived_extended_type_info(*rb2),\n        \"restored pointer b2 not of correct type\"\n    );\n\n    delete rb1;\n    delete rb2;\n}\n\n// save registered polymorphic class\nvoid save_registered(const char *testfile)\n{\n    test_ostream os(testfile, TEST_STREAM_FLAGS);\n    test_oarchive oa(os, TEST_ARCHIVE_FLAGS);\n\n    polymorphic_base *rb1 = new polymorphic_derived1;\n    polymorphic_base *rb2 = new polymorphic_derived2;\n\n    // registration (forward declaration) will permit correct serialization\n    // through a pointer to a base class\n    oa.register_type(static_cast<polymorphic_derived1 *>(NULL));\n    oa.register_type(static_cast<polymorphic_derived2 *>(NULL));\n    oa << BOOST_SERIALIZATION_NVP(rb1) << BOOST_SERIALIZATION_NVP(rb2);\n\n    delete rb1;\n    delete rb2;\n}\n\n// save registered polymorphic class\nvoid load_registered(const char *testfile)\n{\n    test_istream is(testfile, TEST_STREAM_FLAGS);\n    test_iarchive ia(is, TEST_ARCHIVE_FLAGS);\n\n    polymorphic_base *rb1 = NULL;\n    polymorphic_base *rb2 = NULL;\n\n    // registration (forward declaration) will permit correct serialization\n    // through a pointer to a base class\n    ia.register_type(static_cast<polymorphic_derived1 *>(NULL));\n    ia.register_type(static_cast<polymorphic_derived2 *>(NULL));\n    ia >> BOOST_SERIALIZATION_NVP(rb1) >> BOOST_SERIALIZATION_NVP(rb2);\n\n    BOOST_CHECK_MESSAGE(\n        & boost::serialization::type_info_implementation<polymorphic_derived1>\n            ::type::get_const_instance()\n        == boost::serialization::type_info_implementation<polymorphic_base>\n            ::type::get_const_instance().get_derived_extended_type_info(*rb1),\n        \"restored pointer b1 not of correct type\"\n    );\n\n    BOOST_CHECK_MESSAGE(\n        & boost::serialization::type_info_implementation<polymorphic_derived2>\n            ::type::get_const_instance()\n        == boost::serialization::type_info_implementation<polymorphic_base>\n            ::type::get_const_instance().get_derived_extended_type_info(*rb2),\n        \"restored pointer b2 not of correct type\"\n    );\n\n    delete rb1;\n    delete rb2;\n}\n\nint\ntest_main( int /* argc */, char* /* argv */[] )\n{\n    const char * testfile = boost::archive::tmpnam(NULL);\n\n    BOOST_REQUIRE(NULL != testfile);\n\n    save_derived(testfile);\n    load_derived(testfile);\n    save_registered(testfile);\n    load_registered(testfile);\n\n    std::remove(testfile);\n    return EXIT_SUCCESS;\n}\n\n// EOF\n"
  },
  {
    "path": "test/test_reset_object_address.cpp",
    "content": "/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// test_reset_object_address.cpp\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n#include <sstream>\n#include <cassert>\n#include <cstdlib> // for rand()\n#include <cstddef> // size_t\n\n#include <boost/config.hpp>\n#if defined(BOOST_NO_STDC_NAMESPACE)\nnamespace std{\n    using ::rand;\n    using ::size_t;\n}\n#endif\n\n#include \"test_tools.hpp\"\n\n#include <boost/archive/text_oarchive.hpp>\n#include <boost/archive/text_iarchive.hpp>\n#include <boost/archive/polymorphic_text_oarchive.hpp>\n#include <boost/archive/polymorphic_text_iarchive.hpp>\n\n#include <boost/serialization/list.hpp>\n#include <boost/serialization/access.hpp>\n\n// Someday, maybe all tests will be converted to the unit test framework.\n// but for now use the text execution monitor to be consistent with all\n// the other tests.\n\n// simple test of untracked value\n#include \"A.hpp\"\n#include \"A.ipp\"\n\nvoid test1(){\n    std::stringstream ss;\n    const A a;\n    {\n        boost::archive::text_oarchive oa(ss);\n        oa << a;\n        ss.flush();\n    }\n    A a1;\n    {\n        boost::archive::text_iarchive ia(ss);\n        // load to temporary\n        A a2;\n        ia >> a2;\n        BOOST_CHECK_EQUAL(a, a2);\n        // move to final destination\n        a1 = a2;\n        ia.reset_object_address(& a1, & a2);\n    }\n    BOOST_CHECK_EQUAL(a, a1);\n}\n\n// simple test of tracked value\nclass B {\n    friend class boost::serialization::access;\n    int m_i;\n    template<class Archive>\n    void serialize(Archive &ar, const unsigned int /*file_version*/){\n        ar & m_i;\n    }\npublic:\n    bool operator==(const B & rhs) const {\n        return m_i == rhs.m_i;\n    }\n    B() :\n        m_i(std::rand())\n    {}\n};\n\n//BOOST_TEST_DONT_PRINT_LOG_VALUE( B )\n\nvoid test2(){\n    std::stringstream ss;\n    B const b;\n    B const * const b_ptr = & b;\n    BOOST_CHECK_EQUAL(& b, b_ptr);\n    {\n        boost::archive::text_oarchive oa(ss);\n        oa << b;\n        oa << b_ptr;\n        ss.flush();\n    }\n    B b1;\n    B * b1_ptr;\n    {\n        boost::archive::text_iarchive ia(ss);\n        // load to temporary\n        B b2;\n        ia >> b2;\n        BOOST_CHECK_EQUAL(b, b2);\n        // move to final destination\n        b1 = b2;\n        ia.reset_object_address(& b1, & b2);\n        ia >> b1_ptr;\n    }\n    BOOST_CHECK_EQUAL(b, b1);\n    BOOST_CHECK_EQUAL(& b1, b1_ptr);\n}\n\n// check that nested member values are properly moved\nclass D {\n    friend class boost::serialization::access;\n    template<class Archive>\n    void serialize(Archive &ar, const unsigned int /*file_version*/){\n        ar & m_b;\n    }\npublic:\n    B m_b;\n    bool operator==(const D & rhs) const {\n        return m_b == rhs.m_b;\n    }\n    D(){}\n};\n\n//BOOST_TEST_DONT_PRINT_LOG_VALUE( D )\n\nvoid test3(){\n    std::stringstream ss;\n    D const d;\n    B const * const b_ptr = & d.m_b;\n    {\n        boost::archive::text_oarchive oa(ss);\n        oa << d;\n        oa << b_ptr;\n        ss.flush();\n    }\n    D d1;\n    B * b1_ptr;\n    {\n        boost::archive::text_iarchive ia(ss);\n        D d2;\n        ia >> d2;\n        d1 = d2;\n        ia.reset_object_address(& d1, & d2);\n        ia >> b1_ptr;\n    }\n    BOOST_CHECK_EQUAL(d, d1);\n    BOOST_CHECK_EQUAL(* b_ptr, * b1_ptr);\n}\n\n// check that data pointed to by pointer members is NOT moved\nclass E {\n    int m_i;\n    friend class boost::serialization::access;\n    template<class Archive>\n    void serialize(Archive &ar, const unsigned int /*file_version*/){\n        ar & m_i;\n    }\npublic:\n    bool operator==(const E &rhs) const {\n        return m_i == rhs.m_i;\n    }\n    E() :\n        m_i(std::rand())\n    {}\n    E(const E & rhs) :\n        m_i(rhs.m_i)\n    {}\n};\n//BOOST_TEST_DONT_PRINT_LOG_VALUE( E )\n\n// check that moves don't move stuff pointed to\nclass F {\n    friend class boost::serialization::access;\n    E * m_eptr;\n    template<class Archive>\n    void serialize(Archive &ar, const unsigned int /*file_version*/){\n        ar & m_eptr;\n    }\npublic:\n    bool operator==(const F &rhs) const {\n        return *m_eptr == *rhs.m_eptr;\n    }\n    F & operator=(const F & rhs) {\n        * m_eptr = * rhs.m_eptr;\n        return *this;\n    }\n    F(){\n        m_eptr = new E;\n    }\n    F(const F & rhs){\n        *this = rhs;\n    }\n    ~F(){\n        delete m_eptr;\n    }\n};\n\n//BOOST_TEST_DONT_PRINT_LOG_VALUE( F )\n\nvoid test4(){\n    std::stringstream ss;\n    const F f;\n    {\n        boost::archive::text_oarchive oa(ss);\n        oa << f;\n        ss.flush();\n    }\n    F f1;\n    {\n        boost::archive::text_iarchive ia(ss);\n        F f2;\n        ia >> f2;\n        f1 = f2;\n        ia.reset_object_address(& f1, & f2);\n    }\n    BOOST_CHECK_EQUAL(f, f1);\n}\n\n// check that multiple moves keep track of the correct target\nclass G {\n    friend class boost::serialization::access;\n    A m_a1;\n    A m_a2;\n    A *m_pa2;\n    template<class Archive>\n    void save(Archive &ar, const unsigned int /*file_version*/) const {\n        ar << m_a1;\n        ar << m_a2;\n        ar << m_pa2;\n    }\n    template<class Archive>\n    void load(Archive &ar, const unsigned int /*file_version*/){\n        A a; // temporary A\n        ar >> a;\n        m_a1 = a;\n        ar.reset_object_address(& m_a1, & a);\n        ar >> a;\n        m_a2 = a;\n        ar.reset_object_address(& m_a2, & a);\n        ar & m_pa2;\n    }\n    BOOST_SERIALIZATION_SPLIT_MEMBER()\npublic:\n    bool operator==(const G &rhs) const {\n        return\n            m_a1 == rhs.m_a1\n            && m_a2 == rhs.m_a2\n            && *m_pa2 == *rhs.m_pa2;\n    }\n    G & operator=(const G & rhs) {\n        m_a1 = rhs.m_a1;\n        m_a2 = rhs.m_a2;\n        m_pa2 = & m_a2;\n        return *this;\n    }\n    G(){\n        m_pa2 = & m_a2;\n    }\n    G(const G & rhs){\n        *this = rhs;\n    }\n    ~G(){}\n};\n\n//BOOST_TEST_DONT_PRINT_LOG_VALUE( G )\n\nvoid test5(){\n    std::stringstream ss;\n    const G g;\n    {\n        boost::archive::text_oarchive oa(ss);\n        oa << g;\n        ss.flush();\n    }\n    G g1;\n    {\n        boost::archive::text_iarchive ia(ss);\n        ia >> g1;\n    }\n    BOOST_CHECK_EQUAL(g, g1);\n}\n\n// joaquin's test - this tests the case where rest_object_address\n// is applied to an item which in fact is not tracked so that\n// the call is in fact superfluous.\nstruct foo\n{\n  int x;\n\nprivate:\n  friend class boost::serialization::access;\n\n  template<class Archive>\n  void serialize(Archive &,const unsigned int)\n  {\n  }\n};\n\nstruct bar\n{\n  foo  f[2];\n  foo* pf[2];\n\nprivate:\n  friend class boost::serialization::access;\n  BOOST_SERIALIZATION_SPLIT_MEMBER()\n\n  template<class Archive>\n  void save(Archive& ar,const unsigned int)const\n  {\n    for(int i=0;i<2;++i){\n      ar<<f[i].x;\n      ar<<f[i];\n    }\n    for(int j=0;j<2;++j){\n      ar<<pf[j];\n    }\n  }\n\n  template<class Archive>\n  void load(Archive& ar,const unsigned int)\n  {\n    for(int i=0;i<2;++i){\n      int x;\n      ar>>x;\n      f[i].x=x;\n      ar.reset_object_address(&f[i].x,&x);\n      ar>>f[i];\n    }\n    for(int j=0;j<2;++j){\n      ar>>pf[j];\n    }\n  }\n};\n\nint test6()\n{\n  bar b;\n  b.f[0].x=0;\n  b.f[1].x=1;\n  b.pf[0]=&b.f[0];\n  b.pf[1]=&b.f[1];\n\n  std::ostringstream oss;\n  {\n    boost::archive::text_oarchive oa(oss);\n    oa<<const_cast<const bar&>(b);\n    oss.flush();\n  }\n\n  bar b1;\n  b1.pf[0]=0;\n  b1.pf[1]=0;\n\n  std::istringstream iss(oss.str());\n  boost::archive::text_iarchive ia(iss);\n  ia>>b1;\n  BOOST_CHECK(b1.pf[0]==&b1.f[0]&&b1.pf[1]==&b1.f[1]);\n\n  return 0;\n}\n\n// test one of the collections\nvoid test7(){\n    std::stringstream ss;\n    B const b;\n    B const * const b_ptr = & b;\n    BOOST_CHECK_EQUAL(& b, b_ptr);\n    {\n        std::list<const B *> l;\n        l.push_back(b_ptr);\n        boost::archive::text_oarchive oa(ss);\n        oa << const_cast<const std::list<const B *> &>(l);\n        ss.flush();\n    }\n    B b1;\n    {\n        std::list<B *> l;\n        boost::archive::text_iarchive ia(ss);\n        ia >> l;\n        delete l.front(); // prevent memory leak\n    }\n}\n\n// test one of the collections with polymorphic archive\nvoid test8(){\n    std::stringstream ss;\n    B const b;\n    B const * const b_ptr = & b;\n    BOOST_CHECK_EQUAL(& b, b_ptr);\n    {\n        std::list<const B *> l;\n        l.push_back(b_ptr);\n        boost::archive::polymorphic_text_oarchive oa(ss);\n        boost::archive::polymorphic_oarchive & poa = oa;\n        poa << const_cast<const std::list<const B *> &>(l);\n    }\n    B b1;\n    {\n        std::list<B *> l;\n        boost::archive::polymorphic_text_iarchive ia(ss);\n        boost::archive::polymorphic_iarchive & pia = ia;\n        pia >> l;\n        delete l.front(); // prevent memory leak\n    }\n}\n\nint test_main(int /* argc */, char * /* argv */[])\n{\n    test1();\n    test2();\n    test3();\n    test4();\n    test5();\n    test6();\n    test7();\n    test8();\n    return EXIT_SUCCESS;\n}\n"
  },
  {
    "path": "test/test_set.cpp",
    "content": "/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// test_set.cpp\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .\n// (C) Copyright 2014 Jim Bell\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n// should pass compilation and execution\n\n#include <cstddef> // NULLsize_t\n#include <cstdio> // remove\n#include <fstream>\n\n#include <algorithm> // std::copy\n#include <vector>\n\n#include <boost/config.hpp>\n#if defined(BOOST_NO_STDC_NAMESPACE)\nnamespace std{\n    using ::size_t;\n}\n#endif\n\n#include <boost/detail/workaround.hpp>\n#if defined(BOOST_NO_STDC_NAMESPACE)\nnamespace std{\n    using ::remove;\n}\n#endif\n\n#include <boost/archive/archive_exception.hpp>\n\n#include \"test_tools.hpp\"\n\n#include <boost/serialization/nvp.hpp>\n#include <boost/serialization/set.hpp>\n\n#include \"A.hpp\"\n#include \"A.ipp\"\n\nvoid\ntest_set(){\n    const char * testfile = boost::archive::tmpnam(NULL);\n    BOOST_REQUIRE(NULL != testfile);\n\n    // test array of objects\n    std::set<A> aset;\n    aset.insert(A());\n    aset.insert(A());\n    const A * a_ptr = & * aset.begin();\n    {\n        test_ostream os(testfile, TEST_STREAM_FLAGS);\n        test_oarchive oa(os, TEST_ARCHIVE_FLAGS);\n        oa << boost::serialization::make_nvp(\"aset\", aset);\n        // serialize a pointer into the set\n        oa << boost::serialization::make_nvp(\"a_ptr\", a_ptr);\n    }\n    std::set<A> aset1;\n    A * a_ptr1;\n    {\n        test_istream is(testfile, TEST_STREAM_FLAGS);\n        test_iarchive ia(is, TEST_ARCHIVE_FLAGS);\n        ia >> boost::serialization::make_nvp(\"aset\", aset1);\n        // deserialize a pointer into the set\n        ia >> boost::serialization::make_nvp(\"a_ptr1\", a_ptr1);\n    }\n    BOOST_CHECK_EQUAL(aset, aset1);\n    BOOST_CHECK_EQUAL(*a_ptr1, * aset1.begin());\n    BOOST_CHECK_EQUAL(a_ptr1, & * aset1.begin());\n    std::remove(testfile);\n}\n\nvoid\ntest_multiset(){\n    const char * testfile = boost::archive::tmpnam(NULL);\n    BOOST_REQUIRE(NULL != testfile);\n\n    std::multiset<A> amultiset;\n    amultiset.insert(A());\n    amultiset.insert(A());\n    const A * a_ptr = & * amultiset.begin();\n    {\n        test_ostream os(testfile, TEST_STREAM_FLAGS);\n        test_oarchive oa(os, TEST_ARCHIVE_FLAGS);\n        oa << boost::serialization::make_nvp(\"amultiset\", amultiset);\n        // serialize a pointer into the set\n        oa << boost::serialization::make_nvp(\"a_ptr\", a_ptr);\n    }\n    std::multiset<A> amultiset1;\n    A * a_ptr1;\n    {\n        test_istream is(testfile, TEST_STREAM_FLAGS);\n        test_iarchive ia(is, TEST_ARCHIVE_FLAGS);\n        ia >> boost::serialization::make_nvp(\"amultiset\", amultiset1);\n        // deserialize a pointer into the set\n        ia >> boost::serialization::make_nvp(\"a_ptr1\", a_ptr1);\n    }\n    BOOST_CHECK(amultiset == amultiset1);\n    BOOST_CHECK_EQUAL(*a_ptr1, * amultiset1.begin());\n    BOOST_CHECK_EQUAL(a_ptr1, & * amultiset1.begin());\n    std::remove(testfile);\n}\n\nint test_main( int /* argc */, char* /* argv */[] ){\n    test_set();\n    test_multiset();\n\n    return EXIT_SUCCESS;\n}\n"
  },
  {
    "path": "test/test_set_hashed.cpp",
    "content": "/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// test_set.cpp\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .\n// (C) Copyright 2014 Jim Bell\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n// should pass compilation and execution\n\n#include <cstddef> // NULLsize_t\n#include <cstdio> // remove\n#include <fstream>\n\n#include <algorithm> // std::copy\n#include <vector>\n\n#include <boost/config.hpp>\n\n#include <boost/detail/workaround.hpp>\n#if defined(BOOST_NO_STDC_NAMESPACE)\nnamespace std{\n    using ::remove;\n    using ::size_t;\n}\n#endif\n\n#include \"test_tools.hpp\"\n\n#include <boost/serialization/nvp.hpp>\n#include <boost/serialization/hash_set.hpp>\n\n#include \"A.hpp\"\n#include \"A.ipp\"\n\n#ifndef BOOST_HAS_HASH\n#error \"BOOST_HAS_HASH not defined!\"\n#endif\n\n#include BOOST_HASH_SET_HEADER\n\nnamespace BOOST_STD_EXTENSION_NAMESPACE {\n    template<>\n    struct hash<A> {\n        std::size_t operator()(const A& a) const {\n            return static_cast<std::size_t>(a);\n        }\n    };\n}\n\nvoid\ntest_hash_set(){\n    const char * testfile = boost::archive::tmpnam(NULL);\n    BOOST_REQUIRE(NULL != testfile);\n\n    // test array of objects\n    BOOST_STD_EXTENSION_NAMESPACE::hash_set<A> ahash_set;\n    A a, a1;\n    ahash_set.insert(a);\n    ahash_set.insert(a1);\n    {\n        test_ostream os(testfile, TEST_STREAM_FLAGS);\n        test_oarchive oa(os, TEST_ARCHIVE_FLAGS);\n        oa << boost::serialization::make_nvp(\"ahash_set\", ahash_set);\n    }\n    BOOST_STD_EXTENSION_NAMESPACE::hash_set<A> ahash_set1;\n    {\n        test_istream is(testfile, TEST_STREAM_FLAGS);\n        test_iarchive ia(is, TEST_ARCHIVE_FLAGS);\n        ia >> boost::serialization::make_nvp(\"ahash_set\", ahash_set1);\n    }\n    std::vector<A> tvec, tvec1;\n    tvec.clear();\n    tvec1.clear();\n    std::copy(ahash_set.begin(), ahash_set.end(), std::back_inserter(tvec));\n    std::sort(tvec.begin(), tvec.end());\n    std::copy(ahash_set1.begin(), ahash_set1.end(), std::back_inserter(tvec1));\n    std::sort(tvec1.begin(), tvec1.end());\n    BOOST_CHECK(tvec == tvec1);\n    std::remove(testfile);\n}\n\nvoid\ntest_hash_multiset(){\n    const char * testfile = boost::archive::tmpnam(NULL);\n    BOOST_REQUIRE(NULL != testfile);\n\n    BOOST_STD_EXTENSION_NAMESPACE::hash_multiset<A> ahash_multiset;\n    ahash_multiset.insert(A());\n    ahash_multiset.insert(A());\n    {\n        test_ostream os(testfile, TEST_STREAM_FLAGS);\n        test_oarchive oa(os, TEST_ARCHIVE_FLAGS);\n        oa << boost::serialization::make_nvp(\"ahash_multiset\", ahash_multiset);\n    }\n    BOOST_STD_EXTENSION_NAMESPACE::hash_multiset<A> ahash_multiset1;\n    {\n        test_istream is(testfile, TEST_STREAM_FLAGS);\n        test_iarchive ia(is, TEST_ARCHIVE_FLAGS);\n        ia >> boost::serialization::make_nvp(\"ahash_multiset\", ahash_multiset1);\n    }\n\n    std::vector<A> tvec, tvec1;\n    tvec.clear();\n    tvec1.clear();\n    std::copy(ahash_multiset.begin(), ahash_multiset.end(), std::back_inserter(tvec));\n    std::sort(tvec.begin(), tvec.end());\n    std::copy(ahash_multiset1.begin(), ahash_multiset1.end(), std::back_inserter(tvec1));\n    std::sort(tvec1.begin(), tvec1.end());\n    BOOST_CHECK(tvec == tvec1);\n\n    std::remove(testfile);\n}\n\nint test_main( int /* argc */, char* /* argv */[] ){\n    test_hash_set();\n    test_hash_multiset();\n    return EXIT_SUCCESS;\n}\n"
  },
  {
    "path": "test/test_shared_ptr.cpp",
    "content": "/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// test_shared_ptr.cpp\n\n// (C) Copyright 2002 Robert Ramey- http://www.rrsd.com - David Tonge  .\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n//\n//  See http://www.boost.org for updates, documentation, and revision history.\n\n#include <cstddef> // NULL\n#include <cstdio> // remove\n#include <fstream>\n\n#include <boost/config.hpp>\n#if defined(BOOST_NO_STDC_NAMESPACE)\nnamespace std{\n    using ::remove;\n}\n#endif\n\n#include <boost/serialization/nvp.hpp>\n#include <boost/serialization/export.hpp>\n#include <boost/serialization/shared_ptr.hpp>\n#include <boost/serialization/weak_ptr.hpp>\n\n#include \"test_tools.hpp\"\n\n// This is a simple class.  It contains a counter of the number\n// of objects of this class which have been instantiated.\nclass A\n{\nprivate:\n    friend class boost::serialization::access;\n    int x;\n    template<class Archive>\n    void serialize(Archive & ar, const unsigned int /* file_version */){\n        ar & BOOST_SERIALIZATION_NVP(x);\n    }\n    A(A const & rhs);\n    A& operator=(A const & rhs);\npublic:\n    static int count;\n    bool operator==(const A & rhs) const {\n        return x == rhs.x;\n    }\n    A(){++count;}    // default constructor\n    virtual ~A(){--count;}   // default destructor\n};\n\nBOOST_SERIALIZATION_SHARED_PTR(A)\n\nint A::count = 0;\n\n// B is a subclass of A\nclass B : public A\n{\nprivate:\n    friend class boost::serialization::access;\n    template<class Archive>\n    void serialize(Archive & ar, const unsigned int /* file_version */){\n        ar & BOOST_SERIALIZATION_BASE_OBJECT_NVP(A);\n    }\npublic:\n    static int count;\n    B() : A() {};\n    virtual ~B() {};\n};\n\n// B needs to be exported because its serialized via a base class pointer\nBOOST_CLASS_EXPORT(B)\nBOOST_SERIALIZATION_SHARED_PTR(B)\n\n// test a non-polymorphic class\nclass C\n{\nprivate:\n    friend class boost::serialization::access;\n    int z;\n    template<class Archive>\n    void serialize(Archive & ar, const unsigned int /* file_version */){\n        ar & BOOST_SERIALIZATION_NVP(z);\n    }\npublic:\n    static int count;\n    bool operator==(const C & rhs) const {\n        return z == rhs.z;\n    }\n    C() :\n        z(++count)    // default constructor\n    {}\n    virtual ~C(){--count;}   // default destructor\n};\n\nint C::count = 0;\n\ntemplate<class SP>\nvoid save(const char * testfile, const SP & spa)\n{\n    test_ostream os(testfile, TEST_STREAM_FLAGS);\n    test_oarchive oa(os, TEST_ARCHIVE_FLAGS);\n    oa << BOOST_SERIALIZATION_NVP(spa);\n}\n\ntemplate<class SP>\nvoid load(const char * testfile, SP & spa)\n{\n    test_istream is(testfile, TEST_STREAM_FLAGS);\n    test_iarchive ia(is, TEST_ARCHIVE_FLAGS);\n    ia >> BOOST_SERIALIZATION_NVP(spa);\n}\n\n// trivial test\ntemplate<class SP>\nvoid save_and_load(SP & spa)\n{\n    const char * testfile = boost::archive::tmpnam(NULL);\n    BOOST_REQUIRE(NULL != testfile);\n    save(testfile, spa);\n    SP spa1;\n    load(testfile, spa1);\n\n    BOOST_CHECK(\n        (spa.get() == NULL && spa1.get() == NULL)\n        || * spa == * spa1\n    );\n    std::remove(testfile);\n}\n\ntemplate<class SP>\nvoid save2(\n    const char * testfile,\n    const SP & first,\n    const SP & second\n){\n    test_ostream os(testfile, TEST_STREAM_FLAGS);\n    test_oarchive oa(os, TEST_ARCHIVE_FLAGS);\n    oa << BOOST_SERIALIZATION_NVP(first);\n    oa << BOOST_SERIALIZATION_NVP(second);\n}\n\ntemplate<class SP>\nvoid load2(\n    const char * testfile,\n    SP & first,\n    SP & second)\n{\n    test_istream is(testfile, TEST_STREAM_FLAGS);\n    test_iarchive ia(is, TEST_ARCHIVE_FLAGS);\n    ia >> BOOST_SERIALIZATION_NVP(first);\n    ia >> BOOST_SERIALIZATION_NVP(second);\n}\n\n// Run tests by serializing two shared_ptrs into an archive,\n// clearing them (deleting the objects) and then reloading the\n// objects back from an archive.\ntemplate<class SP>\nvoid save_and_load2(SP & first, SP & second)\n{\n    const char * testfile = boost::archive::tmpnam(NULL);\n    BOOST_REQUIRE(NULL != testfile);\n\n    save2(testfile, first, second);\n\n    // Clear the pointers, thereby destroying the objects they contain\n    first.reset();\n    second.reset();\n\n    load2(testfile, first, second);\n\n    BOOST_CHECK(first == second);\n    std::remove(testfile);\n}\n\ntemplate<class SP, class WP>\nvoid save3(\n    const char * testfile,\n    SP & first,\n    SP & second,\n    WP & third\n){\n    test_ostream os(testfile, TEST_STREAM_FLAGS);\n    test_oarchive oa(os, TEST_ARCHIVE_FLAGS);\n    oa << BOOST_SERIALIZATION_NVP(third);\n    oa << BOOST_SERIALIZATION_NVP(first);\n    oa << BOOST_SERIALIZATION_NVP(second);\n}\n\ntemplate<class SP, class WP>\nvoid load3(\n    const char * testfile,\n    SP & first,\n    SP & second,\n    WP & third\n){\n    test_istream is(testfile, TEST_STREAM_FLAGS);\n    test_iarchive ia(is, TEST_ARCHIVE_FLAGS);\n    // note that we serialize the weak pointer first\n    ia >> BOOST_SERIALIZATION_NVP(third);\n    // inorder to test that a temporarily solitary weak pointer\n    // correctly restored.\n    ia >> BOOST_SERIALIZATION_NVP(first);\n    ia >> BOOST_SERIALIZATION_NVP(second);\n}\n\ntemplate<class SP, class WP>\nvoid save_and_load3(\n    SP & first,\n    SP & second,\n    WP & third\n){\n    const char * testfile = boost::archive::tmpnam(NULL);\n    BOOST_REQUIRE(NULL != testfile);\n\n    save3(testfile, first, second, third);\n\n    // Clear the pointers, thereby destroying the objects they contain\n    first.reset();\n    second.reset();\n    third.reset();\n\n    load3(testfile, first, second, third);\n\n    BOOST_CHECK(first == second);\n    BOOST_CHECK(first == third.lock());\n    std::remove(testfile);\n}\n\ntemplate<class SP>\nvoid save4(const char * testfile, const SP & spc)\n{\n    test_ostream os(testfile, TEST_STREAM_FLAGS);\n    test_oarchive oa(os, TEST_ARCHIVE_FLAGS);\n    oa << BOOST_SERIALIZATION_NVP(spc);\n}\n\ntemplate<class SP>\nvoid load4(const char * testfile, SP & spc)\n{\n    test_istream is(testfile, TEST_STREAM_FLAGS);\n    test_iarchive ia(is, TEST_ARCHIVE_FLAGS);\n    ia >> BOOST_SERIALIZATION_NVP(spc);\n}\n\n// trivial test\ntemplate<class SP>\nvoid save_and_load4(SP & spc)\n{\n    const char * testfile = boost::archive::tmpnam(NULL);\n    BOOST_REQUIRE(NULL != testfile);\n    save4(testfile, spc);\n    SP spc1;\n    load4(testfile, spc1);\n\n    BOOST_CHECK(\n        (spc.get() == NULL && spc1.get() == NULL)\n        || * spc == * spc1\n    );\n    std::remove(testfile);\n}\n\n// This does the tests\ntemplate<template<class T> class SPT , template<class T> class WPT >\nbool test(){\n    {\n        SPT<A> spa;\n        // These are our shared_ptrs\n        spa = SPT<A>(new A);\n        SPT<A> spa1 = spa;\n        spa1 = spa;\n    }\n    {\n        // These are our shared_ptrs\n        SPT<A> spa;\n\n        // trivial test 1\n        save_and_load(spa);\n\n        // trivial test 2\n        spa = SPT<A>(new A);\n        save_and_load(spa);\n\n        // Try to save and load pointers to As\n        spa = SPT<A>(new A);\n        SPT<A> spa1 = spa;\n        save_and_load2(spa, spa1);\n\n        // Try to save and load pointers to Bs\n        spa = SPT<A>(new B);\n        spa1 = spa;\n        save_and_load2(spa, spa1);\n\n        // test a weak pointer\n        spa = SPT<A>(new A);\n        spa1 = spa;\n        WPT<A> wp = spa;\n        save_and_load3(spa, spa1, wp);\n\n        // obj of type B gets destroyed\n        // as smart_ptr goes out of scope\n    }\n    BOOST_CHECK(A::count == 0);\n    {\n        // Try to save and load pointers to Cs\n        SPT<C> spc;\n        spc = SPT<C>(new C);\n        save_and_load4(spc);\n    }\n    BOOST_CHECK(C::count == 0);\n    return true;\n}\n// This does the tests\nint test_main(int /* argc */, char * /* argv */[])\n{\n    bool result = true;\n    result &= test<boost::shared_ptr, boost::weak_ptr>();\n    #ifndef BOOST_NO_CXX11_SMART_PTR\n    result &= test<std::shared_ptr, std::weak_ptr>();\n    #endif\n    return result ? EXIT_SUCCESS : EXIT_FAILURE;\n}\n\n"
  },
  {
    "path": "test/test_shared_ptr_132.cpp",
    "content": "/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// test_shared_ptr.cpp\n\n// (C) Copyright 2002 Robert Ramey- http://www.rrsd.com - David Tonge  .\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n//\n//  See http://www.boost.org for updates, documentation, and revision history.\n\n#include <cstddef> // NULL\n#include <fstream>\n\n#include <cstdio> // remove\n#include <boost/config.hpp>\n#if defined(BOOST_NO_STDC_NAMESPACE)\nnamespace std{\n    using ::remove;\n}\n#endif\n\n#include \"test_tools.hpp\"\n\n#include <boost/serialization/shared_ptr_132.hpp>\n#include <boost/serialization/shared_ptr.hpp>\n#include <boost/serialization/weak_ptr.hpp>\n#include <boost/serialization/split_member.hpp>\n\n#include <boost/preprocessor/stringize.hpp>\n\n#include <boost/serialization/nvp.hpp>\n#include <boost/serialization/export.hpp>\n\n// This is a simple class.  It contains a counter of the number\n// of objects of this class which have been instantiated.\nclass A\n{\nprivate:\n    friend class boost::serialization::access;\n    int x;\n    template<class Archive>\n    void save(Archive & ar, const unsigned int /* file_version */) const {\n        ar << BOOST_SERIALIZATION_NVP(x);\n    }\n    template<class Archive>\n    void load(Archive & ar, const unsigned int /* file_version */) {\n        ar >> BOOST_SERIALIZATION_NVP(x);\n    }\n    BOOST_SERIALIZATION_SPLIT_MEMBER()\npublic:\n    static int count;\n    bool operator==(const A & rhs) const {\n        return x == rhs.x;\n    }\n    A(){++count;}    // default constructor\n    virtual ~A(){--count;}   // default destructor\n};\n\nBOOST_SERIALIZATION_SHARED_PTR(A)\n\n// B is a subclass of A\nclass B : public A\n{\nprivate:\n    friend class boost::serialization::access;\n    template<class Archive>\n    void save(Archive & ar, const unsigned int /* file_version */ )const {\n        ar << BOOST_SERIALIZATION_BASE_OBJECT_NVP(A);\n    }\n    template<class Archive>\n    void load(Archive & ar, const unsigned int /* file_version */){\n        ar >> BOOST_SERIALIZATION_BASE_OBJECT_NVP(A);\n    }\n    BOOST_SERIALIZATION_SPLIT_MEMBER()\npublic:\n    static int count;\n    B() : A() {};\n    virtual ~B() {};\n};\n\n// B needs to be exported because its serialized via a base class pointer\nBOOST_SHARED_POINTER_EXPORT(B)\nBOOST_SERIALIZATION_SHARED_PTR(B)\n\nint A::count = 0;\n\ntemplate<class T>\nvoid save(const char * testfile, const T & spa)\n{\n    test_ostream os(testfile, TEST_STREAM_FLAGS);\n    test_oarchive oa(os, TEST_ARCHIVE_FLAGS);\n    oa << BOOST_SERIALIZATION_NVP(spa);\n}\n\ntemplate<class T>\nvoid load(const char * testfile, T & spa)\n{\n    test_istream is(testfile, TEST_STREAM_FLAGS);\n    test_iarchive ia(is, TEST_ARCHIVE_FLAGS);\n    ia >> BOOST_SERIALIZATION_NVP(spa);\n}\n\n// trivial test\ntemplate<class T>\nvoid save_and_load(const T & spa)\n{\n    const char * testfile = boost::archive::tmpnam(NULL);\n    BOOST_REQUIRE(NULL != testfile);\n    save(testfile, spa);\n\n    // note that we're loading to a current version of shared_ptr\n    // regardless of the original saved type - this tests backward\n    // archive compatibility\n    boost::shared_ptr<A> spa1;\n    load(testfile, spa1);\n\n    BOOST_CHECK(\n        (spa.get() == NULL && spa1.get() == NULL)\n        || * spa == * spa1\n    );\n    std::remove(testfile);\n}\n\ntemplate<class T>\nvoid save2(\n    const char * testfile,\n    const T & first,\n    const T & second\n){\n    test_ostream os(testfile, TEST_STREAM_FLAGS);\n    test_oarchive oa(os, TEST_ARCHIVE_FLAGS);\n    oa << BOOST_SERIALIZATION_NVP(first);\n    oa << BOOST_SERIALIZATION_NVP(second);\n}\n\ntemplate<class T>\nvoid load2(\n    const char * testfile,\n    T & first,\n    T & second)\n{\n    test_istream is(testfile, TEST_STREAM_FLAGS);\n    test_iarchive ia(is, TEST_ARCHIVE_FLAGS);\n    ia >> BOOST_SERIALIZATION_NVP(first);\n    ia >> BOOST_SERIALIZATION_NVP(second);\n}\n\n// Run tests by serializing two shared_ptrs into an archive,\n// clearing them (deleting the objects) and then reloading the\n// objects back from an archive.\ntemplate<class T>\nvoid save_and_load2(T & first, T & second)\n{\n    const char * testfile = boost::archive::tmpnam(NULL);\n    BOOST_REQUIRE(NULL != testfile);\n\n    save2(testfile, first, second);\n\n    // Clear the pointers, thereby destroying the objects they contain\n    first.reset();\n    second.reset();\n\n    boost::shared_ptr<A> first1, second1;\n    load2(testfile, first1, second1);\n\n    BOOST_CHECK(first1 == second1);\n    std::remove(testfile);\n}\n\ntemplate<class T>\nvoid save3(\n    const char * testfile,\n    const T & first,\n    const T & second,\n    const T & third\n){\n    test_ostream os(testfile, TEST_STREAM_FLAGS);\n    test_oarchive oa(os, TEST_ARCHIVE_FLAGS);\n    oa << BOOST_SERIALIZATION_NVP(third);\n    oa << BOOST_SERIALIZATION_NVP(first);\n    oa << BOOST_SERIALIZATION_NVP(second);\n}\n\ntemplate<class T>\nvoid load3(\n    const char * testfile,\n    T & first,\n    T & second,\n    T & third\n){\n    test_istream is(testfile, TEST_STREAM_FLAGS);\n    test_iarchive ia(is, TEST_ARCHIVE_FLAGS);\n    // note that we serialize the weak pointer first\n    ia >> BOOST_SERIALIZATION_NVP(third);\n    // inorder to test that a temporarily solitary weak pointer\n    // correctly restored.\n    ia >> BOOST_SERIALIZATION_NVP(first);\n    ia >> BOOST_SERIALIZATION_NVP(second);\n}\n\n// This does the tests\nint test_main(int /* argc */, char * /* argv */[])\n{\n    // These are our shared_ptrs\n    boost_132::shared_ptr<A> spa;\n\n    // trivial test 1\n    save_and_load(spa);\n\n    //trivial test 2\n    spa.reset();\n    spa = boost_132::shared_ptr<A>(new A);\n    save_and_load(spa);\n\n    // Try to save and load pointers to As, to a text archive\n    spa = boost_132::shared_ptr<A>(new A);\n    boost_132::shared_ptr<A> spa1 = spa;\n    save_and_load2(spa, spa1);\n\n    // Try to save and load pointers to Bs, to a text archive\n    spa = boost_132::shared_ptr<A>(new B);\n    save_and_load(spa);\n\n    spa1 = spa;\n    save_and_load2(spa, spa1);\n\n    // obj of type B gets destroyed\n    // as smart_ptr goes out of scope\n    return EXIT_SUCCESS;\n}\n"
  },
  {
    "path": "test/test_shared_ptr_multi_base.cpp",
    "content": "/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// test_shared_ptr_multi_base.cpp\n\n// (C) Copyright 2002 Robert Ramey- http://www.rrsd.com and Takatoshi Kondo.\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n//\n//  See http://www.boost.org for updates, documentation, and revision history.\n\n#include <cstddef> // NULL\n#include <cstdio> // remove\n#include <fstream>\n\n#include <boost/config.hpp>\n#if defined(BOOST_NO_STDC_NAMESPACE)\nnamespace std{\n    using ::remove;\n}\n#endif\n\n#include <boost/serialization/nvp.hpp>\n#include <boost/serialization/export.hpp>\n\n#include <boost/serialization/shared_ptr.hpp>\n#include <boost/serialization/weak_ptr.hpp>\n\n#include \"test_tools.hpp\"\n\nstruct Base1 {\n    Base1() {}\n    Base1(int x) : m_x(1 + x) {}\n    virtual ~Base1(){\n    }\n    int m_x;\n    // serialize\n    friend class boost::serialization::access;\n    template<class Archive>\n    void serialize(Archive &ar, const unsigned int /* file_version */)\n    {\n        ar & BOOST_SERIALIZATION_NVP(m_x);\n    }\n};\n\nstruct Base2 {\n    Base2() {}\n    Base2(int x) : m_x(2 + x) {}\n    int m_x;\n    virtual ~Base2(){\n    }\n    // serialize\n    friend class boost::serialization::access;\n    template<class Archive>\n    void serialize(Archive &ar, const unsigned int /* file_version */)\n    {\n        ar & BOOST_SERIALIZATION_NVP(m_x);\n    }\n};\n\nstruct Base3 {\n    Base3() {}\n    Base3(int x) : m_x(3 + x) {}\n    virtual ~Base3(){\n    }\n    int m_x;\n    // serialize\n    friend class boost::serialization::access;\n    template<class Archive>\n    void serialize(Archive &ar, const unsigned int /* file_version */)\n    {\n        ar & BOOST_SERIALIZATION_NVP(m_x);\n    }\n};\n\n// Sub is a subclass of Base1, Base1 and Base3.\nstruct Sub:public Base1, public Base2, public Base3 {\n    static int count;\n    Sub() {\n        ++count;\n    }\n    Sub(int x) :\n        Base1(x),\n        Base2(x),\n        m_x(x)\n    {\n        ++count;\n    }\n    Sub(const Sub & rhs) :\n        m_x(rhs.m_x)\n    {\n        ++count;\n    }\n    virtual ~Sub() {\n        assert(0 < count);\n        --count;\n    }\n    int m_x;\n    // serialize\n    friend class boost::serialization::access;\n    template<class Archive>\n    void serialize(Archive &ar, const unsigned int /* file_version */)\n    {\n        ar & BOOST_SERIALIZATION_BASE_OBJECT_NVP(Base1);\n        ar & BOOST_SERIALIZATION_BASE_OBJECT_NVP(Base2);\n        ar & BOOST_SERIALIZATION_BASE_OBJECT_NVP(Base3);\n        ar & BOOST_SERIALIZATION_NVP(m_x);\n    }\n};\n\n// Sub needs to be exported because its serialized via a base class pointer\nBOOST_CLASS_EXPORT(Sub)\nBOOST_SERIALIZATION_SHARED_PTR(Sub)\n\nint Sub::count = 0;\n\ntemplate <class FIRST, class SECOND>\nvoid save2(\n    const char * testfile,\n    const FIRST& first,\n    const SECOND& second\n){\n    test_ostream os(testfile, TEST_STREAM_FLAGS);\n    test_oarchive oa(os, TEST_ARCHIVE_FLAGS);\n    oa << BOOST_SERIALIZATION_NVP(first);\n    oa << BOOST_SERIALIZATION_NVP(second);\n}\n\ntemplate <class FIRST, class SECOND>\nvoid load2(\n    const char * testfile,\n    FIRST& first,\n    SECOND& second)\n{\n    test_istream is(testfile, TEST_STREAM_FLAGS);\n    test_iarchive ia(is, TEST_ARCHIVE_FLAGS);\n    ia >> BOOST_SERIALIZATION_NVP(first);\n    ia >> BOOST_SERIALIZATION_NVP(second);\n}\n\n// Run tests by serializing two shared_ptrs into an archive,\n// clearing them (deleting the objects) and then reloading the\n// objects back from an archive.\n\ntemplate<class T, class U>\nboost::shared_ptr<T> dynamic_pointer_cast(boost::shared_ptr<U> const & u)\nBOOST_NOEXCEPT\n{\n    return boost::dynamic_pointer_cast<T>(u);\n}\n\n#ifndef BOOST_NO_CXX11_SMART_PTR\ntemplate<class T, class U>\nstd::shared_ptr<T> dynamic_pointer_cast(std::shared_ptr<U> const & u)\nBOOST_NOEXCEPT\n{\n    return std::dynamic_pointer_cast<T>(u);\n}\n#endif\n\n// Serialization sequence\n// First,  shared_ptr\n// Second, weak_ptr\ntemplate <class SP, class WP>\nvoid shared_weak(\n    SP & first,\n    WP & second\n){\n    const char * testfile = boost::archive::tmpnam(NULL);\n    BOOST_REQUIRE(NULL != testfile);\n    int firstm = first->m_x;\n\n    BOOST_REQUIRE(! second.expired());\n    int secondm = second.lock()->m_x;\n    save2(testfile, first, second);\n\n    // Clear the pointers, thereby destroying the objects they contain\n    second.reset();\n    first.reset();\n\n    load2(testfile, first, second);\n    BOOST_CHECK(! second.expired());\n\n    // Check data member\n    BOOST_CHECK(firstm == first->m_x);\n    BOOST_CHECK(secondm == second.lock()->m_x);\n    // Check pointer to vtable\n    BOOST_CHECK(::dynamic_pointer_cast<Sub>(first));\n    BOOST_CHECK(::dynamic_pointer_cast<Sub>(second.lock()));\n\n    std::remove(testfile);\n}\n\n// Serialization sequence\n// First,  weak_ptr\n// Second, shared_ptr\ntemplate <class WP, class SP>\nvoid weak_shared(\n    WP & first,\n    SP & second\n){\n    const char * testfile = boost::archive::tmpnam(NULL);\n    BOOST_REQUIRE(NULL != testfile);\n    BOOST_CHECK(! first.expired());\n    int firstm = first.lock()->m_x;\n    int secondm = second->m_x;\n    save2(testfile, first, second);\n\n    // Clear the pointers, thereby destroying the objects they contain\n    first.reset();\n    second.reset();\n\n    load2(testfile, first, second);\n    BOOST_CHECK(! first.expired());\n\n    // Check data member\n    BOOST_CHECK(firstm == first.lock()->m_x);\n    BOOST_CHECK(secondm == second->m_x);\n    // Check pointer to vtable\n    BOOST_CHECK(::dynamic_pointer_cast<Sub>(first.lock()));\n    BOOST_CHECK(::dynamic_pointer_cast<Sub>(second));\n\n    std::remove(testfile);\n}\n\n// This does the tests\ntemplate<template<class T> class SPT, template<class T> class WPT>\nbool test(){\n    // Both Sub\n    SPT<Sub> tc1_sp(new Sub(10));\n    WPT<Sub> tc1_wp(tc1_sp);\n    shared_weak(tc1_sp, tc1_wp);\n    weak_shared(tc1_wp, tc1_sp);\n    tc1_sp.reset();\n    BOOST_CHECK(0 == Sub::count);\n\n    // Sub and Base1\n    SPT<Sub> tc2_sp(new Sub(10));\n    WPT<Base1> tc2_wp(tc2_sp);\n    shared_weak(tc2_sp, tc2_wp);\n    weak_shared(tc2_wp, tc2_sp);\n    tc2_sp.reset();\n    BOOST_CHECK(0 == Sub::count);\n\n    // Sub and Base2\n    SPT<Sub> tc3_sp(new Sub(10));\n    WPT<Base2> tc3_wp(tc3_sp);\n    shared_weak(tc3_sp, tc3_wp);\n    weak_shared(tc3_wp, tc3_sp);\n    tc3_sp.reset();\n    BOOST_CHECK(0 == Sub::count);\n\n    // Sub and Base3\n    SPT<Sub> tc4_sp(new Sub(10));\n    WPT<Base3> tc4_wp(tc4_sp);\n    shared_weak(tc4_sp, tc4_wp);\n    weak_shared(tc4_wp, tc4_sp);\n    tc4_sp.reset();\n    BOOST_CHECK(0 == Sub::count);\n\n    // Base1 and Base2\n    SPT<Sub> tc5_sp_tmp(new Sub(10));\n    SPT<Base1> tc5_sp(tc5_sp_tmp);\n    WPT<Base2> tc5_wp(tc5_sp_tmp);\n    tc5_sp_tmp.reset();\n    shared_weak(tc5_sp, tc5_wp);\n    weak_shared(tc5_wp, tc5_sp);\n    tc5_sp.reset();\n    BOOST_CHECK(0 == Sub::count);\n\n    // Base2 and Base3\n    SPT<Sub> tc6_sp_tmp(new Sub(10));\n    SPT<Base2> tc6_sp(tc6_sp_tmp);\n    WPT<Base3> tc6_wp(tc6_sp_tmp);\n    tc6_sp_tmp.reset();\n    shared_weak(tc6_sp, tc6_wp);\n    weak_shared(tc6_wp, tc6_sp);\n    tc6_sp.reset();\n    BOOST_CHECK(0 == Sub::count);\n\n    // Base3 and Base1\n    SPT<Sub> tc7_sp_tmp(new Sub(10));\n    SPT<Base3> tc7_sp(tc7_sp_tmp);\n    WPT<Base1> tc7_wp(tc7_sp_tmp);\n    tc7_sp_tmp.reset();\n    shared_weak(tc7_sp, tc7_wp);\n    weak_shared(tc7_wp, tc7_sp);\n    tc7_sp.reset();\n    BOOST_CHECK(0 == Sub::count);\n\n    return true;\n}\n\n// This does the tests\nint test_main(int /* argc */, char * /* argv */[])\n{\n    bool result = true;\n    result &= test<boost::shared_ptr, boost::weak_ptr>();\n    #ifndef BOOST_NO_CXX11_SMART_PTR\n    result &= test<std::shared_ptr, std::weak_ptr>();\n    #endif\n    return result ? EXIT_SUCCESS : EXIT_FAILURE;\n}\n"
  },
  {
    "path": "test/test_simple_class.cpp",
    "content": "/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// test_simple_class.cpp\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n// should pass compilation and execution\n\n// invoke header for a custom archive test.\n\n#include <cstddef> // NULL\n#include <cstdio> // remove\n#include <fstream>\n#include <cmath>\n\n#include <boost/config.hpp>\n#if BOOST_CXX_VERSION > 199711L // only include floating point if C++ version >= C++11\n#include <boost/math/special_functions/next.hpp>\n#endif\n\n#if defined(BOOST_NO_STDC_NAMESPACE)\nnamespace std{\n    using ::remove;\n}\n#endif\n\n#include \"test_tools.hpp\"\n\n#include \"A.hpp\"\n#include \"A.ipp\"\n\nbool A::check_equal(const A &rhs) const\n{\n    BOOST_CHECK_EQUAL(b, rhs.b);\n    BOOST_CHECK_EQUAL(l, rhs.l);\n    #ifndef BOOST_NO_INT64_T\n    BOOST_CHECK_EQUAL(f, rhs.f);\n    BOOST_CHECK_EQUAL(g, rhs.g);\n    #endif\n    BOOST_CHECK_EQUAL(m, rhs.m);\n    BOOST_CHECK_EQUAL(n, rhs.n);\n    BOOST_CHECK_EQUAL(o, rhs.o);\n    BOOST_CHECK_EQUAL(p, rhs.p);\n    BOOST_CHECK_EQUAL(q, rhs.q);\n    #ifndef BOOST_NO_CWCHAR\n    BOOST_CHECK_EQUAL(r, rhs.r);\n    #endif\n    BOOST_CHECK_EQUAL(c, rhs.c);\n    BOOST_CHECK_EQUAL(s, rhs.s);\n    BOOST_CHECK_EQUAL(t, rhs.t);\n    BOOST_CHECK_EQUAL(u, rhs.u);\n    BOOST_CHECK_EQUAL(v, rhs.v);\n    BOOST_CHECK_EQUAL(l, rhs.l);\n    #if BOOST_CXX_VERSION > 199711L // only include floating point if C++ version >= C++11\n        BOOST_CHECK(std::abs( boost::math::float_distance(w, rhs.w)) < 2);\n        BOOST_CHECK(std::abs( boost::math::float_distance(x, rhs.x)) < 2);\n    #endif\n    BOOST_CHECK(!(0 != y.compare(rhs.y)));\n    #ifndef BOOST_NO_STD_WSTRING\n    BOOST_CHECK(!(0 != z.compare(rhs.z)));\n    #endif\n    return true;\n}\n\nint\ntest_main( int /* argc */, char* /* argv */[] )\n{\n    const char * testfile = boost::archive::tmpnam(NULL);\n    BOOST_REQUIRE(NULL != testfile);\n\n    A a, a1;\n    {\n        test_ostream os(testfile, TEST_STREAM_FLAGS);\n        test_oarchive oa(os, TEST_ARCHIVE_FLAGS);\n        oa << boost::serialization::make_nvp(\"a\", a);\n    }\n    {\n        test_istream is(testfile, TEST_STREAM_FLAGS);\n        test_iarchive ia(is, TEST_ARCHIVE_FLAGS);\n        ia >> boost::serialization::make_nvp(\"a\", a1);\n    }\n    a.check_equal(a1);\n    std::remove(testfile);\n    return 0;\n}\n"
  },
  {
    "path": "test/test_simple_class_ptr.cpp",
    "content": "/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// test_simple_class_ptr.cpp\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n// should pass compilation and execution\n\n#include <cstddef> // NULL\n#include <cstdio> // remove\n#include <fstream>\n\n#include <boost/config.hpp>\n#if defined(BOOST_NO_STDC_NAMESPACE)\nnamespace std{\n    using ::remove;\n}\n#endif\n\n#include \"test_tools.hpp\"\n\n#include \"A.hpp\"\n#include \"A.ipp\"\n\nint test_main( int /* argc */, char* /* argv */[] )\n{\n    const char * testfile = boost::archive::tmpnam(NULL);\n\n    BOOST_REQUIRE(NULL != testfile);\n\n    const A *ta = new A();\n    A *ta1 = NULL;\n\n    {\n        test_ostream os(testfile, TEST_STREAM_FLAGS);\n        test_oarchive oa(os, TEST_ARCHIVE_FLAGS);\n        oa << boost::serialization::make_nvp(\"ta\", ta);\n    }\n    {\n        test_istream is(testfile, TEST_STREAM_FLAGS);\n        test_iarchive ia(is, TEST_ARCHIVE_FLAGS);\n        ia >> boost::serialization::make_nvp(\"ta\", ta1);\n    }\n    BOOST_CHECK(ta != ta1);\n    BOOST_CHECK(*ta == *ta1);\n    delete ta;\n    std::remove(testfile);\n    return EXIT_SUCCESS;\n}\n\n// EOF\n"
  },
  {
    "path": "test/test_singleton.cpp",
    "content": "/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// test_singleton.cpp\n\n// (C) Copyright 2018 Robert Ramey - http://www.rrsd.com .\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n// should pass compilation and execution\n\n#include <iostream>\n#include <boost/serialization/singleton.hpp>\n\n#include \"test_tools.hpp\"\n\nstatic int i = 0;\n\nstruct A {\n    int m_id;\n    A() : m_id(++i) {}\n    ~A(){\n        // verify that objects are destroyed in sequence reverse of construction\n        if(i-- != m_id) std::terminate();\n    }\n};\n\nstruct B {\n    int m_id;\n    B() : m_id(++i) {}\n    ~B(){\n        // verify that objects are destroyed in sequence reverse of construction\n        if(i-- != m_id) std::terminate();\n    }\n};\n\nstruct C {\n    int m_id;\n    C() : m_id(++i) {}\n    ~C(){\n        // verify that objects are destroyed in sequence reverse of construction\n        if(i-- != m_id) std::terminate();\n    }\n};\n\nstruct D {\n    int m_id;\n    D(){\n        // verify that only one object is indeed created\n        const C & c = boost::serialization::singleton<C>::get_const_instance();\n        const C & c1 = boost::serialization::singleton<C>::get_const_instance();\n        BOOST_CHECK_EQUAL(&c, &c1);\n\n        // verify that objects are created in sequence of definition\n        BOOST_CHECK_EQUAL(c.m_id, 1);\n        const B & b = boost::serialization::singleton<B>::get_const_instance();\n        BOOST_CHECK_EQUAL(b.m_id, 2);\n        const A & a = boost::serialization::singleton<A>::get_const_instance();\n        BOOST_CHECK_EQUAL(a.m_id, 3);\n        std::cout << a.m_id << b.m_id << c.m_id << '\\n';\n\n        m_id = ++i;\n    }\n    ~D(){\n        // verify that objects are destroyed in sequence reverse of construction\n        if(i-- != m_id) std::terminate();\n    }\n};\n\nint test_main(int, char *[]){\n    return 0;\n}\n\n// note: not a singleton\nD d;\n"
  },
  {
    "path": "test/test_singleton_inherited.cpp",
    "content": "/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// test_singleton_inherited.cpp:\n// Test the singleton class for a \"inherited\" singleton (used as Foo:public singleton<Foo>)\n// This can be uses as singleton<Foo>::get_const_instance() OR Foo::get_const_instance()\n//\n// - is_destroyed returns false when singleton is active or uninitialized\n// - is_destroyed returns true when singleton is destructed\n// - the singleton is eventually destructed (no memory leak)\n\n// (C) Copyright 2018 Alexander Grund\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n#include \"test_tools.hpp\"\n#include <boost/serialization/singleton.hpp>\n#include <boost/preprocessor/stringize.hpp>\n#include <stdexcept>\n\n// Can't use BOOST_TEST because:\n// a) destructors are called after program exit\n// b) This is intended to be used by shared libraries too which would then need their own report_errors call\n// We halso have to disable the Wterminate warning as we call this from dtors\n// C++ will terminate the program in such cases which is OK here\n#pragma GCC diagnostic push\n#pragma GCC diagnostic ignored \"-Wterminate\"\n#define THROW_ON_FALSE(cond) if(!(cond)) throw std::runtime_error(__FILE__ \"(\" BOOST_PP_STRINGIZE(__LINE__) \") Assertion failed: \" #cond)\n\n// Enum to designate the state of the singletonized instances\nenum ConstructionState{CS_UNINIT, CS_INIT, CS_DESTROYED};\n\n// We need another singleton to check for the destruction of the singletons at program exit\n// We don't need all the magic for shared library anti-optimization and can keep it very simple\nstruct controller{\n    static controller& getInstance(){\n        static controller instance;\n        return instance;\n    }\n    ConstructionState state;\nprivate:\n    controller() {\n        state = CS_UNINIT;\n    }\n    ~controller();\n};\n\n// A simple class that sets its construction state in the controller singleton\nstruct Foo: boost::serialization::singleton<Foo>{\n    Foo(): i(42) {\n        // access controller singleton. Therefore controller will be constructed before this\n        THROW_ON_FALSE(controller::getInstance().state == CS_UNINIT);\n        controller::getInstance().state = CS_INIT;\n    }\n    ~Foo() {\n        // Because controller is constructed before this, it will be destructed AFTER this. Hence controller is still valid\n        THROW_ON_FALSE(controller::getInstance().state == CS_INIT);\n        controller::getInstance().state = CS_DESTROYED;\n    }\n    // Volatile to prevent compiler optimization from removing this\n    volatile int i;\n};\n\ncontroller::~controller() {\n    // If this fails, the singletons were not freed and memory is leaked\n    THROW_ON_FALSE(state == CS_DESTROYED);\n    // If this fails, then the destroyed flag is not set and one may use a deleted instance if relying on this flag\n    THROW_ON_FALSE(boost::serialization::singleton<Foo>::is_destroyed());\n    THROW_ON_FALSE(Foo::is_destroyed());\n}\n\nint\ntest_main( int /* argc */, char* /* argv */[] )\n{\n    // Check if the singleton is alive and use it\n    BOOST_CHECK(!boost::serialization::singleton<Foo>::is_destroyed());\n    BOOST_CHECK(!Foo::is_destroyed());\n\n    BOOST_CHECK(boost::serialization::singleton<Foo>::get_const_instance().i == 42);\n    BOOST_CHECK(Foo::get_const_instance().i == 42);\n    return EXIT_SUCCESS;\n}\n"
  },
  {
    "path": "test/test_singleton_plain.cpp",
    "content": "/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// test_singleton_plain.cpp:\n// Test the singleton class for a \"plain\" singleton (used as singleton<Foo>)\n//\n// - is_destroyed returns false when singleton is active or uninitialized\n// - is_destroyed returns true when singleton is destructed\n// - the singleton is eventually destructed (no memory leak)\n\n// (C) Copyright 2018 Alexander Grund\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n#include \"test_tools.hpp\"\n#include <boost/serialization/singleton.hpp>\n#include <boost/preprocessor/stringize.hpp>\n#include <stdexcept>\n\n// Can't use BOOST_TEST because:\n// a) destructors are called after program exit\n// b) This is intended to be used by shared libraries too which would then need their own report_errors call\n// We halso have to disable the Wterminate warning as we call this from dtors\n// C++ will terminate the program in such cases which is OK here\n#pragma GCC diagnostic push\n#pragma GCC diagnostic ignored \"-Wterminate\"\n#define THROW_ON_FALSE(cond) if(!(cond)) throw std::runtime_error(__FILE__ \"(\" BOOST_PP_STRINGIZE(__LINE__) \") Assertion failed: \" #cond)\n\n// Enum to designate the state of the singletonized instances\nenum ConstructionState{CS_UNINIT, CS_INIT, CS_DESTROYED};\n\n// We need another singleton to check for the destruction of the singletons at program exit\n// We don't need all the magic for shared library anti-optimization and can keep it very simple\nstruct controller{\n    static controller& getInstance(){\n        static controller instance;\n        return instance;\n    }\n    ConstructionState state;\nprivate:\n    controller() {\n        state = CS_UNINIT;\n    }\n    ~controller();\n};\n\n// A simple class that sets its construction state in the controller singleton\nstruct Foo{\n    Foo(): i(42) {\n        // access controller singleton. Therefore controller will be constructed before this\n        THROW_ON_FALSE(controller::getInstance().state == CS_UNINIT);\n        controller::getInstance().state = CS_INIT;\n    }\n    ~Foo() {\n        // Because controller is constructed before this, it will be destructed AFTER this. Hence controller is still valid\n        THROW_ON_FALSE(controller::getInstance().state == CS_INIT);\n        controller::getInstance().state = CS_DESTROYED;\n    }\n    // Volatile to prevent compiler optimization from removing this\n    volatile int i;\n};\n\ncontroller::~controller() {\n    // If this fails, the singletons were not freed and memory is leaked\n    THROW_ON_FALSE(state == CS_DESTROYED);\n    // If this fails, then the destroyed flag is not set and one may use a deleted instance if relying on this flag\n    THROW_ON_FALSE(boost::serialization::singleton<Foo>::is_destroyed());\n}\n\nint\ntest_main( int /* argc */, char* /* argv */[] )\n{\n    // Check if the singleton is alive and use it\n    BOOST_CHECK(!boost::serialization::singleton<Foo>::is_destroyed());\n\n    BOOST_CHECK(boost::serialization::singleton<Foo>::get_const_instance().i == 42);\n    return EXIT_SUCCESS;\n}\n"
  },
  {
    "path": "test/test_slist.cpp",
    "content": "/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// test_list.cpp\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n// should pass compilation and execution\n\n#include <cstddef> // NULL\n#include <fstream>\n\n#include <boost/config.hpp>\n#include <cstdio> // remove\n#if defined(BOOST_NO_STDC_NAMESPACE)\nnamespace std{\n    using ::remove;\n}\n#endif\n\n#include <boost/archive/archive_exception.hpp>\n#include \"test_tools.hpp\"\n\n#include \"A.hpp\"\n#include \"A.ipp\"\n\n#include <boost/serialization/slist.hpp>\nvoid test_slist(){\n    const char * testfile = boost::archive::tmpnam(NULL);\n    BOOST_STD_EXTENSION_NAMESPACE::slist<A> aslist;\n    aslist.push_front(A());\n    aslist.push_front(A());\n    {\n        test_ostream os(testfile, TEST_STREAM_FLAGS);\n        test_oarchive oa(os, TEST_ARCHIVE_FLAGS);\n        oa << boost::serialization::make_nvp(\"aslist\", aslist);\n    }\n    BOOST_STD_EXTENSION_NAMESPACE::slist<A> aslist1;{\n        test_istream is(testfile, TEST_STREAM_FLAGS);\n        test_iarchive ia(is, TEST_ARCHIVE_FLAGS);\n        ia >> boost::serialization::make_nvp(\"aslist\", aslist1);\n    }\n    BOOST_CHECK(aslist == aslist1);\n    std::remove(testfile);\n}\n\nint test_main( int /* argc */, char* /* argv */[] )\n{\n    test_slist();\n    return EXIT_SUCCESS;\n}\n\n// EOF\n\n"
  },
  {
    "path": "test/test_slist_ptrs.cpp",
    "content": "/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// test_list.cpp\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n// should pass compilation and execution\n\n#include <cstddef>\n#include <fstream>\n\n#include <boost/config.hpp>\n#include <cstdio> // remove\n#if defined(BOOST_NO_STDC_NAMESPACE)\nnamespace std{\n    using ::remove;\n}\n#endif\n\n#include <boost/type_traits/is_pointer.hpp>\n#include <boost/static_assert.hpp>\n#include <boost/checked_delete.hpp>\n\n#include <boost/archive/archive_exception.hpp>\n#include \"test_tools.hpp\"\n\n#include <boost/serialization/nvp.hpp>\n\n#include \"A.hpp\"\n#include \"A.ipp\"\n\ntemplate<class T>\nstruct ptr_equal_to {\n    BOOST_STATIC_ASSERT(::boost::is_pointer< T >::value);\n    bool operator()(T const _Left, T const _Right) const\n    {\n        if(NULL == _Left && NULL == _Right)\n            return true;\n        if(typeid(*_Left) != typeid(*_Right))\n            return false;\n        return *_Left == *_Right;\n    }\n};\n\n#include <boost/serialization/slist.hpp>\nvoid test_slist(){\n    const char * testfile = boost::archive::tmpnam(NULL);\n    BOOST_REQUIRE(NULL != testfile);\n\n    BOOST_STD_EXTENSION_NAMESPACE::slist<A *> aslist;\n    {\n        test_ostream os(testfile, TEST_STREAM_FLAGS);\n        test_oarchive oa(os, TEST_ARCHIVE_FLAGS);\n        aslist.push_front(new A);\n        aslist.push_front(new A);\n        oa << boost::serialization::make_nvp(\"aslist\", aslist);\n    }\n    BOOST_STD_EXTENSION_NAMESPACE::slist<A *> aslist1;\n    {\n        test_istream is(testfile, TEST_STREAM_FLAGS);\n        test_iarchive ia(is, TEST_ARCHIVE_FLAGS);\n        ia >> boost::serialization::make_nvp(\"aslist\", aslist1);\n        BOOST_CHECK(aslist.size() == aslist1.size() &&\n            std::equal(aslist.begin(),aslist.end(),aslist1.begin(),ptr_equal_to<A *>())\n        );\n    }\n    std::for_each(\n        aslist.begin(),\n        aslist.end(),\n        boost::checked_deleter<A>()\n    );\n    std::for_each(\n        aslist1.begin(),\n        aslist1.end(),\n        boost::checked_deleter<A>()\n    );\n    std::remove(testfile);\n}\n\nint test_main( int /* argc */, char* /* argv */[] )\n{\n    test_slist();\n    return EXIT_SUCCESS;\n}\n\n// EOF\n"
  },
  {
    "path": "test/test_smart_cast.cpp",
    "content": "/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// test_smart_cast.cpp:\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n// <gennadiy.rozental@tfn.com>\n\n#include <exception>\n#include <boost/serialization/smart_cast.hpp>\n\n#include \"test_tools.hpp\"\n#include <boost/noncopyable.hpp>\n\nusing namespace boost::serialization;\n\nclass Base1 : public boost::noncopyable\n{\n    char a;\n};\n\nclass Base2\n{\n    int b;\n};\n\n#ifdef BOOST_MSVC\n#  pragma warning(push)\n#  pragma warning(disable : 4511 4512)\n#endif\n\nclass Derived : public Base1, public Base2\n{\n    long c;\n};\n\n#ifdef BOOST_MSVC\n#pragma warning(pop)\n#endif\n\n// if compiler doesn't support TPS, the smart_cast syntax doesn't\n// work for references.  One has to use the smart_cast_reference\n// syntax (tested below ) instead.\n\nvoid test_static_reference_cast_2(){\n    Derived d;\n    Base1 & b1 = static_cast<Base1 &>(d);\n    Base2 & b2 = static_cast<Base2 &>(d);\n\n    Base1 & scb1 = smart_cast<Base1 &, Derived &>(d);\n    Base2 & scb2 = smart_cast<Base2 &, Derived &>(d);\n    BOOST_CHECK_EQUAL(& b1, & scb1);\n    BOOST_CHECK_EQUAL(& b2, & scb2);\n\n    // downcast\n//    BOOST_CHECK_EQUAL(& d, & (smart_cast<Derived &, Base1 &>(b1)));\n//    BOOST_CHECK_EQUAL(& d, & (smart_cast<Derived &, Base2 &>(b2)));\n\n    // crosscast pointers fails at compiler time\n    // BOOST_CHECK_EQUAL(pB2,smart_cast<B2 *>(pB1));\n    // though explicit cross cast will always work\n    BOOST_CHECK_EQUAL(& b2,(\n        & smart_cast<Base2 &, Derived &>(\n            smart_cast<Derived &, Base1 &>(b1)\n        ))\n    );\n}\n\nvoid test_static_reference_cast_1(){\n    Derived d;\n    Base1 & b1 = static_cast<Base1 &>(d);\n    Base2 & b2 = static_cast<Base2 &>(d);\n\n    Base1 & scb1 = smart_cast_reference<Base1 &>(d);\n    Base2 & scb2 = smart_cast_reference<Base2 &>(d);\n    BOOST_CHECK_EQUAL(& b1, & scb1);\n    BOOST_CHECK_EQUAL(& b2, & scb2);\n\n    // downcast\n    BOOST_CHECK_EQUAL(& d, & (smart_cast_reference<Derived &>(b1)));\n    BOOST_CHECK_EQUAL(& d, & (smart_cast_reference<Derived &>(b2)));\n\n    // crosscast pointers fails at compiler time\n    // BOOST_CHECK_EQUAL(pB2,smart_cast<B2 *>(pB1));\n    // though explicit cross cast will always work\n    BOOST_CHECK_EQUAL(& b2,(\n        & smart_cast_reference<Base2 &>(\n            smart_cast_reference<Derived &>(b1)\n        ))\n    );\n}\n\nvoid test_static_pointer_cast(){\n    // pointers\n    Derived d;\n    Derived *pD = & d;\n    Base1 *pB1 = pD;\n    Base2 *pB2 = pD;\n\n    // upcast\n    BOOST_CHECK_EQUAL(pB1, smart_cast<Base1 *>(pD));\n    BOOST_CHECK_EQUAL(pB2, smart_cast<Base2 *>(pD));\n\n    // downcast\n    BOOST_CHECK_EQUAL(pD, smart_cast<Derived *>(pB1));\n    BOOST_CHECK_EQUAL(pD, smart_cast<Derived *>(pB2));\n\n    // crosscast pointers fails at compiler time\n    // BOOST_CHECK_EQUAL(pB2, smart_cast<Base2 *>(pB1));\n\n    // though explicit cross cast will always work\n    BOOST_CHECK_EQUAL(pB2,\n        smart_cast<Base2 *>(\n            smart_cast<Derived *>(pB1)\n        )\n    );\n}\n\nclass VBase1 : public boost::noncopyable\n{\n    char a;\npublic:\n    virtual ~VBase1(){};\n};\n\nclass VBase2\n{\n    int b;\npublic:\n    virtual ~VBase2(){};\n};\n\n#ifdef BOOST_MSVC\n#  pragma warning(push)\n#  pragma warning(disable : 4511 4512)\n#endif\n\nclass VDerived : public VBase1, public VBase2\n{\n    long c;\npublic:\n    virtual ~VDerived(){};\n};\n\n#ifdef BOOST_MSVC\n#pragma warning(pop)\n#endif\n\n// see above\n\nvoid test_dynamic_reference_cast_2(){\n    VDerived d;\n    VBase1 &b1 = dynamic_cast<VBase1 &>(d);\n    VBase2 &b2 = static_cast<VBase2 &>(d);\n\n    VBase1 & vb1 = smart_cast<VBase1 &, VDerived &>(d);\n    BOOST_CHECK_EQUAL(& b1, & vb1);\n    BOOST_CHECK_EQUAL(& b2, (& smart_cast<VBase2 &, VDerived &>(d)));\n\n    // downcast\n    BOOST_CHECK_EQUAL(& d, (& smart_cast<VDerived &, VBase1 &>(b1)));\n    BOOST_CHECK_EQUAL(& d, (& smart_cast<VDerived &, VBase2 &>(b2)));\n\n    // crosscast\n     BOOST_CHECK_EQUAL(& b2, (& smart_cast<VBase2 &, VBase1 &>(b1)));\n\n    // explicit cross cast should always work\n    BOOST_CHECK_EQUAL(& b2, (\n        & smart_cast<VBase2 &, VDerived &>(\n            smart_cast<VDerived &, VBase1 &>(b1)\n        ))\n    );\n}\n\nvoid test_dynamic_reference_cast_1(){\n    VDerived d;\n    VBase1 &b1 = dynamic_cast<VBase1 &>(d);\n    VBase2 &b2 = static_cast<VBase2 &>(d);\n\n    VBase1 & vb1 = smart_cast_reference<VBase1 &>(d);\n    BOOST_CHECK_EQUAL(& b1, & vb1);\n    BOOST_CHECK_EQUAL(& b2, (& smart_cast_reference<VBase2 &>(d)));\n\n    // downcast\n    BOOST_CHECK_EQUAL(& d, (& smart_cast_reference<VDerived &>(b1)));\n    BOOST_CHECK_EQUAL(& d, (& smart_cast_reference<VDerived &>(b2)));\n\n    // crosscast\n     BOOST_CHECK_EQUAL(& b2, (& smart_cast_reference<VBase2 &>(b1)));\n\n    // explicit cross cast should always work\n    BOOST_CHECK_EQUAL(& b2, (\n        & smart_cast_reference<VBase2 &>(\n            smart_cast_reference<VDerived &>(b1)\n        ))\n    );\n}\n\nvoid test_dynamic_pointer_cast(){\n    // pointers\n    VDerived d;\n    VDerived *pD = & d;\n    VBase1 *pB1 = pD;\n    VBase2 *pB2 = pD;\n\n    // upcast\n    BOOST_CHECK_EQUAL(pB1, smart_cast<VBase1 *>(pD));\n    BOOST_CHECK_EQUAL(pB2, smart_cast<VBase2 *>(pD));\n\n    // downcast\n    BOOST_CHECK_EQUAL(pD, smart_cast<VDerived *>(pB1));\n    BOOST_CHECK_EQUAL(pD, smart_cast<VDerived *>(pB2));\n\n    // crosscast pointers fails at compiler time\n    BOOST_CHECK_EQUAL(pB2, smart_cast<VBase2 *>(pB1));\n    // though explicit cross cast will always work\n    BOOST_CHECK_EQUAL(pB2,\n        smart_cast<VBase2 *>(\n            smart_cast<VDerived *>(pB1)\n        )\n    );\n}\n\nint\ntest_main(int /* argc */, char * /* argv */[])\n{\n    test_static_reference_cast_2();\n    test_static_reference_cast_1();\n    test_static_pointer_cast();\n    test_dynamic_reference_cast_2();\n    test_dynamic_reference_cast_1();\n    test_dynamic_pointer_cast();\n\n    return EXIT_SUCCESS;\n}\n"
  },
  {
    "path": "test/test_split.cpp",
    "content": "/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// test_split.cpp\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n// should pass compilation and execution\n\n#include <cstddef> // NULL\n#include <cstdio> // remove\n#include <fstream>\n\n#include <boost/config.hpp>\n#if defined(BOOST_NO_STDC_NAMESPACE)\nnamespace std{\n    using ::remove;\n}\n#endif\n\n#include \"test_tools.hpp\"\n\n#include <boost/serialization/split_member.hpp>\n#include <boost/serialization/split_free.hpp>\n\nclass A\n{\n    friend class boost::serialization::access;\n    template<class Archive>\n    void save(\n        Archive & /* ar */,\n        const unsigned int /* file_version */\n    ) const {\n        ++(const_cast<A &>(*this).count);\n    }\n    template<class Archive>\n    void load(\n        Archive & /* ar */,\n        const unsigned int /* file_version */\n    ){\n        --count;\n    }\n    BOOST_SERIALIZATION_SPLIT_MEMBER()\n    int count;\npublic:\n    A() : count(0) {}\n    ~A() {\n        BOOST_CHECK(0 == count);\n    }\n};\n\nclass B\n{\n    friend class boost::serialization::access;\n    template<class Archive>\n    void save(\n        Archive & /* ar */,\n        const unsigned int /* file_version */\n    ) const {\n        ++(const_cast<B &>(*this).count);\n    }\n    template<class Archive>\n    void load(\n        Archive & /* ar */,\n        const unsigned int /* file_version */\n    ){\n        --count;\n    }\n    int count;\npublic:\n    B() : count(0) {}\n    ~B() {\n        BOOST_CHECK(0 == count);\n    }\n};\n\n// function specializations must be defined in the appropriate\n// namespace - boost::serialization\nnamespace boost {\nnamespace serialization {\n\ntemplate<class Archive>\nvoid serialize(\n    Archive & ar,\n    B & b,\n    const unsigned int file_version\n){\n    boost::serialization::split_member(ar, b, file_version);\n}\n\n} // serialization\n} // namespace boost\n\nclass C\n{\npublic:\n    int count;\n    C() : count(0) {}\n    ~C() {\n        BOOST_CHECK(0 == count);\n    }\n};\n\nnamespace boost {\nnamespace serialization {\n\ntemplate<class Archive>\nvoid save(\n    Archive & /* ar */,\n    const C & c,\n    const unsigned int /* file_version */\n){\n    ++(const_cast<C &>(c).count);\n}\n\ntemplate<class Archive>\nvoid load(\n    Archive & /* ar */,\n    C & c,\n    const unsigned int /* file_version */\n){\n    --c.count;\n}\n\n} // serialization\n} // namespace boost\n\nBOOST_SERIALIZATION_SPLIT_FREE(C)\n\nvoid out(const char *testfile, A & a, B & b, C & c)\n{\n    test_ostream os(testfile, TEST_STREAM_FLAGS);\n    test_oarchive oa(os, TEST_ARCHIVE_FLAGS);\n    oa << BOOST_SERIALIZATION_NVP(a);\n    oa << BOOST_SERIALIZATION_NVP(b);\n    oa << BOOST_SERIALIZATION_NVP(c);\n}\n\nvoid in(const char *testfile, A & a, B & b, C & c)\n{\n    test_istream is(testfile, TEST_STREAM_FLAGS);\n    test_iarchive ia(is, TEST_ARCHIVE_FLAGS);\n    ia >> BOOST_SERIALIZATION_NVP(a);\n    ia >> BOOST_SERIALIZATION_NVP(b);\n    ia >> BOOST_SERIALIZATION_NVP(c);\n}\n\nint\ntest_main( int /* argc */, char* /* argv */[] )\n{\n    const char * testfile = boost::archive::tmpnam(NULL);\n    BOOST_REQUIRE(NULL != testfile);\n\n    A a;\n    B b;\n    C c;\n\n    out(testfile, a, b, c);\n    in(testfile, a, b, c);\n    std::remove(testfile);\n    return EXIT_SUCCESS;\n}\n\n// EOF\n"
  },
  {
    "path": "test/test_stack.cpp",
    "content": "/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// test_stack.cpp\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n// should pass compilation and execution\n\n#include <cstddef>\n#include <fstream>\n\n#include <cstdio> // remove\n#include <boost/config.hpp>\n#if defined(BOOST_NO_STDC_NAMESPACE)\nnamespace std{\n    using ::remove;\n}\n#endif\n\n#include \"test_tools.hpp\"\n\n#include <boost/serialization/nvp.hpp>\n#include <boost/serialization/deque.hpp>\n#include <boost/serialization/stack.hpp>\n\n#include \"A.hpp\"\n#include \"A.ipp\"\n\nint test_main( int /* argc */, char* /* argv */[] )\n{\n    const char * testfile = boost::archive::tmpnam(NULL);\n    BOOST_REQUIRE(NULL != testfile);\n\n    // test array of objects\n    std::stack<A, std::deque<A> > astack, astack1;\n    astack.push(A());\n    astack.push(A());\n    {\n        test_ostream os(testfile, TEST_STREAM_FLAGS);\n        test_oarchive oa(os, TEST_ARCHIVE_FLAGS);\n        oa << boost::serialization::make_nvp(\"astack\",astack);\n    }\n    {\n        test_istream is(testfile, TEST_STREAM_FLAGS);\n        test_iarchive ia(is, TEST_ARCHIVE_FLAGS);\n        ia >> boost::serialization::make_nvp(\"astack\",astack1);\n    }\n    BOOST_CHECK(astack == astack1);\n\n    std::remove(testfile);\n    return EXIT_SUCCESS;\n}\n\n// EOF\n"
  },
  {
    "path": "test/test_static_warning.cpp",
    "content": "//  (C) Copyright Jonathan Turkanis 2004.\n//  Use, modification and distribution are subject to the\n//  Boost Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for most recent version including documentation.\n\n// note: this is a compile only test.\n\n#include <boost/config.hpp> // BOOST_STATIC_CONST\n#include <boost/static_assert.hpp>\n#include <boost/type_traits/is_polymorphic.hpp>\n\n#include <boost/serialization/static_warning.hpp>\n\ntypedef char a1[2];\ntypedef char a2[3];\n\nclass polymorphic {\n    virtual ~polymorphic();\n};\n\nclass non_polymorphic {\n};\n\ntemplate<class T>\nint f(){\n    BOOST_STATIC_WARNING(T::value);\n    return 0;\n}\n\nstruct A {\n    BOOST_STATIC_CONSTANT(bool, value = false);\n};\n\n/////////////////////////////////////////////////////////////////////////\n// compilation of this program should show a total of 10 warning messages\n\n// should show NO warning message\nBOOST_STATIC_WARNING(true);\n\n// the following should show 5 warning message\nint x = f<A>();  // Warn\nint y = f<boost::is_polymorphic<non_polymorphic> >(); // Warn.\nint z = f<boost::is_polymorphic<polymorphic> >();\n\nBOOST_STATIC_WARNING(sizeof(a1) == sizeof(a2)); // Warn.\nBOOST_STATIC_WARNING(sizeof(a1) != sizeof(a1)); // Warn.\nBOOST_STATIC_WARNING(! boost::is_polymorphic<polymorphic>::value); // Warn.\nBOOST_STATIC_WARNING(boost::is_polymorphic<non_polymorphic>::value); // Warn.\n\nint main(int /* argc */, char * /* argv */[]){\n    // should show NO warning message\n    BOOST_STATIC_WARNING(true);\n\n    // the following should show 5 warning message\n    f<A>();\n    BOOST_STATIC_WARNING(sizeof(a1) == sizeof(a2)); // Warn.\n    BOOST_STATIC_WARNING(sizeof(a1) != sizeof(a1)); // Warn.\n    BOOST_STATIC_WARNING(! boost::is_polymorphic<polymorphic>::value); // Warn.\n    BOOST_STATIC_WARNING(boost::is_polymorphic<non_polymorphic>::value); // Warn.\n    return 0;\n}\n"
  },
  {
    "path": "test/test_strong_typedef.cpp",
    "content": "/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// test_strong_typedef.cpp\n\n// (C) Copyright 2016 Ashish Sadanandan\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n// should pass compilation\n#include <stdlib.h>     // EXIT_SUCCESS\n\n#include <boost/config.hpp>\n#include <boost/serialization/strong_typedef.hpp>\n#include <boost/static_assert.hpp>\n\n#include <boost/type_traits/has_nothrow_assign.hpp>\n#include <boost/type_traits/has_nothrow_constructor.hpp>\n#include <boost/type_traits/has_nothrow_copy.hpp>\n\n///////////////////////////////////////////////////////////////////////\n// Define a strong typedef for int.\n// The new type should be nothrow constructible and assignable.\n\nBOOST_STRONG_TYPEDEF(int, strong_int)\n\n#ifndef BOOST_HAS_NOTHROW_CONSTRUCTOR\nBOOST_STATIC_ASSERT(boost::has_nothrow_default_constructor<strong_int>::value);\nBOOST_STATIC_ASSERT(boost::has_nothrow_copy_constructor<strong_int>::value);\nBOOST_STATIC_ASSERT(boost::has_nothrow_assign<strong_int>::value);\n#endif\n\n///////////////////////////////////////////////////////////////////////\n// strong_int can now be placed in another type, which can also be\n// nothrow constructible and assignable.\n\nstruct type1\n{\n    long        some_long;\n    strong_int  sint;\n};\n\n#ifndef BOOST_HAS_NOTHROW_CONSTRUCTOR\nBOOST_STATIC_ASSERT(boost::has_nothrow_default_constructor<type1>::value);\nBOOST_STATIC_ASSERT(boost::has_nothrow_copy_constructor<type1>::value);\nBOOST_STATIC_ASSERT(boost::has_nothrow_assign<type1>::value);\n#endif\n\n///////////////////////////////////////////////////////////////////////\n// Now define a type that throws, and a strong_typedef for it\n// The strong_typedef should also not have nothrow construction/assign.\n\nstruct not_noexcept\n{\n    not_noexcept() {}\n    not_noexcept(not_noexcept const&) {}\n    not_noexcept& operator=(not_noexcept const&) {return *this;}\n    bool operator==(not_noexcept const&) const {return false;}\n    bool operator<(not_noexcept const&) const {return false;}\n};\nBOOST_STRONG_TYPEDEF(not_noexcept, strong_not_noexcept)\n\n#ifndef BOOST_HAS_NOTHROW_CONSTRUCTOR\nBOOST_STATIC_ASSERT(! boost::has_nothrow_default_constructor<strong_not_noexcept>::value);\nBOOST_STATIC_ASSERT(! boost::has_nothrow_copy_constructor<strong_not_noexcept>::value);\nBOOST_STATIC_ASSERT(! boost::has_nothrow_assign<strong_not_noexcept>::value);\n#endif\n\nint main()\n{\n    return EXIT_SUCCESS;\n}\n"
  },
  {
    "path": "test/test_tools.hpp",
    "content": "#ifndef BOOST_SERIALIZATION_TEST_TOOLS_HPP\n#define BOOST_SERIALIZATION_TEST_TOOLS_HPP\n\n// MS compatible compilers support #pragma once\n#if defined(_MSC_VER)\n# pragma once\n#endif\n\n#define BOOST_FILESYSTEM_VERSION 3\n#include <boost/filesystem/operations.hpp> // unique_path\n\n/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// test_tools.hpp\n//\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for updates, documentation, and revision history.\n\n#include <boost/config.hpp>\n#ifndef BOOST_NO_EXCEPTION_STD_NAMESPACE\n    #include <exception>\n#endif\n#include <boost/core/no_exceptions_support.hpp>\n\n#if defined(UNDER_CE)\n\n// Windows CE does not supply the tmpnam function in its CRT.\n// Substitute a primitive implementation here.\nnamespace boost {\nnamespace archive {\n    const char * tmpnam(char * buffer){\n        static char ibuffer [512];\n        if(NULL == buffer)\n            buffer = ibuffer;\n\n        static unsigned short index = 0;\n        std::sprintf(buffer, \"\\\\tmpfile%05X.tmp\", index++);\n        return buffer;\n    }\n} // archive\n} // boost\n\n#elif defined(_WIN32) || defined(__WIN32__) || defined(WIN32)\n// win32 has a brain-dead tmpnam implementation.\n// which leaves temp files in root directory\n// regardless of environmental settings\n\n#include <cstdlib>\n#include <cstring>\n#if defined(BOOST_NO_STDC_NAMESPACE)\nnamespace std{\n    using ::remove;\n    using ::strcpy;\n    using ::strcat;\n    using ::tmpnam;\n}\n#endif // defined(BOOST_NO_STDC_NAMESPACE)\n\n#include <direct.h>\n#include <boost/archive/tmpdir.hpp>\n\n//#if defined(__COMO__)\n#if !defined(BOOST_EMBTC)\n    #define chdir _chdir\n#endif\n//#endif  // defined win32\n\n#if defined(NDEBUG) && defined(BOOST_BORLANDC)\n    #define STRCPY strcpy\n#else\n    #define STRCPY std::strcpy\n#endif\n\nnamespace boost {\nnamespace archive {\n    const char * test_filename(const char * dir = NULL, char *fname = NULL){\n        static char ibuffer [512];\n        ibuffer[0] = '\\0';\n        if(NULL == dir){\n            dir = boost::archive::tmpdir();\n        }\n        STRCPY(ibuffer, dir);\n        std::strcat(ibuffer, \"/\");\n        if(NULL == fname){\n            char old_dir[256];\n            _getcwd(old_dir, sizeof(old_dir) - 1);\n            chdir(dir);\n            // (C) Copyright 2010 Dean Michael Berris. <mikhailberis@gmail.com>\n            // Instead of using std::tmpnam, we use Boost.Filesystem's unique_path\n            boost::filesystem::path tmp_path =\n                boost::filesystem::unique_path(\"%%%%%\");\n            std::strcat(ibuffer, tmp_path.string().c_str());\n            chdir(old_dir);\n        }\n        else{\n            std::strcat(ibuffer, fname);\n        }\n        return ibuffer;\n    }\n    const char * tmpnam(char * buffer){\n        const char * name = test_filename(NULL, NULL);\n        if(NULL != buffer){\n            STRCPY(buffer, name);\n        }\n        return name;\n    }\n} // archive\n} // boost\n\n#else // defined(_WIN32) || defined(__WIN32__) || defined(WIN32)\n#if defined(__hpux)\n// (C) Copyright 2006 Boris Gubenko.\n// HP-UX has a restriction that for multi-thread applications, (i.e.\n// the ones compiled -mt) if argument to tmpnam is a NULL pointer, then,\n// citing the tmpnam(3S) manpage, \"the operation is not performed and a\n// NULL pointer is returned\". tempnam does not have this restriction, so,\n// let's use tempnam instead.\n\n#define tmpnam(X) tempnam(NULL,X)\n\nnamespace boost {\nnamespace archive {\n    using ::tmpnam;\n} // archive\n} // boost\n\n#else // defined(__hpux)\n\n// (C) Copyright 2010 Dean Michael Berris.\n// Instead of using the potentially dangerous tempnam function that's part\n// of the C standard library, on Unix/Linux we use the more portable and\n// \"safe\" unique_path function provided in the Boost.Filesystem library.\n\n#include <boost/archive/tmpdir.hpp>\n\nnamespace boost {\nnamespace archive {\n    char const * tmpnam(char * buffer) {\n        static char name[512] = {0};\n        if (name[0] == 0) {\n            boost::filesystem::path tempdir(tmpdir());\n            boost::filesystem::path tempfilename =\n                boost::filesystem::unique_path(\"serialization-%%%%\");\n            boost::filesystem::path temp = tempdir / tempfilename;\n            std::strcat(name, temp.string().c_str());\n        }\n        if (buffer != 0) std::strcpy(buffer, name);\n        return name;\n    }\n} // archive\n} // boost\n\n#endif // defined(__hpux)\n#endif // defined(_WIN32) || defined(__WIN32__) || defined(WIN32)\n\n#include <boost/core/lightweight_test.hpp>\n\n#define BOOST_CHECK( P ) \\\n    BOOST_TEST( (P) )\n#define BOOST_REQUIRE( P )  \\\n    BOOST_TEST( (P) )\n#define BOOST_CHECK_MESSAGE( P, M )  \\\n    ((P)? (void)0 : ::boost::detail::error_impl( (M) , __FILE__, __LINE__, BOOST_CURRENT_FUNCTION))\n#define BOOST_REQUIRE_MESSAGE( P, M ) \\\n    BOOST_CHECK_MESSAGE( (P), (M) )\n#define BOOST_CHECK_EQUAL( A , B ) \\\n    BOOST_TEST( (A) == (B) )\n\nnamespace boost { namespace detail {\ninline void msg_impl(char const * msg, char const * file, int line, char const * function)\n{\n    std::cerr << file << \"(\" << line << \"): \" << msg << \" in function '\" << function << \"'\" << std::endl;\n}\n} } // boost::detail\n\n#define BOOST_WARN_MESSAGE( P, M )  \\\n    ((P)? (void)0 : ::boost::detail::msg_impl( (M) , __FILE__, __LINE__, BOOST_CURRENT_FUNCTION))\n#define BOOST_MESSAGE( M ) \\\n    BOOST_WARN_MESSAGE( true , (M) )\n\n#define BOOST_CHECKPOINT( M ) \\\n    BOOST_WARN_MESSAGE( true , (M) )\n\n//#define BOOST_TEST_DONT_PRINT_LOG_VALUE( T )\n\n#define BOOST_FAIL( M ) BOOST_REQUIRE_MESSAGE( false, (M) )\n#define EXIT_SUCCESS 0\n\nint test_main(int argc, char * argv[]);\n\n#include <boost/serialization/singleton.hpp>\n\nint\nmain(int argc, char * argv[]){\n    boost::serialization::get_singleton_module().lock();\n\n    int retval = 1;\n    BOOST_TRY{\n        retval = test_main(argc, argv);\n    }\n    #ifndef BOOST_NO_EXCEPTION_STD_NAMESPACE\n        BOOST_CATCH(const std::exception & e){\n            BOOST_ERROR(e.what());\n        }\n    #endif\n    BOOST_CATCH(...){\n        BOOST_ERROR(\"failed with uncaught exception:\");\n    }\n    BOOST_CATCH_END\n\n    boost::serialization::get_singleton_module().unlock();\n\n    int error_count = boost::report_errors();\n    if(error_count > 0)\n        retval = error_count;\n    return retval;\n}\n\n// the following is to ensure that when one of the libraries changes\n// BJAM rebuilds and relinks the test.\n/*\n#include \"text_archive.hpp\"\n#include \"text_warchive.hpp\"\n#include \"binary_archive.hpp\"\n#include \"xml_archive.hpp\"\n#include \"xml_warchive.hpp\"\n\n#include \"polymorphic_text_archive.hpp\"\n#include \"polymorphic_text_warchive.hpp\"\n#include \"polymorphic_binary_archive.hpp\"\n#include \"polymorphic_xml_archive.hpp\"\n#include \"polymorphic_xml_warchive.hpp\"\n*/\n\n/////////////////////////////////////////////\n// invoke header for a custom archive test.\n\n/////////////////////////////////////////////\n// invoke header for a custom archive test.\n#if ! defined(BOOST_ARCHIVE_TEST)\n#define BOOST_ARCHIVE_TEST text_archive.hpp\n#endif\n\n#include <boost/preprocessor/stringize.hpp>\n#include BOOST_PP_STRINGIZE(BOOST_ARCHIVE_TEST)\n\n#ifndef TEST_STREAM_FLAGS\n    #define TEST_STREAM_FLAGS (std::ios_base::openmode)0\n#endif\n\n#ifndef TEST_ARCHIVE_FLAGS\n    #define TEST_ARCHIVE_FLAGS 0\n#endif\n\n#ifndef TEST_DIRECTORY\n#define TEST_DIRECTORY\n#else\n#define __x__ TEST_DIRECTORY\n#undef TEST_DIRECTORY\n#define TEST_DIRECTORY BOOST_PP_STRINGIZE(__x__)\n#endif\n\n#endif // BOOST_SERIALIZATION_TEST_TOOLS_HPP\n"
  },
  {
    "path": "test/test_tracking.cpp",
    "content": "/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// test_tracking_save.cpp\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n// should pass compilation and execution\n\n#include <cstddef> // NULL\n#include <fstream>\n\n#include <boost/config.hpp>\n#include <cstdio> // remove\n#if defined(BOOST_NO_STDC_NAMESPACE)\nnamespace std{\n    using ::remove;\n}\n#endif\n\n#include \"test_tools.hpp\"\n#include <boost/serialization/tracking.hpp>\n#include <boost/serialization/nvp.hpp>\n\n#define TEST_CLASS(N, TRACKING) \\\nclass N \\\n{ \\\n    friend class boost::serialization::access; \\\n    template<class Archive> \\\n    void serialize(Archive & /* ar */, const unsigned int /* file_version */){ \\\n        ++count; \\\n    } \\\npublic: \\\n    static unsigned int count; \\\n}; \\\nunsigned int N::count = 0;\\\nBOOST_CLASS_TRACKING(N, TRACKING)\n\nTEST_CLASS(AN, ::boost::serialization::track_never)\nTEST_CLASS(AS, ::boost::serialization::track_selectively)\nTEST_CLASS(AA, ::boost::serialization::track_always)\n\n// test pointers\nTEST_CLASS(PAN, ::boost::serialization::track_never)\nTEST_CLASS(PAS, ::boost::serialization::track_selectively)\nTEST_CLASS(PAA, ::boost::serialization::track_always)\n\nvoid out(const char *testfile)\n{\n    test_ostream os(testfile, TEST_STREAM_FLAGS);\n    test_oarchive oa(os, TEST_ARCHIVE_FLAGS);\n    // write object twice to check tracking\n    AN an;\n    AS as;\n    AA aa;\n    oa << BOOST_SERIALIZATION_NVP(an) << BOOST_SERIALIZATION_NVP(an);\n    BOOST_CHECK(an.count == 2);\n    oa << BOOST_SERIALIZATION_NVP(as) << BOOST_SERIALIZATION_NVP(as);\n    BOOST_CHECK(as.count == 2);\n    oa << BOOST_SERIALIZATION_NVP(aa) << BOOST_SERIALIZATION_NVP(aa);\n    BOOST_CHECK(aa.count == 1);\n\n    PAN *pan = new PAN;\n    PAS *pas = new PAS;\n    PAA *paa = new PAA;\n    oa << BOOST_SERIALIZATION_NVP(pan) << BOOST_SERIALIZATION_NVP(pan);\n    BOOST_CHECK(pan->count == 2);\n    oa << BOOST_SERIALIZATION_NVP(pas) << BOOST_SERIALIZATION_NVP(pas);\n    BOOST_CHECK(pas->count == 1);\n    oa << BOOST_SERIALIZATION_NVP(paa) << BOOST_SERIALIZATION_NVP(paa);\n    BOOST_CHECK(paa->count == 1);\n    delete pan;\n    delete pas;\n    delete paa;\n}\n\nvoid in(const char *testfile)\n{\n    test_istream is(testfile, TEST_STREAM_FLAGS);\n    test_iarchive ia(is, TEST_ARCHIVE_FLAGS);\n    // read object twice to check tracking\n    AN an;\n    AS as;\n    AA aa;\n\n    AN::count = 0;\n    AS::count = 0;\n    AA::count = 0;\n\n    ia >> BOOST_SERIALIZATION_NVP(an) >> BOOST_SERIALIZATION_NVP(an);\n    BOOST_CHECK(an.count == 2);\n    ia >> BOOST_SERIALIZATION_NVP(as) >> BOOST_SERIALIZATION_NVP(as);\n    BOOST_CHECK(as.count == 2);\n    ia >> BOOST_SERIALIZATION_NVP(aa) >> BOOST_SERIALIZATION_NVP(aa);\n    BOOST_CHECK(aa.count == 1);\n\n    PAN::count = 0;\n    PAS::count = 0;\n    PAA::count = 0;\n\n    PAN *pan = NULL;\n    PAS *pas = NULL;\n    PAA *paa = NULL;\n    ia >> BOOST_SERIALIZATION_NVP(pan);\n    ia >> BOOST_SERIALIZATION_NVP(pan);\n    BOOST_CHECK(pan->count == 2);\n    ia >> BOOST_SERIALIZATION_NVP(pas);\n    ia >> BOOST_SERIALIZATION_NVP(pas);\n    BOOST_CHECK(pas->count == 1);\n    ia >> BOOST_SERIALIZATION_NVP(paa);\n    ia >> BOOST_SERIALIZATION_NVP(paa);\n    BOOST_CHECK(paa->count == 1);\n    delete pan;\n    delete pas;\n    delete paa;\n}\n\nint\ntest_main( int /* argc */, char* /* argv */[] )\n{\n    const char * testfile = boost::archive::tmpnam(NULL);\n    BOOST_REQUIRE(NULL != testfile);\n\n    out(testfile);\n    in(testfile);\n    std::remove(testfile);\n    return EXIT_SUCCESS;\n}\n\n"
  },
  {
    "path": "test/test_traits_fail.cpp",
    "content": "/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// test_traits_fail.cpp: test implementation level trait\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n// compile test for traits\n#include \"test_tools.hpp\"\n#include <boost/serialization/level.hpp>\n#include <boost/serialization/version.hpp>\n\nclass A\n{\n};\n\nBOOST_CLASS_IMPLEMENTATION(A, boost::serialization::not_serializable)\n// It can make no sense to assign a version number to a class that\n// is not serialized with class information\nBOOST_CLASS_VERSION(A, 2) // should fail during compile\n// It can make no sense to assign tracking behavior to a class that\n// is not serializable. Should fail during compile.\nBOOST_CLASS_TRACKING(A, boost::serialization::track_never)\n\nclass B\n{\n};\n\nBOOST_CLASS_IMPLEMENTATION(B, boost::serialization::object_class_info)\nBOOST_CLASS_VERSION(B, 2)\nBOOST_CLASS_TRACKING(B, boost::serialization::track_always)\n\nint\ntest_main( int /* argc */, char* /* argv */[] )\n{\n    return EXIT_SUCCESS;\n}\n\n// EOF\n"
  },
  {
    "path": "test/test_traits_pass.cpp",
    "content": "/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// test_traits_pass.cpp: test implementation level trait\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n// compile test for traits\n#include \"test_tools.hpp\"\n\n#include <boost/serialization/level.hpp>\n#include <boost/serialization/tracking.hpp>\n#include <boost/serialization/version.hpp>\n\nclass B\n{\n};\n\nBOOST_CLASS_IMPLEMENTATION(B, boost::serialization::object_class_info)\nBOOST_CLASS_VERSION(B, 2)\nBOOST_CLASS_TRACKING(B, boost::serialization::track_always)\n\nint\ntest_main( int argc, char* argv[] )\n{\n    return EXIT_SUCCESS;\n}\n\n// EOF\n"
  },
  {
    "path": "test/test_unique_ptr.cpp",
    "content": "/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// test_unique_ptr.cpp\n\n// (C) Copyright 2002-14 Robert Ramey - http://www.rrsd.com .\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n#include <fstream>\n#include <cstdio> // remove, std::auto_ptr interface wrong in dinkumware\n#include <boost/config.hpp>\n#if defined(BOOST_NO_STDC_NAMESPACE)\nnamespace std{\n    using ::remove;\n}\n#endif\n#include <boost/serialization/nvp.hpp>\n\n#include \"test_tools.hpp\"\n\n/////////////////////////////////////////////////////////////\n// test std::unique_ptr serialization\nclass A\n{\nprivate:\n    friend class boost::serialization::access;\n    int x;\n    template<class Archive>\n    void serialize(Archive &ar, const unsigned int /* file_version */){\n        ar & BOOST_SERIALIZATION_NVP(x);\n    }\npublic:\n    A(){}    // default constructor\n    ~A(){}   // default destructor\n};\n\n#ifndef BOOST_NO_CXX11_SMART_PTR\n#include <boost/serialization/unique_ptr.hpp>\n\nint test_main(int /* argc */, char * /* argv */[]){\n    const char * filename = boost::archive::tmpnam(NULL);\n    BOOST_REQUIRE(NULL != filename);\n\n    // create  a new auto pointer to ta new object of type A\n    std::unique_ptr<A> spa(new A);\n    {\n        test_ostream os(filename, TEST_STREAM_FLAGS);\n        test_oarchive oa(os, TEST_ARCHIVE_FLAGS);\n        oa << BOOST_SERIALIZATION_NVP(spa);\n    }\n    {\n        // reset the unique_ptr to NULL\n        // thereby destroying the object of type A\n        // note that the reset automagically maintains the reference count\n        spa.reset();\n        test_istream is(filename, TEST_STREAM_FLAGS);\n        test_iarchive ia(is, TEST_ARCHIVE_FLAGS);\n        ia >> BOOST_SERIALIZATION_NVP(spa);\n        std::remove(filename);\n    }\n    return EXIT_SUCCESS;\n}\n\n#else\n\nint test_main(int /* argc */, char * /* argv */[]){\n    return EXIT_SUCCESS;\n}\n\n#endif // BOOST_NO_CXX11_SMART_PTR\n"
  },
  {
    "path": "test/test_unregistered.cpp",
    "content": "/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// test_unregistered.cpp\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n// should pass compilation and execution\n\n#include <fstream>\n\n#include <cstddef> // NULL\n#include <cstdio> // remove\n#include <cstring> // strcmp\n#include <boost/config.hpp>\n#if defined(BOOST_NO_STDC_NAMESPACE)\nnamespace std{\n    using ::remove;\n}\n#endif\n\n#include \"test_tools.hpp\"\n\n#include <boost/archive/archive_exception.hpp>\n#include <boost/serialization/base_object.hpp>\n#include <boost/serialization/type_info_implementation.hpp>\n#include <boost/core/no_exceptions_support.hpp>\n\nclass polymorphic_base\n{\n    friend class boost::serialization::access;\n    template<class Archive>\n    void serialize(Archive & /* ar */, const unsigned int /* file_version */){\n    }\npublic:\n    virtual ~polymorphic_base(){};\n};\n\nclass polymorphic_derived1 : public polymorphic_base\n{\n    friend class boost::serialization::access;\n    template<class Archive>\n    void serialize(Archive &ar, const unsigned int /* file_version */){\n        ar & BOOST_SERIALIZATION_BASE_OBJECT_NVP(polymorphic_base);\n    }\n};\n\nclass polymorphic_derived2 : public polymorphic_base\n{\n    friend class boost::serialization::access;\n    template<class Archive>\n    void serialize(Archive &ar, const unsigned int /* file_version */){\n        ar & BOOST_SERIALIZATION_BASE_OBJECT_NVP(polymorphic_base);\n    }\n};\n\nstruct type1 {\n    template<typename Archive>\n    void serialize(Archive&, unsigned int ver) {\n        BOOST_CHECK(ver == 1);\n    }\n};\nstruct type2 {\n    template<typename Archive>\n    void serialize(Archive&, unsigned int ver) {\n        BOOST_CHECK(ver == 2);\n    }\n};\n\nBOOST_CLASS_VERSION(type1, 1);\nBOOST_CLASS_VERSION(type2, 2);\n\n// save unregistered polymorphic classes\nvoid save_unregistered1(const char *testfile)\n{\n    test_ostream os(testfile, TEST_STREAM_FLAGS);\n    test_oarchive oa(os, TEST_ARCHIVE_FLAGS);\n\n    polymorphic_base *rb1 =  new polymorphic_derived1;\n\n    // registration IS necessary when serializing a polymorphic class\n    // through pointer to the base class\n    bool except = false;\n    BOOST_TRY {\n        oa << BOOST_SERIALIZATION_NVP(rb1);\n    }\n    BOOST_CATCH(boost::archive::archive_exception const& aex){\n        except = true;\n    }\n    BOOST_CATCH_END\n    BOOST_CHECK_MESSAGE(except, \"lack of registration not detected !\");\n\n    delete rb1;\n}\n\n// note: the corresponding save function above will not result in\n// valid archive - hence, the following code which attempts to load\n// and archive will fail.  Leave this as a reminder not to do this\n#if 0\n// load unregistered polymorphic classes\nvoid load_unregistered1(const char *testfile)\n{\n    std::ifstream is(testfile);\n    boost::archive::iarchive ia(is);\n\n    polymorphic_base *rb1(NULL);\n\n    // registration IS necessary when serializing a polymorphic class\n    // through pointer to the base class\n    bool except = false;\n    BOOST_TRY {\n        ia >> BOOST_SERIALIZATION_NVP(rb1);\n    }\n    BOOST_CATCH(boost::archive::archive_exception const& aex){\n        except = true;\n        BOOST_CHECK_MESSAGE(\n            NULL == rb1,\n            \"failed load resulted in a non-null pointer\"\n        );\n    }\n    BOOST_CATCH_END\n    BOOST_CHECK_MESSAGE(except, \"lack of registration not detected !\");\n\n    delete rb1;\n}\n#endif\n\n// save unregistered polymorphic classes\nvoid save_unregistered2(const char *testfile)\n{\n    test_ostream os(testfile, TEST_STREAM_FLAGS);\n    test_oarchive oa(os, TEST_ARCHIVE_FLAGS);\n\n    polymorphic_derived1 *rd1 = new polymorphic_derived1;\n\n    // registration is NOT necessary when serializing a polymorphic class\n    // through pointer to a derived class\n    bool except = false;\n    BOOST_TRY {\n        oa << BOOST_SERIALIZATION_NVP(rd1);\n    }\n    BOOST_CATCH(boost::archive::archive_exception const& aex){\n        except = true;\n    }\n    BOOST_CATCH_END\n    BOOST_CHECK_MESSAGE(! except, \"registration not detected !\");\n\n    delete rd1;\n}\n\n// note: the corresponding save function above will not result in\n// valid archive - hence, the following code which attempts to load\n// and archive will fail.  Leave this as a reminder not to do this\n// load unregistered polymorphic classes\nvoid load_unregistered2(const char *testfile)\n{\n    test_istream is(testfile, TEST_STREAM_FLAGS);\n    test_iarchive ia(is, TEST_ARCHIVE_FLAGS);\n\n    polymorphic_derived1 *rd1 = NULL;\n\n    // registration is NOT necessary when serializing a polymorphic class\n    // or through pointer to a derived class\n    bool except = false;\n    BOOST_TRY {\n        ia >> BOOST_SERIALIZATION_NVP(rd1);\n    }\n    BOOST_CATCH(boost::archive::archive_exception const& aex){\n        except = true;\n        BOOST_CHECK_MESSAGE(\n            NULL == rd1,\n            \"failed load resulted in a non-null pointer\"\n        );\n    }\n    BOOST_CATCH_END\n    BOOST_CHECK_MESSAGE(! except, \"registration not detected !\");\n\n    delete rd1;\n}\n\n// save registered polymorphic class\nvoid save_registered(const char *testfile)\n{\n    test_ostream os(testfile, TEST_STREAM_FLAGS);\n    test_oarchive oa(os, TEST_ARCHIVE_FLAGS);\n\n    polymorphic_base *rb1 = new polymorphic_derived1;\n    polymorphic_base *rb2 = new polymorphic_derived2;\n\n    // registration (forward declaration) will permit correct serialization\n    // through a pointer to a base class\n    oa.register_type(static_cast<polymorphic_derived1 *>(NULL));\n    oa.register_type(static_cast<polymorphic_derived2 *>(NULL));\n    oa << BOOST_SERIALIZATION_NVP(rb1);\n    oa << BOOST_SERIALIZATION_NVP(rb2);\n\n    delete rb1;\n    delete rb2;\n}\n\n// load registered polymorphic class\nvoid load_registered(const char *testfile)\n{\n    test_istream is(testfile, TEST_STREAM_FLAGS);\n    test_iarchive ia(is, TEST_ARCHIVE_FLAGS);\n\n    polymorphic_base *rb1 = NULL;\n    polymorphic_base *rb2 = NULL;\n\n    // registration (forward declaration) will permit correct serialization\n    // through a pointer to a base class\n    ia.register_type(static_cast<polymorphic_derived1 *>(NULL));\n    ia.register_type(static_cast<polymorphic_derived2 *>(NULL));\n\n    ia >> BOOST_SERIALIZATION_NVP(rb1);\n\n    BOOST_CHECK_MESSAGE(NULL != rb1, \"Load resulted in NULL pointer\");\n    BOOST_CHECK_MESSAGE(\n        boost::serialization::type_info_implementation<\n            polymorphic_derived1\n        >::type::get_const_instance()\n        ==\n        * boost::serialization::type_info_implementation<\n            polymorphic_base\n        >::type::get_const_instance().get_derived_extended_type_info(*rb1),\n        \"restored pointer b1 not of correct type\"\n    );\n\n    ia >> BOOST_SERIALIZATION_NVP(rb2);\n    BOOST_CHECK_MESSAGE(NULL != rb2, \"Load resulted in NULL pointer\");\n    BOOST_CHECK_MESSAGE(\n        boost::serialization::type_info_implementation<\n            polymorphic_derived2\n        >::type::get_const_instance()\n        ==\n        * boost::serialization::type_info_implementation<\n            polymorphic_base\n        >::type::get_const_instance().get_derived_extended_type_info(*rb2),\n        \"restored pointer b2 not of correct type\"\n    );\n\n    delete rb1;\n    delete rb2;\n}\n\n// store a pointer from slot0\nvoid save_unregistered_pointer(const char *testfile)\n{\n    test_ostream os(testfile, TEST_STREAM_FLAGS);\n    test_oarchive oa(os, TEST_ARCHIVE_FLAGS);\n\n    oa.register_type(static_cast<type2 *>(NULL));\n\n    type1 instance1;\n    type2 *pointer2 = new type2;\n\n    BOOST_TRY {\n        oa & BOOST_SERIALIZATION_NVP(instance1) & BOOST_SERIALIZATION_NVP(pointer2);\n    }\n    BOOST_CATCH(...) {\n        BOOST_CHECK_MESSAGE(false, \"unexpected exception\");\n    }\n    BOOST_CATCH_END\n\n    delete pointer2;\n}\n\n// load a pointer from slot0 which has no pointer serializer\nvoid load_unregistered_pointer(const char *testfile)\n{\n    test_istream is(testfile);\n    test_iarchive ia(is);\n\n    type1 instance1;\n    type2 *pointer2(NULL);\n\n    bool except = false;\n    BOOST_TRY {\n        ia & BOOST_SERIALIZATION_NVP(instance1) & BOOST_SERIALIZATION_NVP(pointer2);\n    }\n    BOOST_CATCH(boost::archive::archive_exception const& aex){\n        except = true;\n        BOOST_CHECK_MESSAGE(\n            std::strcmp(aex.what(), \"unregistered class\") == 0,\n            \"incorrect exception\"\n        );\n    }\n    BOOST_CATCH_END\n    BOOST_CHECK_MESSAGE(except, \"lack of registration not detected !\");\n    BOOST_CHECK_MESSAGE(NULL == pointer2, \"expected failed load\");\n\n    delete pointer2;\n}\n\nint\ntest_main( int /* argc */, char* /* argv */[] )\n{\n    const char * testfile = boost::archive::tmpnam(NULL);\n    BOOST_REQUIRE(NULL != testfile);\n    save_unregistered1(testfile);\n//  load_unregistered1(testfile);\n    save_unregistered2(testfile);\n    load_unregistered2(testfile);\n    save_registered(testfile);\n    load_registered(testfile);\n    save_unregistered_pointer(testfile);\n    load_unregistered_pointer(testfile);\n    std::remove(testfile);\n    return EXIT_SUCCESS;\n}\n\n// EOF\n"
  },
  {
    "path": "test/test_valarray.cpp",
    "content": "/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// test_valarrray.cpp\n\n// (C) Copyright 2005 Matthias Troyer .\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n// should pass compilation and execution\n\n#include <cstddef> // NULL\n#include <fstream>\n\n#include <cstdio> // remove\n#include <boost/config.hpp>\n#if defined(BOOST_NO_STDC_NAMESPACE)\nnamespace std{\n    using ::remove;\n}\n#endif\n\n#include \"test_tools.hpp\"\n\n#include <boost/serialization/valarray.hpp>\n\nint test_main( int /* argc */, char* /* argv */[] )\n{\n    const char * testfile = boost::archive::tmpnam(NULL);\n    BOOST_REQUIRE(NULL != testfile);\n\n    // test array of objects\n    std::valarray<int> avalarray(2);\n    avalarray[0] = 42;\n    avalarray[1] = -42;\n    {\n        test_ostream os(testfile, TEST_STREAM_FLAGS);\n        test_oarchive oa(os, TEST_ARCHIVE_FLAGS);\n        oa << boost::serialization::make_nvp(\"avalarray\", avalarray);\n    }\n    std::valarray<int> avalarray1;\n    {\n        test_istream is(testfile, TEST_STREAM_FLAGS);\n        test_iarchive ia(is, TEST_ARCHIVE_FLAGS);\n        ia >> boost::serialization::make_nvp(\"avalarray\", avalarray1);\n    }\n    bool equal = (    avalarray.size() == avalarray1.size()\n                   && avalarray[0] == avalarray1[0]\n                   && avalarray[1] == avalarray1[1]\n                 );\n\n    BOOST_CHECK(equal);\n    std::remove(testfile);\n    return EXIT_SUCCESS;\n}\n\n// EOF\n"
  },
  {
    "path": "test/test_variant.cpp",
    "content": "/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// test_variant.cpp\n// test of non-intrusive serialization of variant types\n//\n// copyright (c) 2005\n// troy d. straszheim <troy@resophonic.com>\n// http://www.resophonic.com\n//\n// copyright (c) 2023\n// Robert Ramey <ramey@rrsd.com>\n// http://www.rrsd.com\n//\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n//\n// See http://www.boost.org for updates, documentation, and revision history.\n//\n// thanks to Robert Ramey and Peter Dimov.\n//\n\n#include <cstddef> // NULL\n#include <cstdio> // remove\n#include <fstream>\n\n#include <boost/config.hpp>\n#if BOOST_CXX_VERSION > 199711L // only include floating point if C++ version >= C++11\n#include <boost/math/special_functions/next.hpp>\n#endif\n\n#if defined(BOOST_NO_STDC_NAMESPACE)\nnamespace std {\n    using ::remove;\n}\n#endif\n\n#include <boost/type_traits/is_same.hpp>\n#include <boost/mpl/eval_if.hpp>\n#include <boost/mpl/identity.hpp>\n\n#if defined(_MSC_VER) && (_MSC_VER <= 1020)\n#  pragma warning (disable : 4786) // too long name, harmless warning\n#endif\n\n#include \"test_tools.hpp\"\n\n#include <boost/archive/archive_exception.hpp>\n#include <boost/serialization/nvp.hpp>\n#include <boost/serialization/throw_exception.hpp>\n\n#include <boost/variant/static_visitor.hpp>\n\nnamespace boost {\n    template<typename ResultType> class static_visitor;\n}\n\n#include \"A.hpp\"\n#include \"A.ipp\"\n\nclass are_equal\n    : public boost::static_visitor<bool>\n{\npublic:\n    typedef bool result_type;\n    // note extra rigamarole for compilers which don't support\n    // partial function template ordering - specifically msvc 6.x\n    struct same {\n        template<class T, class U>\n        static bool invoke(const T & t, const U & u){\n            return t == u;\n        }\n    };\n\n    struct not_same {\n        template<class T, class U>\n        static bool invoke(const T &, const U &){\n            return false;\n        }\n    };\n\n    template <class T, class U>\n    bool operator()( const T & t, const U & u) const\n    {\n        typedef typename boost::mpl::eval_if<boost::is_same<T, U>,\n            boost::mpl::identity<same>,\n            boost::mpl::identity<not_same>\n        >::type type;\n        return type::invoke(t, u);\n    }\n\n    template <class T, class U>\n    bool operator()(T * const & t,  U * const & u) const\n    {\n        return this->operator()(*t, *u);\n    }\n\n    bool operator()( const float & lhs, const float & rhs ) const\n    {\n        #if BOOST_CXX_VERSION > 199711L // only include floating point if C++ version >= C++11\n        return std::abs( boost::math::float_distance(lhs, rhs) ) < 2;\n        #else\n        return true;\n        #endif\n    }\n    bool operator()( const double & lhs, const double & rhs ) const\n    {\n        #if BOOST_CXX_VERSION > 199711L // only include floating point if C++ version >= C++11\n        return std::abs( boost::math::float_distance(lhs, rhs) ) < 2;\n        #else\n        return true;\n        #endif\n    }\n};\n\ntemplate<class Variant>\nbool test_type(const Variant & v){\n    const char * testfile = boost::archive::tmpnam(NULL);\n    BOOST_REQUIRE(testfile != NULL);\n    {\n        test_ostream os(testfile, TEST_STREAM_FLAGS);\n        test_oarchive oa(os, TEST_ARCHIVE_FLAGS);\n        oa << boost::serialization::make_nvp(\"written\", v);\n    }\n\n    Variant vx;\n    {\n        test_istream is(testfile, TEST_STREAM_FLAGS);\n        test_iarchive ia(is, TEST_ARCHIVE_FLAGS);\n        BOOST_TRY {\n            ia >> boost::serialization::make_nvp(\"written\", vx);\n            BOOST_CHECK(visit(are_equal(), v, vx));\n        }\n        BOOST_CATCH(boost::archive::archive_exception const& e) {\n            return false;\n        }\n        BOOST_CATCH_END\n    }\n    std::remove(testfile);\n    return true;\n}\n\ntemplate<class Variant>\nvoid test(Variant & v)\n{\n    // uninitialized\n    test_type(v);\n    v = false;\n    test_type(v);\n    v = 1;\n    test_type(v);\n    v = (float) 2.3;\n    test_type(v);\n    v = (double) 6.4;\n    test_type(v);\n    v = A();\n    test_type(v);\n    v = std::string(\"we can't stop here, this is Bat Country\");\n    test_type(v);\n}\n\n#include <boost/serialization/variant.hpp>\n\n#include <boost/variant/variant.hpp>\n\n#include <cstdio>\n\nint test_boost_variant(){\n    std::cerr << \"Testing boost_variant\\n\";\n    boost::variant<bool, int, float, double, A, std::string> v;\n    test(v);\n    const A a;\n    boost::variant<bool, int, float, double, const A *, std::string> v1 = & a;\n    test_type(v1);\n    return EXIT_SUCCESS;\n}\n\n// boost::variant2/variant requires C++ 11\n#if BOOST_CXX_VERSION >= 201103L\n#include <boost/variant2/variant.hpp>\n\nint test_boost_variant2(){\n    std::cerr << \"Testing boost_variant2\\n\";\n    boost::variant2::variant<bool, int, float, double, A, std::string> v;\n    test(v);\n    const A a;\n    boost::variant2::variant<bool, int, float, double, const A *, std::string> v1 = & a;\n    test_type(v1);\n    return EXIT_SUCCESS;\n}\n#endif\n\n// std::variant reqires C++ 17 or more\n#ifndef BOOST_NO_CXX17_HDR_VARIANT\n#include <variant>\nint test_std_variant(){\n    std::cerr << \"Testing Std Variant\\n\";\n    std::variant<bool, int, float, double, A, std::string> v;\n    test(v);\n    const A a;\n    std::variant<bool, int, float, double, const A *, std::string> v1 = & a;\n    test_type(v1);\n    return EXIT_SUCCESS;\n}\n#endif\n\nint test_main( int /* argc */, char* /* argv */[] ){\n    return test_boost_variant()\n    #if BOOST_CXX_VERSION >= 201103L\n    || test_boost_variant2()\n    #endif\n    #ifndef BOOST_NO_CXX17_HDR_VARIANT\n    || test_std_variant()\n    #endif\n    ;\n}\n\n// EOF\n"
  },
  {
    "path": "test/test_vector.cpp",
    "content": "/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// test_vector.cpp\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n// should pass compilation and execution\n\n#include <cstddef> // NULL\n#include <fstream>\n\n#include <cstdio> // remove\n#include <boost/config.hpp>\n#if defined(BOOST_NO_STDC_NAMESPACE)\nnamespace std{\n    using ::remove;\n}\n#endif\n#include <boost/static_assert.hpp>\n#include \"test_tools.hpp\"\n\n#include <boost/serialization/vector.hpp>\n\n// normal class with default constructor\n#include \"A.hpp\"\n#include \"A.ipp\"\n\ntemplate <class T>\nint test_vector_detail(const std::vector<T> & avector)\n{\n    const char * testfile = boost::archive::tmpnam(NULL);\n    BOOST_REQUIRE(NULL != testfile);\n\n    // test array of objects\n    {\n        test_ostream os(testfile, TEST_STREAM_FLAGS);\n        test_oarchive oa(os, TEST_ARCHIVE_FLAGS);\n        oa << boost::serialization::make_nvp(\"avector\", avector);\n    }\n    std::vector< T > avector1;\n    {\n        test_istream is(testfile, TEST_STREAM_FLAGS);\n        test_iarchive ia(is, TEST_ARCHIVE_FLAGS);\n        ia >> boost::serialization::make_nvp(\"avector\", avector1);\n    }\n    BOOST_CHECK(avector == avector1);\n    std::remove(testfile);\n    return EXIT_SUCCESS;\n}\n\ntemplate <class T>\nint test_default_constructible()\n{\n    // test array of objects\n    std::vector<T> avector;\n    avector.push_back(T());\n    avector.push_back(T());\n    return test_vector_detail(avector);\n}\n\n// class without default constructor\nstruct X {\n    //BOOST_DELETED_FUNCTION(X());\npublic:\n    int m_i;\n    X(const X & x) :\n        m_i(x.m_i)\n    {}\n    X(const int & i) :\n        m_i(i)\n    {}\n    bool operator==(const X & rhs) const {\n        return m_i == rhs.m_i;\n    }\n    template<class Archive>\n    void serialize(Archive & ar, const unsigned int /*version*/){\n        ar & BOOST_SERIALIZATION_NVP(m_i);\n    }\n};\n\ntemplate<class Archive>\ninline void save_construct_data(\n    Archive & ar,\n    const X * x,\n    const unsigned int /* file_version */\n){\n    // variable used for construction\n    ar << boost::serialization::make_nvp(\"i\", x->m_i);\n}\n\ntemplate<class Archive>\ninline void load_construct_data(\n    Archive & ar,\n    X * x,\n    const unsigned int /* file_version */\n){\n    int i;\n    ar >> boost::serialization::make_nvp(\"i\", i);\n    ::new(x)X(i);\n}\n\nint test_non_default_constructible()\n{\n    // test array of objects\n    std::vector<X> avector;\n    avector.push_back(X(123));\n    avector.push_back(X(456));\n    return test_vector_detail(avector);\n}\n\nint test_main( int /* argc */, char* /* argv */[] )\n{\n    int res;\n    res = test_default_constructible<A>();\n    // test an int vector for which optimized versions should be available\n    if (res == EXIT_SUCCESS)\n        res = test_default_constructible<int>();\n    // test a bool vector\n    if (res == EXIT_SUCCESS)\n        res = test_default_constructible<bool>();\n    if (res == EXIT_SUCCESS)\n        res = test_non_default_constructible();\n    return res;\n}\n\n// EOF\n"
  },
  {
    "path": "test/test_void_cast.cpp",
    "content": "/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// test_void_cast.cpp: test implementation of run-time casting of void pointers\n\n// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n// <gennadiy.rozental@tfn.com>\n\n#include <cstddef> // NULL\n#include \"test_tools.hpp\"\n#include <boost/serialization/extended_type_info_typeid.hpp>\n#include <boost/serialization/void_cast.hpp>\n#include <boost/serialization/singleton.hpp>\n\nclass Base1\n{\n    char a;\n};\n\nclass Base2\n{\n    int b;\n};\n\nclass Derived : public Base1, public Base2\n{\n    long c;\n};\n\nclass MostDerived : public Derived\n{\n    char d[32];\n};\n\ntemplate<class T>\nconst boost::serialization::extended_type_info & eti(){\n    return boost::serialization::singleton<\n        boost::serialization::extended_type_info_typeid< T >\n    >::get_const_instance();\n}\n\nint\ntest_main( int /* argc */, char* /* argv */[] )\n{\n    MostDerived md;\n    MostDerived* pmd =& md;\n    Derived* pd = static_cast<Derived*>(pmd);\n\n    Base2* pb2 = static_cast<Base2*>(pmd);\n    Base1* pb1 = static_cast<Base1*>(pd);\n\n    void* vpmd = static_cast<void*>(pmd);\n    void* vpb1 = static_cast<void*>(pb1);\n    void* vpb2 = static_cast<void*>(pb2);\n    void* vpd = static_cast<void*>(pd);\n\n    // simple casts only requiring table lookup\n    BOOST_CHECK(vpd == boost::serialization::void_downcast(\n        eti<Derived>(),\n        eti<Base1>(),\n        vpb1\n    ));\n    BOOST_CHECK(vpb1 == boost::serialization::void_upcast(\n        eti<Derived>(),\n        eti<Base1>(),\n        vpd\n    ));\n    BOOST_CHECK(vpd == boost::serialization::void_downcast(\n        eti<Derived>(),\n        eti<Base2>(),\n        vpb2\n    ));\n    BOOST_CHECK(vpb2 == boost::serialization::void_upcast(\n        eti<Derived>(),\n        eti<Base2>(),\n        vpd\n    ));\n    BOOST_CHECK(vpmd == boost::serialization::void_downcast(\n        eti<MostDerived>(),\n        eti<Derived>(),\n        vpd\n    ));\n    BOOST_CHECK(vpd == boost::serialization::void_upcast(\n        eti<MostDerived>(),\n        eti<Derived>(),\n        vpmd\n    ));\n    // note relationship between MostDerived and Base1 is automatically derived\n    BOOST_CHECK(vpmd == boost::serialization::void_downcast(\n        eti<MostDerived>(),\n        eti<Base1>(),\n        vpb1\n    ));\n    BOOST_CHECK(vpb1 == boost::serialization::void_upcast(\n        eti<MostDerived>(),\n        eti<Base1>(),\n        vpmd\n    ));\n\n    // note relationship between MostDerived and Base2 is automatically derived\n    BOOST_CHECK(vpmd == boost::serialization::void_downcast(\n        eti<MostDerived>(),\n        eti<Base2>(),\n        vpb2\n    ));\n    BOOST_CHECK(vpb2 == boost::serialization::void_upcast(\n        eti<MostDerived>(),\n        eti<Base2>(),\n        vpmd\n    ));\n\n    // note: currently derivations are not optimised.  See void_cast.cpp\n    // for and explanation.  These should still work though.\n\n    // need to double check to validate speed up optimization of derivations\n    BOOST_CHECK(vpmd == boost::serialization::void_downcast(\n        eti<MostDerived>(),\n        eti<Base1>(),\n        vpb1\n    ));\n    BOOST_CHECK(vpb1 == boost::serialization::void_upcast(\n        eti<MostDerived>(),\n        eti<Base1>(),\n        vpmd\n    ));\n    BOOST_CHECK(vpmd == boost::serialization::void_downcast(\n        eti<MostDerived>(),\n        eti<Base2>(),\n        vpb2\n    ));\n    BOOST_CHECK(vpb2 == boost::serialization::void_upcast(\n        eti<MostDerived>(),\n        eti<Base2>(),\n        vpmd\n    ));\n\n    // check things that should fail\n    BOOST_CHECK(NULL == boost::serialization::void_downcast(\n        eti<Base2>(),\n        eti<Base1>(),\n        vpb1\n    ));\n\n    // note that a fundamental feature is that derived/base pairs are created\n    // at compiler time so that all are registered before the main program starts\n    // so leave the registration here at the end to verify this. Note bogus arguments\n    // to workaround msvc 6 bug\n    boost::serialization::void_cast_register<Derived, Base1>(\n        static_cast<Derived *>(NULL),\n        static_cast<Base1 *>(NULL)\n    );\n    boost::serialization::void_cast_register<Derived, Base2>(\n        static_cast<Derived *>(NULL),\n        static_cast<Base2 *>(NULL)\n    );\n    boost::serialization::void_cast_register<MostDerived, Derived>(\n        static_cast<MostDerived *>(NULL),\n        static_cast<Derived *>(NULL)\n    );\n\n    return EXIT_SUCCESS;\n}\n\n// EOF\n"
  },
  {
    "path": "test/test_z.cpp",
    "content": "#if 0\n#include <stdexcept>\n#include <iostream>\n#include <sstream>\n\n#include <boost/optional.hpp>\n#include <boost/archive/text_oarchive.hpp>\n#include <boost/archive/text_iarchive.hpp>\n#include <boost/serialization/optional.hpp>\n\nstruct Foo\n{\n    Foo(int aBar) :\n        mBar(aBar)\n    {\n        if (mBar > 10)\n        {\n            throw std::logic_error(\"too big bar\");\n        }\n    }\n    int bar() const\n    {\n        return mBar;\n    }\n    bool operator==(const Foo & rhs) const {\n        return mBar == rhs.mBar;\n    }\nprivate:\n    int mBar;\n};\n\nnamespace boost {\nnamespace serialization {\n\ntemplate<class Archive>\ninline void serialize(Archive & ar, Foo& foo, const unsigned int /*version*/)\n{\n    std::cout << __FUNCTION__ << \" called\" << std::endl;\n}\n\ntemplate<class Archive>\ninline void save_construct_data(Archive & ar, const Foo* foo, const unsigned int /*version*/)\n{\n    std::cout << __FUNCTION__ << \" called\" << std::endl;\n    ar & foo->bar();\n}\n\ntemplate<class Archive>\ninline void load_construct_data(Archive & ar, Foo* foo, const unsigned int /*version*/)\n{\n    std::cout << __FUNCTION__ << \" called\" << std::endl;\n    int bar;\n    ar & bar;\n    ::new(foo) Foo(bar);\n}\n\n} // serialization\n} // boost\n\n\nint main()\n{\n    boost::optional<Foo> oldFoo = Foo(10);\n    std::ostringstream outStream;\n    boost::archive::text_oarchive outArchive(outStream);\n    outArchive & oldFoo;\n\n    boost::optional<Foo> newFoo;\n    std::istringstream inStream(outStream.str());\n    boost::archive::text_iarchive inArchive(inStream);\n    inArchive & newFoo;\n\n    return !(newFoo == oldFoo);\n}\n\n#elif 0\n/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// test_optional.cpp\n\n// (C) Copyright 2004 Pavel Vozenilek\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n// should pass compilation and execution\n\n#include <cstddef> // NULL\n#include <cstdio> // remove\n#include <fstream>\n\n#include <boost/config.hpp>\n\n#if defined(BOOST_NO_STDC_NAMESPACE)\nnamespace std{\n    using ::remove;\n}\n#endif\n\n#include <boost/archive/archive_exception.hpp>\n\n#define BOOST_ARCHIVE_TEST xml_archive.hpp\n\n#include \"test_tools.hpp\"\n\n#include <boost/serialization/optional.hpp>\n\n#include \"A.hpp\"\n#include \"A.ipp\"\n\nint test_main( int /* argc */, char* /* argv */[] )\n{\n    const char * testfile = boost::archive::tmpnam(NULL);\n    BOOST_REQUIRE(NULL != testfile);\n\n    const boost::optional<int> aoptional1;\n    const boost::optional<int> aoptional2(123);\n    {\n        test_ostream os(testfile, TEST_STREAM_FLAGS);\n        test_oarchive oa(os, TEST_ARCHIVE_FLAGS);\n        //oa << boost::serialization::make_nvp(\"aoptional1\",aoptional1);\n        //oa << boost::serialization::make_nvp(\"aoptional2\",aoptional2);\n    }\n    /*\n    boost::optional<int> aoptional1a(999);\n    boost::optional<int> aoptional2a;\n    {\n        test_istream is(testfile, TEST_STREAM_FLAGS);\n        test_iarchive ia(is, TEST_ARCHIVE_FLAGS);\n        ia >> boost::serialization::make_nvp(\"aoptional1\",aoptional1a);\n        ia >> boost::serialization::make_nvp(\"aoptional2\",aoptional2a);\n    }\n    BOOST_CHECK(aoptional1 == aoptional1a);\n    BOOST_CHECK(aoptional2 == aoptional2a);\n    */\n    std::remove(testfile);\n    return EXIT_SUCCESS;\n}\n\n// EOF\n\n#elif 0\n\n#include <fstream>\n\n#include <boost/archive/xml_woarchive.hpp>\n#include <boost/archive/xml_wiarchive.hpp>\n#include <boost/serialization/string.hpp>\n\n#include \"test_tools.hpp\"\n\nint test_main(int, char *argv[])\n{\n    const char * testfile = boost::archive::tmpnam(NULL);\n\tstd::string s1 = \"kkkabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz\";\n\tstd::wstring w1 = L\"kkk\";\n\tstd::wstring w2 = L\"апр\"; // some non-latin (for example russians) letters\n    {\n        std::wofstream ofs(testfile);\n        {\n            boost::archive::xml_woarchive oa(ofs);\n            oa << boost::serialization::make_nvp(\"key1\", s1);\n            //oa << boost::serialization::make_nvp(\"key2\", w1);\n            //oa << boost::serialization::make_nvp(\"key3\", w2); // here exception is thrown\n        }\n    }\n    std::string new_s1;\n    //std::wstring new_w1;\n    //std::wstring new_w2;\n    {\n        std::wifstream ifs(testfile);\n        {\n            boost::archive::xml_wiarchive ia(ifs);\n            ia >> boost::serialization::make_nvp(\"key1\", new_s1);\n            //ia >> boost::serialization::make_nvp(\"key2\", new_w1);\n            //ia >> boost::serialization::make_nvp(\"key3\", new_w2); // here exception is thrown\n        }\n    }\n    BOOST_CHECK(s1 == new_s1);\n    //BOOST_CHECK(w1 == new_w1);\n    //BOOST_CHECK(w2 == new_w2);\n\treturn 0;\n}\n\n#elif 0\n\n#include <boost/archive/xml_oarchive.hpp>\n#include <boost/serialization/nvp.hpp>\n\n#include <iostream>\n\nint main() {\n        boost::archive::xml_oarchive oa( std::cerr );\n        int bob = 3;\n        oa << boost::serialization::make_nvp( \"bob\", bob );\n}\n\n#elif 0\n\n#include <fstream>\n#include <vector>\n#include <iostream>\n\n#include <boost/archive/binary_iarchive.hpp>\n#include <boost/serialization/nvp.hpp>\n#include <boost/serialization/shared_ptr.hpp>\n#include <boost/serialization/vector.hpp>\n\nstruct boxed_int\n{\n    boxed_int() : i(0) {}\n    boxed_int(int i) : i(i) {}\n    int i;\n    template<class Archive>\n    void serialize(Archive &ar, unsigned version)\n    {\n        ar & BOOST_SERIALIZATION_NVP(i);\n    }\n};\ntypedef boost::shared_ptr<boxed_int> pi;\n\nvoid go(std::istream &is) {\n    std::vector<pi> vv;\n    try\n    {\n        boost::archive::binary_iarchive ia(is);\n        ia & vv;\n    }\n    catch(std::exception &e) {}\n}\n\nint main(int argc, char **argv) {\n    if(argc > 1) {\n        std::ifstream is(argv[1]);\n        go(is);\n    } else {\n        go(std::cin);\n    }\n\n    return 0;\n}\n\n#elif 0\n\n#include <cassert>\n#include <string>\n\n#include <boost/archive/iterators/base64_from_binary.hpp>\n#include <boost/archive/iterators/transform_width.hpp>\n\nnamespace bai = boost::archive::iterators;\nint main()\n{\n    std::string input =\n        \"A large rose-tree stood near the entrance of the garden: the roses growing on it were white, but there were \"\n        \"three gardeners at it, busily painting them red. Alice thought this a very curious thing, and she went nearer \"\n        \"to watch them, and just as she came up to them she heard one of them say, 'Look out now, Five! Don't go \"\n        \"splashing paint over me like that!''I couldn't help it,' said Five, in a sulky tone; 'Seven jogged my \"\n        \"elbow.'On which Seven looked up and said, 'That's right, Five! Always lay the blame on others!''You'd better \"\n        \"not talk!' said Five. 'I heard the Queen say only yesterday you deserved to be beheaded!''What for?' said the \"\n        \"one who had spoken first.'That's none of your business, Two!' said Seven.'Yes, it is his business!' said \"\n        \"Five, 'and I'll tell him—it was for bringing the cook tulip-roots instead of onions.'Seven flung down his \"\n        \"brush, and had just begun 'Well, of all the unjust things—' when his eye chanced to fall upon Alice, as she \"\n        \"stood watching them, and he checked himself suddenly: the others looked round also, and all of them bowed \"\n        \"low.'Would you tell me,' said Alice, a little timidly, 'why you are painting those roses?'Five and Seven said \"\n        \"nothing, but looked at Two. Two began in a low voice, 'Why the fact is, you see, Miss, this here ought to \"\n        \"have been a red rose-tree, and we put a white one in by mistake; and if the Queen was to find it out, we \"\n        \"should all have our heads cut off, you know. So you see, Miss, we're doing our best, afore she comes, to—' At \"\n        \"this moment Five, who had been anxiously looking across the garden, called out 'The Queen! The Queen!' and \"\n        \"the three gardeners instantly threw themselves flat upon their faces. There was a sound of many footsteps, \"\n        \"and Alice looked round, eager to see the Queen.First came ten soldiers carrying clubs; these were all shaped \"\n        \"like the three gardeners, oblong and flat, with their hands and feet at the corners: next the ten courtiers; \"\n        \"these were ornamented all over with diamonds, and walked two and two, as the soldiers did. After these came \"\n        \"the royal children; there were ten of them, and the little dears came jumping merrily along hand in hand, in \"\n        \"couples: they were all ornamented with hearts. Next came the guests, mostly Kings and Queens, and among them \"\n        \"Alice recognised the White Rabbit: it was talking in a hurried nervous manner, smiling at everything that was \"\n        \"said, and went by without noticing her. Then followed the Knave of Hearts, carrying the King's crown on a \"\n        \"crimson velvet cushion; and, last of all this grand procession, came THE KING AND QUEEN OF HEARTS.Alice was \"\n        \"rather doubtful whether she ought not to lie down on her face like the three gardeners, but she could not \"\n        \"remember ever having heard of such a rule at processions; 'and besides, what would be the use of a \"\n        \"procession,' thought she, 'if people had all to lie down upon their faces, so that they couldn't see it?' So \"\n        \"she stood still where she was, and waited.When the procession came opposite to Alice, they all stopped and \"\n        \"looked at her, and the Queen said severely 'Who is this?' She said it to the Knave of Hearts, who only bowed \"\n        \"and smiled in reply.'Idiot!' said the Queen, tossing her head impatiently; and, turning to Alice, she went \"\n        \"on, 'What's your name, child?''My name is Alice, so please your Majesty,' said Alice very politely; but she \"\n        \"added, to herself, 'Why, they're only a pack of cards, after all. I needn't be afraid of them!''And who are \"\n        \"these?' said the Queen, pointing to the three gardeners who were lying round the rosetree; for, you see, as \"\n        \"they were lying on their faces, and the pattern on their backs was the same as the rest of the pack, she \"\n        \"could not tell whether they were gardeners, or soldiers, or courtiers, or three of her own children.'How \"\n        \"should I know?' said Alice, surprised at her own courage. 'It's no business of mine.'The Queen turned crimson \"\n        \"with fury, and, after glaring at her for a moment like a wild beast, screamed 'Off with her head! \"\n        \"Off—''Nonsense!' said Alice, very loudly and decidedly, and the Queen was silent.The King laid his hand upon \"\n        \"her arm, and timidly said 'Consider, my dear: she is only a child!'The Queen turned angrily away from him, \"\n        \"and said to the Knave 'Turn them over!'The Knave did so, very carefully, with one foot.'Get up!' said the \"\n        \"Queen, in a shrill, loud voice, and the three gardeners instantly jumped up, and began bowing to the King, \"\n        \"the Queen, the royal children, and everybody else.'Leave off that!' screamed the Queen. 'You make me giddy.' \"\n        \"And then, turning to the rose-tree, she went on, 'What have you been doing here?''May it please your \"\n        \"Majesty,' said Two, in a very humble tone, going down on one knee as he spoke, 'we were trying—''I see!' said \"\n        \"the Queen, who had meanwhile been examining the roses. 'Off with their heads!' and the procession moved on, \"\n        \"three of the soldiers remaining behind to execute the unfortunate gardeners, who ran to Alice for \"\n        \"protection.'You shan't be beheaded!' said Alice, and she put them into a large flower-pot that stood near. \"\n        \"The three soldiers wandered about for a minute or two, looking for them, and then quietly marched off after \"\n        \"the others.'Are their heads off?' shouted the Queen.'Their heads are gone, if it please your Majesty!' the \"\n        \"soldiers shouted in reply.'That's right!' shouted the Queen. 'Can you play croquet?'The soldiers were silent, \"\n        \"and looked at Alice, as the question was evidently meant for her.'Yes!' shouted Alice.'Come on, then!' roared \"\n        \"the Queen, and Alice joined the procession, wondering very much what would happen next.'It's—it's a very fine \"\n        \"day!' said a timid voice at her side. She was walking by the White Rabbit, who was peeping anxiously into her \"\n        \"face.'Very,' said Alice: '—where's the Duchess?''Hush! Hush!' said the Rabbit in a low, hurried tone. He \"\n        \"looked anxiously over his shoulder as he spoke, and then raised himself upon tiptoe, put his mouth close to \"\n        \"her ear, and whispered 'She's under sentence of execution.''What for?' said Alice.'Did you say \\\"What a \"\n        \"pity!\\\"?' the Rabbit asked.'No, I didn't,' said Alice: 'I don't think it's at all a pity. I said \\\"What \"\n        \"for?\\\"''She boxed the Queen's ears—' the Rabbit began. Alice gave a little scream of laughter. 'Oh, hush!' \"\n        \"the Rabbit whispered in a frightened tone. 'The Queen will hear you! You see, she came rather late, and the \"\n        \"Queen said—''Get to your places!' shouted the Queen in a voice of thunder, and people began running about in \"\n        \"all directions, tumbling up against each other; however, they got settled down in a minute or two, and the \"\n        \"game began. Alice thought she had never seen such a curious croquet-ground in her life; it was all ridges and \"\n        \"furrows; the balls were live hedgehogs, the mallets live flamingoes, and the soldiers had to double \"\n        \"themselves up and to stand on their hands and feet, to make the arches.The chief difficulty Alice found at \"\n        \"first was in managing her flamingo: she succeeded in getting its body tucked away, comfortably enough, under \"\n        \"her arm, with its legs hanging down, but generally, just as she had got its neck nicely straightened out, and \"\n        \"was going to give the hedgehog a blow with its head, it would twist itself round and look up in her face, \"\n        \"with such a puzzled expression that she could not help bursting out laughing: and when she had got its head \"\n        \"down, and was going to begin again, it was very provoking to find that the hedgehog had unrolled itself, and \"\n        \"was in the act of crawling away: besides all this, there was generally a ridge or furrow in the way wherever \"\n        \"she wanted to send the hedgehog to, and, as the doubled-up soldiers were always getting up and walking off to \"\n        \"other parts of the ground, Alice soon came to the conclusion that it was a very difficult game indeed.The \"\n        \"players all played at once without waiting for turns, quarrelling all the while, and fighting for the \"\n        \"hedgehogs; and in a very short time the Queen was in a furious passion, and went stamping about, and shouting \"\n        \"'Off with his head!' or 'Off with her head!' about once in a minute.Alice began to feel very uneasy: to be \"\n        \"sure, she had not as yet had any dispute with the Queen, but she knew that it might happen any minute, 'and \"\n        \"then,' thought she, 'what would become of me? They're dreadfully fond of beheading people here; the great \"\n        \"wonder is, that there's any one left alive!'She was looking about for some way of escape, and wondering \"\n        \"whether she could get away without being seen, when she noticed a curious appearance in the air: it puzzled \"\n        \"her very much at first, but, after watching it a minute or two, she made it out to be a grin, and she said to \"\n        \"herself 'It's the Cheshire Cat: now I shall have somebody to talk to.''How are you getting on?' said the Cat, \"\n        \"as soon as there was mouth enough for it to speak with.Alice waited till the eyes appeared, and then nodded. \"\n        \"'It's no use speaking to it,' she thought, 'till its ears have come, or at least one of them.' In another \"\n        \"minute the whole head appeared, and then Alice put down her flamingo, and began an account of the game, \"\n        \"feeling very glad she had someone to listen to her. The Cat seemed to think that there was enough of it now \"\n        \"in sight, and no more of it appeared.'I don't think they play at all fairly,' Alice began, in rather a \"\n        \"complaining tone, 'and they all quarrel so dreadfully one can't hear oneself speak—and they don't seem to \"\n        \"have any rules in particular; at least, if there are, nobody attends to them—and you've no idea how confusing \"\n        \"it is all the things being alive; for instance, there's the arch I've got to go through next walking about at \"\n        \"the other end of the ground—and I should have croqueted the Queen's hedgehog just now, only it ran away when \"\n        \"it saw mine coming!''How do you like the Queen?' said the Cat in a low voice.'Not at all,' said Alice: 'she's \"\n        \"so extremely—' Just then she noticed that the Queen was close behind her, listening: so she went on, '—likely \"\n        \"to win, that it's hardly worth while finishing the game.'The Queen smiled and passed on.'Who are you talking \"\n        \"to?' said the King, going up to Alice, and looking at the Cat's head with great curiosity.'It's a friend of \"\n        \"mine—a Cheshire Cat,' said Alice: 'allow me to introduce it.''I don't like the look of it at all,' said the \"\n        \"King: 'however, it may kiss my hand if it likes.''I'd rather not,' the Cat remarked.'Don't be impertinent,' \"\n        \"said the King, 'and don't look at me like that!' He got behind Alice as he spoke.'A cat may look at a king,' \"\n        \"said Alice. 'I've read that in some book, but I don't remember where.''Well, it must be removed,' said the \"\n        \"King very decidedly, and he called the Queen, who was passing at the moment, 'My dear! I wish you would have \"\n        \"this cat removed!'The Queen had only one way of settling all difficulties, great or small. 'Off with his \"\n        \"head!' she said, without even looking round.'I'll fetch the executioner myself,' said the King eagerly, and \"\n        \"he hurried off.Alice thought she might as well go back, and see how the game was going on, as she heard the \"\n        \"Queen's voice in the distance, screaming with passion. She had already heard her sentence three of the \"\n        \"players to be executed for having missed their turns, and she did not like the look of things at all, as the \"\n        \"game was in such confusion that she never knew whether it was her turn or not. So she went in search of her \"\n        \"hedgehog.The hedgehog was engaged in a fight with another hedgehog, which seemed to Alice an excellent \"\n        \"opportunity for croqueting one of them with the other: the only difficulty was, that her flamingo was gone \"\n        \"across to the other side of the garden, where Alice could see it trying in a helpless sort of way to fly up \"\n        \"into a tree.By the time she had caught the flamingo and brought it back, the fight was over, and both the \"\n        \"hedgehogs were out of sight: 'but it doesn't matter much,' thought Alice, 'as all the arches are gone from \"\n        \"this side of the ground.' So she tucked it away under her arm, that it might not escape again, and went back \"\n        \"for a little more conversation with her friend.When she got back to the Cheshire Cat, she was surprised to \"\n        \"find quite a large crowd collected round it: there was a dispute going on between the executioner, the King, \"\n        \"and the Queen, who were all talking at once, while all the rest were quite silent, and looked very \"\n        \"uncomfortable.The moment Alice appeared, she was appealed to by all three to settle the question, and they \"\n        \"repeated their arguments to her, though, as they all spoke at once, she found it very hard indeed to make out \"\n        \"exactly what they said.The executioner's argument was, that you couldn't cut off a head unless there was a \"\n        \"body to cut it off from: that he had never had to do such a thing before, and he wasn't going to begin at his \"\n        \"time of life.The King's argument was, that anything that had a head could be beheaded, and that you weren't \"\n        \"to talk nonsense.The Queen's argument was, that if something wasn't done about it in less than no time she'd \"\n        \"have everybody executed, all round. (It was this last remark that had made the whole party look so grave and \"\n        \"anxious.)Alice could think of nothing else to say but 'It belongs to the Duchess: you'd better ask her about \"\n        \"it.''She's in prison,' the Queen said to the executioner: 'fetch her here.' And the executioner went off like \"\n        \"an arrow.The Cat's head began fading away the moment he was gone, and, by the time he had come back with the \"\n        \"Duchess, it had entirely disappeared; so the King and the executioner ran wildly up and down looking for it, \"\n        \"while the rest of the party went back to the game.\";\n    std::string output =\n        \"QSBsYXJnZSByb3NlLXRyZWUgc3Rvb2QgbmVhciB0aGUgZW50cmFuY2Ugb2YgdGhlIGdhcmRlbjogdGhlIHJvc2VzIGdyb3dpbmcgb24gaXQgd2\"\n        \"VyZSB3aGl0ZSwgYnV0IHRoZXJlIHdlcmUgdGhyZWUgZ2FyZGVuZXJzIGF0IGl0LCBidXNpbHkgcGFpbnRpbmcgdGhlbSByZWQuIEFsaWNlIHRo\"\n        \"b3VnaHQgdGhpcyBhIHZlcnkgY3VyaW91cyB0aGluZywgYW5kIHNoZSB3ZW50IG5lYXJlciB0byB3YXRjaCB0aGVtLCBhbmQganVzdCBhcyBzaG\"\n        \"UgY2FtZSB1cCB0byB0aGVtIHNoZSBoZWFyZCBvbmUgb2YgdGhlbSBzYXksICdMb29rIG91dCBub3csIEZpdmUhIERvbid0IGdvIHNwbGFzaGlu\"\n        \"ZyBwYWludCBvdmVyIG1lIGxpa2UgdGhhdCEnJ0kgY291bGRuJ3QgaGVscCBpdCwnIHNhaWQgRml2ZSwgaW4gYSBzdWxreSB0b25lOyAnU2V2ZW\"\n        \"4gam9nZ2VkIG15IGVsYm93LidPbiB3aGljaCBTZXZlbiBsb29rZWQgdXAgYW5kIHNhaWQsICdUaGF0J3MgcmlnaHQsIEZpdmUhIEFsd2F5cyBs\"\n        \"YXkgdGhlIGJsYW1lIG9uIG90aGVycyEnJ1lvdSdkIGJldHRlciBub3QgdGFsayEnIHNhaWQgRml2ZS4gJ0kgaGVhcmQgdGhlIFF1ZWVuIHNheS\"\n        \"Bvbmx5IHllc3RlcmRheSB5b3UgZGVzZXJ2ZWQgdG8gYmUgYmVoZWFkZWQhJydXaGF0IGZvcj8nIHNhaWQgdGhlIG9uZSB3aG8gaGFkIHNwb2tl\"\n        \"biBmaXJzdC4nVGhhdCdzIG5vbmUgb2YgeW91ciBidXNpbmVzcywgVHdvIScgc2FpZCBTZXZlbi4nWWVzLCBpdCBpcyBoaXMgYnVzaW5lc3MhJy\"\n        \"BzYWlkIEZpdmUsICdhbmQgSSdsbCB0ZWxsIGhpbeKAlGl0IHdhcyBmb3IgYnJpbmdpbmcgdGhlIGNvb2sgdHVsaXAtcm9vdHMgaW5zdGVhZCBv\"\n        \"ZiBvbmlvbnMuJ1NldmVuIGZsdW5nIGRvd24gaGlzIGJydXNoLCBhbmQgaGFkIGp1c3QgYmVndW4gJ1dlbGwsIG9mIGFsbCB0aGUgdW5qdXN0IH\"\n        \"RoaW5nc+\"\n        \"KAlCcgd2hlbiBoaXMgZXllIGNoYW5jZWQgdG8gZmFsbCB1cG9uIEFsaWNlLCBhcyBzaGUgc3Rvb2Qgd2F0Y2hpbmcgdGhlbSwgYW5kIGhlIGNo\"\n        \"ZWNrZWQgaGltc2VsZiBzdWRkZW5seTogdGhlIG90aGVycyBsb29rZWQgcm91bmQgYWxzbywgYW5kIGFsbCBvZiB0aGVtIGJvd2VkIGxvdy4nV2\"\n        \"91bGQgeW91IHRlbGwgbWUsJyBzYWlkIEFsaWNlLCBhIGxpdHRsZSB0aW1pZGx5LCAnd2h5IHlvdSBhcmUgcGFpbnRpbmcgdGhvc2Ugcm9zZXM/\"\n        \"J0ZpdmUgYW5kIFNldmVuIHNhaWQgbm90aGluZywgYnV0IGxvb2tlZCBhdCBUd28uIFR3byBiZWdhbiBpbiBhIGxvdyB2b2ljZSwgJ1doeSB0aG\"\n        \"UgZmFjdCBpcywgeW91IHNlZSwgTWlzcywgdGhpcyBoZXJlIG91Z2h0IHRvIGhhdmUgYmVlbiBhIHJlZCByb3NlLXRyZWUsIGFuZCB3ZSBwdXQg\"\n        \"YSB3aGl0ZSBvbmUgaW4gYnkgbWlzdGFrZTsgYW5kIGlmIHRoZSBRdWVlbiB3YXMgdG8gZmluZCBpdCBvdXQsIHdlIHNob3VsZCBhbGwgaGF2ZS\"\n        \"BvdXIgaGVhZHMgY3V0IG9mZiwgeW91IGtub3cuIFNvIHlvdSBzZWUsIE1pc3MsIHdlJ3JlIGRvaW5nIG91ciBiZXN0LCBhZm9yZSBzaGUgY29t\"\n        \"ZXMsIHRv4oCUJyBBdCB0aGlzIG1vbWVudCBGaXZlLCB3aG8gaGFkIGJlZW4gYW54aW91c2x5IGxvb2tpbmcgYWNyb3NzIHRoZSBnYXJkZW4sIG\"\n        \"NhbGxlZCBvdXQgJ1RoZSBRdWVlbiEgVGhlIFF1ZWVuIScgYW5kIHRoZSB0aHJlZSBnYXJkZW5lcnMgaW5zdGFudGx5IHRocmV3IHRoZW1zZWx2\"\n        \"ZXMgZmxhdCB1cG9uIHRoZWlyIGZhY2VzLiBUaGVyZSB3YXMgYSBzb3VuZCBvZiBtYW55IGZvb3RzdGVwcywgYW5kIEFsaWNlIGxvb2tlZCByb3\"\n        \"VuZCwgZWFnZXIgdG8gc2VlIHRoZSBRdWVlbi5GaXJzdCBjYW1lIHRlbiBzb2xkaWVycyBjYXJyeWluZyBjbHViczsgdGhlc2Ugd2VyZSBhbGwg\"\n        \"c2hhcGVkIGxpa2UgdGhlIHRocmVlIGdhcmRlbmVycywgb2Jsb25nIGFuZCBmbGF0LCB3aXRoIHRoZWlyIGhhbmRzIGFuZCBmZWV0IGF0IHRoZS\"\n        \"Bjb3JuZXJzOiBuZXh0IHRoZSB0ZW4gY291cnRpZXJzOyB0aGVzZSB3ZXJlIG9ybmFtZW50ZWQgYWxsIG92ZXIgd2l0aCBkaWFtb25kcywgYW5k\"\n        \"IHdhbGtlZCB0d28gYW5kIHR3bywgYXMgdGhlIHNvbGRpZXJzIGRpZC4gQWZ0ZXIgdGhlc2UgY2FtZSB0aGUgcm95YWwgY2hpbGRyZW47IHRoZX\"\n        \"JlIHdlcmUgdGVuIG9mIHRoZW0sIGFuZCB0aGUgbGl0dGxlIGRlYXJzIGNhbWUganVtcGluZyBtZXJyaWx5IGFsb25nIGhhbmQgaW4gaGFuZCwg\"\n        \"aW4gY291cGxlczogdGhleSB3ZXJlIGFsbCBvcm5hbWVudGVkIHdpdGggaGVhcnRzLiBOZXh0IGNhbWUgdGhlIGd1ZXN0cywgbW9zdGx5IEtpbm\"\n        \"dzIGFuZCBRdWVlbnMsIGFuZCBhbW9uZyB0aGVtIEFsaWNlIHJlY29nbmlzZWQgdGhlIFdoaXRlIFJhYmJpdDogaXQgd2FzIHRhbGtpbmcgaW4g\"\n        \"YSBodXJyaWVkIG5lcnZvdXMgbWFubmVyLCBzbWlsaW5nIGF0IGV2ZXJ5dGhpbmcgdGhhdCB3YXMgc2FpZCwgYW5kIHdlbnQgYnkgd2l0aG91dC\"\n        \"Bub3RpY2luZyBoZXIuIFRoZW4gZm9sbG93ZWQgdGhlIEtuYXZlIG9mIEhlYXJ0cywgY2FycnlpbmcgdGhlIEtpbmcncyBjcm93biBvbiBhIGNy\"\n        \"aW1zb24gdmVsdmV0IGN1c2hpb247IGFuZCwgbGFzdCBvZiBhbGwgdGhpcyBncmFuZCBwcm9jZXNzaW9uLCBjYW1lIFRIRSBLSU5HIEFORCBRVU\"\n        \"VFTiBPRiBIRUFSVFMuQWxpY2Ugd2FzIHJhdGhlciBkb3VidGZ1bCB3aGV0aGVyIHNoZSBvdWdodCBub3QgdG8gbGllIGRvd24gb24gaGVyIGZh\"\n        \"Y2UgbGlrZSB0aGUgdGhyZWUgZ2FyZGVuZXJzLCBidXQgc2hlIGNvdWxkIG5vdCByZW1lbWJlciBldmVyIGhhdmluZyBoZWFyZCBvZiBzdWNoIG\"\n        \"EgcnVsZSBhdCBwcm9jZXNzaW9uczsgJ2FuZCBiZXNpZGVzLCB3aGF0IHdvdWxkIGJlIHRoZSB1c2Ugb2YgYSBwcm9jZXNzaW9uLCcgdGhvdWdo\"\n        \"dCBzaGUsICdpZiBwZW9wbGUgaGFkIGFsbCB0byBsaWUgZG93biB1cG9uIHRoZWlyIGZhY2VzLCBzbyB0aGF0IHRoZXkgY291bGRuJ3Qgc2VlIG\"\n        \"l0PycgU28gc2hlIHN0b29kIHN0aWxsIHdoZXJlIHNoZSB3YXMsIGFuZCB3YWl0ZWQuV2hlbiB0aGUgcHJvY2Vzc2lvbiBjYW1lIG9wcG9zaXRl\"\n        \"IHRvIEFsaWNlLCB0aGV5IGFsbCBzdG9wcGVkIGFuZCBsb29rZWQgYXQgaGVyLCBhbmQgdGhlIFF1ZWVuIHNhaWQgc2V2ZXJlbHkgJ1dobyBpcy\"\n        \"B0aGlzPycgU2hlIHNhaWQgaXQgdG8gdGhlIEtuYXZlIG9mIEhlYXJ0cywgd2hvIG9ubHkgYm93ZWQgYW5kIHNtaWxlZCBpbiByZXBseS4nSWRp\"\n        \"b3QhJyBzYWlkIHRoZSBRdWVlbiwgdG9zc2luZyBoZXIgaGVhZCBpbXBhdGllbnRseTsgYW5kLCB0dXJuaW5nIHRvIEFsaWNlLCBzaGUgd2VudC\"\n        \"BvbiwgJ1doYXQncyB5b3VyIG5hbWUsIGNoaWxkPycnTXkgbmFtZSBpcyBBbGljZSwgc28gcGxlYXNlIHlvdXIgTWFqZXN0eSwnIHNhaWQgQWxp\"\n        \"Y2UgdmVyeSBwb2xpdGVseTsgYnV0IHNoZSBhZGRlZCwgdG8gaGVyc2VsZiwgJ1doeSwgdGhleSdyZSBvbmx5IGEgcGFjayBvZiBjYXJkcywgYW\"\n        \"Z0ZXIgYWxsLiBJIG5lZWRuJ3QgYmUgYWZyYWlkIG9mIHRoZW0hJydBbmQgd2hvIGFyZSB0aGVzZT8nIHNhaWQgdGhlIFF1ZWVuLCBwb2ludGlu\"\n        \"ZyB0byB0aGUgdGhyZWUgZ2FyZGVuZXJzIHdobyB3ZXJlIGx5aW5nIHJvdW5kIHRoZSByb3NldHJlZTsgZm9yLCB5b3Ugc2VlLCBhcyB0aGV5IH\"\n        \"dlcmUgbHlpbmcgb24gdGhlaXIgZmFjZXMsIGFuZCB0aGUgcGF0dGVybiBvbiB0aGVpciBiYWNrcyB3YXMgdGhlIHNhbWUgYXMgdGhlIHJlc3Qg\"\n        \"b2YgdGhlIHBhY2ssIHNoZSBjb3VsZCBub3QgdGVsbCB3aGV0aGVyIHRoZXkgd2VyZSBnYXJkZW5lcnMsIG9yIHNvbGRpZXJzLCBvciBjb3VydG\"\n        \"llcnMsIG9yIHRocmVlIG9mIGhlciBvd24gY2hpbGRyZW4uJ0hvdyBzaG91bGQgSSBrbm93Pycgc2FpZCBBbGljZSwgc3VycHJpc2VkIGF0IGhl\"\n        \"ciBvd24gY291cmFnZS4gJ0l0J3Mgbm8gYnVzaW5lc3Mgb2YgbWluZS4nVGhlIFF1ZWVuIHR1cm5lZCBjcmltc29uIHdpdGggZnVyeSwgYW5kLC\"\n        \"BhZnRlciBnbGFyaW5nIGF0IGhlciBmb3IgYSBtb21lbnQgbGlrZSBhIHdpbGQgYmVhc3QsIHNjcmVhbWVkICdPZmYgd2l0aCBoZXIgaGVhZCEg\"\n        \"T2Zm4oCUJydOb25zZW5zZSEnIHNhaWQgQWxpY2UsIHZlcnkgbG91ZGx5IGFuZCBkZWNpZGVkbHksIGFuZCB0aGUgUXVlZW4gd2FzIHNpbGVudC\"\n        \"5UaGUgS2luZyBsYWlkIGhpcyBoYW5kIHVwb24gaGVyIGFybSwgYW5kIHRpbWlkbHkgc2FpZCAnQ29uc2lkZXIsIG15IGRlYXI6IHNoZSBpcyBv\"\n        \"bmx5IGEgY2hpbGQhJ1RoZSBRdWVlbiB0dXJuZWQgYW5ncmlseSBhd2F5IGZyb20gaGltLCBhbmQgc2FpZCB0byB0aGUgS25hdmUgJ1R1cm4gdG\"\n        \"hlbSBvdmVyISdUaGUgS25hdmUgZGlkIHNvLCB2ZXJ5IGNhcmVmdWxseSwgd2l0aCBvbmUgZm9vdC4nR2V0IHVwIScgc2FpZCB0aGUgUXVlZW4s\"\n        \"IGluIGEgc2hyaWxsLCBsb3VkIHZvaWNlLCBhbmQgdGhlIHRocmVlIGdhcmRlbmVycyBpbnN0YW50bHkganVtcGVkIHVwLCBhbmQgYmVnYW4gYm\"\n        \"93aW5nIHRvIHRoZSBLaW5nLCB0aGUgUXVlZW4sIHRoZSByb3lhbCBjaGlsZHJlbiwgYW5kIGV2ZXJ5Ym9keSBlbHNlLidMZWF2ZSBvZmYgdGhh\"\n        \"dCEnIHNjcmVhbWVkIHRoZSBRdWVlbi4gJ1lvdSBtYWtlIG1lIGdpZGR5LicgQW5kIHRoZW4sIHR1cm5pbmcgdG8gdGhlIHJvc2UtdHJlZSwgc2\"\n        \"hlIHdlbnQgb24sICdXaGF0IGhhdmUgeW91IGJlZW4gZG9pbmcgaGVyZT8nJ01heSBpdCBwbGVhc2UgeW91ciBNYWplc3R5LCcgc2FpZCBUd28s\"\n        \"IGluIGEgdmVyeSBodW1ibGUgdG9uZSwgZ29pbmcgZG93biBvbiBvbmUga25lZSBhcyBoZSBzcG9rZSwgJ3dlIHdlcmUgdHJ5aW5n4oCUJydJIH\"\n        \"NlZSEnIHNhaWQgdGhlIFF1ZWVuLCB3aG8gaGFkIG1lYW53aGlsZSBiZWVuIGV4YW1pbmluZyB0aGUgcm9zZXMuICdPZmYgd2l0aCB0aGVpciBo\"\n        \"ZWFkcyEnIGFuZCB0aGUgcHJvY2Vzc2lvbiBtb3ZlZCBvbiwgdGhyZWUgb2YgdGhlIHNvbGRpZXJzIHJlbWFpbmluZyBiZWhpbmQgdG8gZXhlY3\"\n        \"V0ZSB0aGUgdW5mb3J0dW5hdGUgZ2FyZGVuZXJzLCB3aG8gcmFuIHRvIEFsaWNlIGZvciBwcm90ZWN0aW9uLidZb3Ugc2hhbid0IGJlIGJlaGVh\"\n        \"ZGVkIScgc2FpZCBBbGljZSwgYW5kIHNoZSBwdXQgdGhlbSBpbnRvIGEgbGFyZ2UgZmxvd2VyLXBvdCB0aGF0IHN0b29kIG5lYXIuIFRoZSB0aH\"\n        \"JlZSBzb2xkaWVycyB3YW5kZXJlZCBhYm91dCBmb3IgYSBtaW51dGUgb3IgdHdvLCBsb29raW5nIGZvciB0aGVtLCBhbmQgdGhlbiBxdWlldGx5\"\n        \"IG1hcmNoZWQgb2ZmIGFmdGVyIHRoZSBvdGhlcnMuJ0FyZSB0aGVpciBoZWFkcyBvZmY/\"\n        \"JyBzaG91dGVkIHRoZSBRdWVlbi4nVGhlaXIgaGVhZHMgYXJlIGdvbmUsIGlmIGl0IHBsZWFzZSB5b3VyIE1hamVzdHkhJyB0aGUgc29sZGllcn\"\n        \"Mgc2hvdXRlZCBpbiByZXBseS4nVGhhdCdzIHJpZ2h0IScgc2hvdXRlZCB0aGUgUXVlZW4uICdDYW4geW91IHBsYXkgY3JvcXVldD8nVGhlIHNv\"\n        \"bGRpZXJzIHdlcmUgc2lsZW50LCBhbmQgbG9va2VkIGF0IEFsaWNlLCBhcyB0aGUgcXVlc3Rpb24gd2FzIGV2aWRlbnRseSBtZWFudCBmb3IgaG\"\n        \"VyLidZZXMhJyBzaG91dGVkIEFsaWNlLidDb21lIG9uLCB0aGVuIScgcm9hcmVkIHRoZSBRdWVlbiwgYW5kIEFsaWNlIGpvaW5lZCB0aGUgcHJv\"\n        \"Y2Vzc2lvbiwgd29uZGVyaW5nIHZlcnkgbXVjaCB3aGF0IHdvdWxkIGhhcHBlbiBuZXh0LidJdCdz4oCUaXQncyBhIHZlcnkgZmluZSBkYXkhJy\"\n        \"BzYWlkIGEgdGltaWQgdm9pY2UgYXQgaGVyIHNpZGUuIFNoZSB3YXMgd2Fsa2luZyBieSB0aGUgV2hpdGUgUmFiYml0LCB3aG8gd2FzIHBlZXBp\"\n        \"bmcgYW54aW91c2x5IGludG8gaGVyIGZhY2UuJ1ZlcnksJyBzYWlkIEFsaWNlOiAn4oCUd2hlcmUncyB0aGUgRHVjaGVzcz8nJ0h1c2ghIEh1c2\"\n        \"ghJyBzYWlkIHRoZSBSYWJiaXQgaW4gYSBsb3csIGh1cnJpZWQgdG9uZS4gSGUgbG9va2VkIGFueGlvdXNseSBvdmVyIGhpcyBzaG91bGRlciBh\"\n        \"cyBoZSBzcG9rZSwgYW5kIHRoZW4gcmFpc2VkIGhpbXNlbGYgdXBvbiB0aXB0b2UsIHB1dCBoaXMgbW91dGggY2xvc2UgdG8gaGVyIGVhciwgYW\"\n        \"5kIHdoaXNwZXJlZCAnU2hlJ3MgdW5kZXIgc2VudGVuY2Ugb2YgZXhlY3V0aW9uLicnV2hhdCBmb3I/\"\n        \"JyBzYWlkIEFsaWNlLidEaWQgeW91IHNheSAiV2hhdCBhIHBpdHkhIj8nIHRoZSBSYWJiaXQgYXNrZWQuJ05vLCBJIGRpZG4ndCwnIHNhaWQgQW\"\n        \"xpY2U6ICdJIGRvbid0IHRoaW5rIGl0J3MgYXQgYWxsIGEgcGl0eS4gSSBzYWlkICJXaGF0IGZvcj8iJydTaGUgYm94ZWQgdGhlIFF1ZWVuJ3Mg\"\n        \"ZWFyc+\"\n        \"KAlCcgdGhlIFJhYmJpdCBiZWdhbi4gQWxpY2UgZ2F2ZSBhIGxpdHRsZSBzY3JlYW0gb2YgbGF1Z2h0ZXIuICdPaCwgaHVzaCEnIHRoZSBSYWJi\"\n        \"aXQgd2hpc3BlcmVkIGluIGEgZnJpZ2h0ZW5lZCB0b25lLiAnVGhlIFF1ZWVuIHdpbGwgaGVhciB5b3UhIFlvdSBzZWUsIHNoZSBjYW1lIHJhdG\"\n        \"hlciBsYXRlLCBhbmQgdGhlIFF1ZWVuIHNhaWTigJQnJ0dldCB0byB5b3VyIHBsYWNlcyEnIHNob3V0ZWQgdGhlIFF1ZWVuIGluIGEgdm9pY2Ug\"\n        \"b2YgdGh1bmRlciwgYW5kIHBlb3BsZSBiZWdhbiBydW5uaW5nIGFib3V0IGluIGFsbCBkaXJlY3Rpb25zLCB0dW1ibGluZyB1cCBhZ2FpbnN0IG\"\n        \"VhY2ggb3RoZXI7IGhvd2V2ZXIsIHRoZXkgZ290IHNldHRsZWQgZG93biBpbiBhIG1pbnV0ZSBvciB0d28sIGFuZCB0aGUgZ2FtZSBiZWdhbi4g\"\n        \"QWxpY2UgdGhvdWdodCBzaGUgaGFkIG5ldmVyIHNlZW4gc3VjaCBhIGN1cmlvdXMgY3JvcXVldC1ncm91bmQgaW4gaGVyIGxpZmU7IGl0IHdhcy\"\n        \"BhbGwgcmlkZ2VzIGFuZCBmdXJyb3dzOyB0aGUgYmFsbHMgd2VyZSBsaXZlIGhlZGdlaG9ncywgdGhlIG1hbGxldHMgbGl2ZSBmbGFtaW5nb2Vz\"\n        \"LCBhbmQgdGhlIHNvbGRpZXJzIGhhZCB0byBkb3VibGUgdGhlbXNlbHZlcyB1cCBhbmQgdG8gc3RhbmQgb24gdGhlaXIgaGFuZHMgYW5kIGZlZX\"\n        \"QsIHRvIG1ha2UgdGhlIGFyY2hlcy5UaGUgY2hpZWYgZGlmZmljdWx0eSBBbGljZSBmb3VuZCBhdCBmaXJzdCB3YXMgaW4gbWFuYWdpbmcgaGVy\"\n        \"IGZsYW1pbmdvOiBzaGUgc3VjY2VlZGVkIGluIGdldHRpbmcgaXRzIGJvZHkgdHVja2VkIGF3YXksIGNvbWZvcnRhYmx5IGVub3VnaCwgdW5kZX\"\n        \"IgaGVyIGFybSwgd2l0aCBpdHMgbGVncyBoYW5naW5nIGRvd24sIGJ1dCBnZW5lcmFsbHksIGp1c3QgYXMgc2hlIGhhZCBnb3QgaXRzIG5lY2sg\"\n        \"bmljZWx5IHN0cmFpZ2h0ZW5lZCBvdXQsIGFuZCB3YXMgZ29pbmcgdG8gZ2l2ZSB0aGUgaGVkZ2Vob2cgYSBibG93IHdpdGggaXRzIGhlYWQsIG\"\n        \"l0IHdvdWxkIHR3aXN0IGl0c2VsZiByb3VuZCBhbmQgbG9vayB1cCBpbiBoZXIgZmFjZSwgd2l0aCBzdWNoIGEgcHV6emxlZCBleHByZXNzaW9u\"\n        \"IHRoYXQgc2hlIGNvdWxkIG5vdCBoZWxwIGJ1cnN0aW5nIG91dCBsYXVnaGluZzogYW5kIHdoZW4gc2hlIGhhZCBnb3QgaXRzIGhlYWQgZG93bi\"\n        \"wgYW5kIHdhcyBnb2luZyB0byBiZWdpbiBhZ2FpbiwgaXQgd2FzIHZlcnkgcHJvdm9raW5nIHRvIGZpbmQgdGhhdCB0aGUgaGVkZ2Vob2cgaGFk\"\n        \"IHVucm9sbGVkIGl0c2VsZiwgYW5kIHdhcyBpbiB0aGUgYWN0IG9mIGNyYXdsaW5nIGF3YXk6IGJlc2lkZXMgYWxsIHRoaXMsIHRoZXJlIHdhcy\"\n        \"BnZW5lcmFsbHkgYSByaWRnZSBvciBmdXJyb3cgaW4gdGhlIHdheSB3aGVyZXZlciBzaGUgd2FudGVkIHRvIHNlbmQgdGhlIGhlZGdlaG9nIHRv\"\n        \"LCBhbmQsIGFzIHRoZSBkb3VibGVkLXVwIHNvbGRpZXJzIHdlcmUgYWx3YXlzIGdldHRpbmcgdXAgYW5kIHdhbGtpbmcgb2ZmIHRvIG90aGVyIH\"\n        \"BhcnRzIG9mIHRoZSBncm91bmQsIEFsaWNlIHNvb24gY2FtZSB0byB0aGUgY29uY2x1c2lvbiB0aGF0IGl0IHdhcyBhIHZlcnkgZGlmZmljdWx0\"\n        \"IGdhbWUgaW5kZWVkLlRoZSBwbGF5ZXJzIGFsbCBwbGF5ZWQgYXQgb25jZSB3aXRob3V0IHdhaXRpbmcgZm9yIHR1cm5zLCBxdWFycmVsbGluZy\"\n        \"BhbGwgdGhlIHdoaWxlLCBhbmQgZmlnaHRpbmcgZm9yIHRoZSBoZWRnZWhvZ3M7IGFuZCBpbiBhIHZlcnkgc2hvcnQgdGltZSB0aGUgUXVlZW4g\"\n        \"d2FzIGluIGEgZnVyaW91cyBwYXNzaW9uLCBhbmQgd2VudCBzdGFtcGluZyBhYm91dCwgYW5kIHNob3V0aW5nICdPZmYgd2l0aCBoaXMgaGVhZC\"\n        \"EnIG9yICdPZmYgd2l0aCBoZXIgaGVhZCEnIGFib3V0IG9uY2UgaW4gYSBtaW51dGUuQWxpY2UgYmVnYW4gdG8gZmVlbCB2ZXJ5IHVuZWFzeTog\"\n        \"dG8gYmUgc3VyZSwgc2hlIGhhZCBub3QgYXMgeWV0IGhhZCBhbnkgZGlzcHV0ZSB3aXRoIHRoZSBRdWVlbiwgYnV0IHNoZSBrbmV3IHRoYXQgaX\"\n        \"QgbWlnaHQgaGFwcGVuIGFueSBtaW51dGUsICdhbmQgdGhlbiwnIHRob3VnaHQgc2hlLCAnd2hhdCB3b3VsZCBiZWNvbWUgb2YgbWU/\"\n        \"IFRoZXkncmUgZHJlYWRmdWxseSBmb25kIG9mIGJlaGVhZGluZyBwZW9wbGUgaGVyZTsgdGhlIGdyZWF0IHdvbmRlciBpcywgdGhhdCB0aGVyZS\"\n        \"dzIGFueSBvbmUgbGVmdCBhbGl2ZSEnU2hlIHdhcyBsb29raW5nIGFib3V0IGZvciBzb21lIHdheSBvZiBlc2NhcGUsIGFuZCB3b25kZXJpbmcg\"\n        \"d2hldGhlciBzaGUgY291bGQgZ2V0IGF3YXkgd2l0aG91dCBiZWluZyBzZWVuLCB3aGVuIHNoZSBub3RpY2VkIGEgY3VyaW91cyBhcHBlYXJhbm\"\n        \"NlIGluIHRoZSBhaXI6IGl0IHB1enpsZWQgaGVyIHZlcnkgbXVjaCBhdCBmaXJzdCwgYnV0LCBhZnRlciB3YXRjaGluZyBpdCBhIG1pbnV0ZSBv\"\n        \"ciB0d28sIHNoZSBtYWRlIGl0IG91dCB0byBiZSBhIGdyaW4sIGFuZCBzaGUgc2FpZCB0byBoZXJzZWxmICdJdCdzIHRoZSBDaGVzaGlyZSBDYX\"\n        \"Q6IG5vdyBJIHNoYWxsIGhhdmUgc29tZWJvZHkgdG8gdGFsayB0by4nJ0hvdyBhcmUgeW91IGdldHRpbmcgb24/\"\n        \"JyBzYWlkIHRoZSBDYXQsIGFzIHNvb24gYXMgdGhlcmUgd2FzIG1vdXRoIGVub3VnaCBmb3IgaXQgdG8gc3BlYWsgd2l0aC5BbGljZSB3YWl0ZW\"\n        \"QgdGlsbCB0aGUgZXllcyBhcHBlYXJlZCwgYW5kIHRoZW4gbm9kZGVkLiAnSXQncyBubyB1c2Ugc3BlYWtpbmcgdG8gaXQsJyBzaGUgdGhvdWdo\"\n        \"dCwgJ3RpbGwgaXRzIGVhcnMgaGF2ZSBjb21lLCBvciBhdCBsZWFzdCBvbmUgb2YgdGhlbS4nIEluIGFub3RoZXIgbWludXRlIHRoZSB3aG9sZS\"\n        \"BoZWFkIGFwcGVhcmVkLCBhbmQgdGhlbiBBbGljZSBwdXQgZG93biBoZXIgZmxhbWluZ28sIGFuZCBiZWdhbiBhbiBhY2NvdW50IG9mIHRoZSBn\"\n        \"YW1lLCBmZWVsaW5nIHZlcnkgZ2xhZCBzaGUgaGFkIHNvbWVvbmUgdG8gbGlzdGVuIHRvIGhlci4gVGhlIENhdCBzZWVtZWQgdG8gdGhpbmsgdG\"\n        \"hhdCB0aGVyZSB3YXMgZW5vdWdoIG9mIGl0IG5vdyBpbiBzaWdodCwgYW5kIG5vIG1vcmUgb2YgaXQgYXBwZWFyZWQuJ0kgZG9uJ3QgdGhpbmsg\"\n        \"dGhleSBwbGF5IGF0IGFsbCBmYWlybHksJyBBbGljZSBiZWdhbiwgaW4gcmF0aGVyIGEgY29tcGxhaW5pbmcgdG9uZSwgJ2FuZCB0aGV5IGFsbC\"\n        \"BxdWFycmVsIHNvIGRyZWFkZnVsbHkgb25lIGNhbid0IGhlYXIgb25lc2VsZiBzcGVha+\"\n        \"KAlGFuZCB0aGV5IGRvbid0IHNlZW0gdG8gaGF2ZSBhbnkgcnVsZXMgaW4gcGFydGljdWxhcjsgYXQgbGVhc3QsIGlmIHRoZXJlIGFyZSwgbm9i\"\n        \"b2R5IGF0dGVuZHMgdG8gdGhlbeKAlGFuZCB5b3UndmUgbm8gaWRlYSBob3cgY29uZnVzaW5nIGl0IGlzIGFsbCB0aGUgdGhpbmdzIGJlaW5nIG\"\n        \"FsaXZlOyBmb3IgaW5zdGFuY2UsIHRoZXJlJ3MgdGhlIGFyY2ggSSd2ZSBnb3QgdG8gZ28gdGhyb3VnaCBuZXh0IHdhbGtpbmcgYWJvdXQgYXQg\"\n        \"dGhlIG90aGVyIGVuZCBvZiB0aGUgZ3JvdW5k4oCUYW5kIEkgc2hvdWxkIGhhdmUgY3JvcXVldGVkIHRoZSBRdWVlbidzIGhlZGdlaG9nIGp1c3\"\n        \"Qgbm93LCBvbmx5IGl0IHJhbiBhd2F5IHdoZW4gaXQgc2F3IG1pbmUgY29taW5nIScnSG93IGRvIHlvdSBsaWtlIHRoZSBRdWVlbj8nIHNhaWQg\"\n        \"dGhlIENhdCBpbiBhIGxvdyB2b2ljZS4nTm90IGF0IGFsbCwnIHNhaWQgQWxpY2U6ICdzaGUncyBzbyBleHRyZW1lbHnigJQnIEp1c3QgdGhlbi\"\n        \"BzaGUgbm90aWNlZCB0aGF0IHRoZSBRdWVlbiB3YXMgY2xvc2UgYmVoaW5kIGhlciwgbGlzdGVuaW5nOiBzbyBzaGUgd2VudCBvbiwgJ+\"\n        \"KAlGxpa2VseSB0byB3aW4sIHRoYXQgaXQncyBoYXJkbHkgd29ydGggd2hpbGUgZmluaXNoaW5nIHRoZSBnYW1lLidUaGUgUXVlZW4gc21pbGVk\"\n        \"IGFuZCBwYXNzZWQgb24uJ1dobyBhcmUgeW91IHRhbGtpbmcgdG8/\"\n        \"JyBzYWlkIHRoZSBLaW5nLCBnb2luZyB1cCB0byBBbGljZSwgYW5kIGxvb2tpbmcgYXQgdGhlIENhdCdzIGhlYWQgd2l0aCBncmVhdCBjdXJpb3\"\n        \"NpdHkuJ0l0J3MgYSBmcmllbmQgb2YgbWluZeKAlGEgQ2hlc2hpcmUgQ2F0LCcgc2FpZCBBbGljZTogJ2FsbG93IG1lIHRvIGludHJvZHVjZSBp\"\n        \"dC4nJ0kgZG9uJ3QgbGlrZSB0aGUgbG9vayBvZiBpdCBhdCBhbGwsJyBzYWlkIHRoZSBLaW5nOiAnaG93ZXZlciwgaXQgbWF5IGtpc3MgbXkgaG\"\n        \"FuZCBpZiBpdCBsaWtlcy4nJ0knZCByYXRoZXIgbm90LCcgdGhlIENhdCByZW1hcmtlZC4nRG9uJ3QgYmUgaW1wZXJ0aW5lbnQsJyBzYWlkIHRo\"\n        \"ZSBLaW5nLCAnYW5kIGRvbid0IGxvb2sgYXQgbWUgbGlrZSB0aGF0IScgSGUgZ290IGJlaGluZCBBbGljZSBhcyBoZSBzcG9rZS4nQSBjYXQgbW\"\n        \"F5IGxvb2sgYXQgYSBraW5nLCcgc2FpZCBBbGljZS4gJ0kndmUgcmVhZCB0aGF0IGluIHNvbWUgYm9vaywgYnV0IEkgZG9uJ3QgcmVtZW1iZXIg\"\n        \"d2hlcmUuJydXZWxsLCBpdCBtdXN0IGJlIHJlbW92ZWQsJyBzYWlkIHRoZSBLaW5nIHZlcnkgZGVjaWRlZGx5LCBhbmQgaGUgY2FsbGVkIHRoZS\"\n        \"BRdWVlbiwgd2hvIHdhcyBwYXNzaW5nIGF0IHRoZSBtb21lbnQsICdNeSBkZWFyISBJIHdpc2ggeW91IHdvdWxkIGhhdmUgdGhpcyBjYXQgcmVt\"\n        \"b3ZlZCEnVGhlIFF1ZWVuIGhhZCBvbmx5IG9uZSB3YXkgb2Ygc2V0dGxpbmcgYWxsIGRpZmZpY3VsdGllcywgZ3JlYXQgb3Igc21hbGwuICdPZm\"\n        \"Ygd2l0aCBoaXMgaGVhZCEnIHNoZSBzYWlkLCB3aXRob3V0IGV2ZW4gbG9va2luZyByb3VuZC4nSSdsbCBmZXRjaCB0aGUgZXhlY3V0aW9uZXIg\"\n        \"bXlzZWxmLCcgc2FpZCB0aGUgS2luZyBlYWdlcmx5LCBhbmQgaGUgaHVycmllZCBvZmYuQWxpY2UgdGhvdWdodCBzaGUgbWlnaHQgYXMgd2VsbC\"\n        \"BnbyBiYWNrLCBhbmQgc2VlIGhvdyB0aGUgZ2FtZSB3YXMgZ29pbmcgb24sIGFzIHNoZSBoZWFyZCB0aGUgUXVlZW4ncyB2b2ljZSBpbiB0aGUg\"\n        \"ZGlzdGFuY2UsIHNjcmVhbWluZyB3aXRoIHBhc3Npb24uIFNoZSBoYWQgYWxyZWFkeSBoZWFyZCBoZXIgc2VudGVuY2UgdGhyZWUgb2YgdGhlIH\"\n        \"BsYXllcnMgdG8gYmUgZXhlY3V0ZWQgZm9yIGhhdmluZyBtaXNzZWQgdGhlaXIgdHVybnMsIGFuZCBzaGUgZGlkIG5vdCBsaWtlIHRoZSBsb29r\"\n        \"IG9mIHRoaW5ncyBhdCBhbGwsIGFzIHRoZSBnYW1lIHdhcyBpbiBzdWNoIGNvbmZ1c2lvbiB0aGF0IHNoZSBuZXZlciBrbmV3IHdoZXRoZXIgaX\"\n        \"Qgd2FzIGhlciB0dXJuIG9yIG5vdC4gU28gc2hlIHdlbnQgaW4gc2VhcmNoIG9mIGhlciBoZWRnZWhvZy5UaGUgaGVkZ2Vob2cgd2FzIGVuZ2Fn\"\n        \"ZWQgaW4gYSBmaWdodCB3aXRoIGFub3RoZXIgaGVkZ2Vob2csIHdoaWNoIHNlZW1lZCB0byBBbGljZSBhbiBleGNlbGxlbnQgb3Bwb3J0dW5pdH\"\n        \"kgZm9yIGNyb3F1ZXRpbmcgb25lIG9mIHRoZW0gd2l0aCB0aGUgb3RoZXI6IHRoZSBvbmx5IGRpZmZpY3VsdHkgd2FzLCB0aGF0IGhlciBmbGFt\"\n        \"aW5nbyB3YXMgZ29uZSBhY3Jvc3MgdG8gdGhlIG90aGVyIHNpZGUgb2YgdGhlIGdhcmRlbiwgd2hlcmUgQWxpY2UgY291bGQgc2VlIGl0IHRyeW\"\n        \"luZyBpbiBhIGhlbHBsZXNzIHNvcnQgb2Ygd2F5IHRvIGZseSB1cCBpbnRvIGEgdHJlZS5CeSB0aGUgdGltZSBzaGUgaGFkIGNhdWdodCB0aGUg\"\n        \"ZmxhbWluZ28gYW5kIGJyb3VnaHQgaXQgYmFjaywgdGhlIGZpZ2h0IHdhcyBvdmVyLCBhbmQgYm90aCB0aGUgaGVkZ2Vob2dzIHdlcmUgb3V0IG\"\n        \"9mIHNpZ2h0OiAnYnV0IGl0IGRvZXNuJ3QgbWF0dGVyIG11Y2gsJyB0aG91Z2h0IEFsaWNlLCAnYXMgYWxsIHRoZSBhcmNoZXMgYXJlIGdvbmUg\"\n        \"ZnJvbSB0aGlzIHNpZGUgb2YgdGhlIGdyb3VuZC4nIFNvIHNoZSB0dWNrZWQgaXQgYXdheSB1bmRlciBoZXIgYXJtLCB0aGF0IGl0IG1pZ2h0IG\"\n        \"5vdCBlc2NhcGUgYWdhaW4sIGFuZCB3ZW50IGJhY2sgZm9yIGEgbGl0dGxlIG1vcmUgY29udmVyc2F0aW9uIHdpdGggaGVyIGZyaWVuZC5XaGVu\"\n        \"IHNoZSBnb3QgYmFjayB0byB0aGUgQ2hlc2hpcmUgQ2F0LCBzaGUgd2FzIHN1cnByaXNlZCB0byBmaW5kIHF1aXRlIGEgbGFyZ2UgY3Jvd2QgY2\"\n        \"9sbGVjdGVkIHJvdW5kIGl0OiB0aGVyZSB3YXMgYSBkaXNwdXRlIGdvaW5nIG9uIGJldHdlZW4gdGhlIGV4ZWN1dGlvbmVyLCB0aGUgS2luZywg\"\n        \"YW5kIHRoZSBRdWVlbiwgd2hvIHdlcmUgYWxsIHRhbGtpbmcgYXQgb25jZSwgd2hpbGUgYWxsIHRoZSByZXN0IHdlcmUgcXVpdGUgc2lsZW50LC\"\n        \"BhbmQgbG9va2VkIHZlcnkgdW5jb21mb3J0YWJsZS5UaGUgbW9tZW50IEFsaWNlIGFwcGVhcmVkLCBzaGUgd2FzIGFwcGVhbGVkIHRvIGJ5IGFs\"\n        \"bCB0aHJlZSB0byBzZXR0bGUgdGhlIHF1ZXN0aW9uLCBhbmQgdGhleSByZXBlYXRlZCB0aGVpciBhcmd1bWVudHMgdG8gaGVyLCB0aG91Z2gsIG\"\n        \"FzIHRoZXkgYWxsIHNwb2tlIGF0IG9uY2UsIHNoZSBmb3VuZCBpdCB2ZXJ5IGhhcmQgaW5kZWVkIHRvIG1ha2Ugb3V0IGV4YWN0bHkgd2hhdCB0\"\n        \"aGV5IHNhaWQuVGhlIGV4ZWN1dGlvbmVyJ3MgYXJndW1lbnQgd2FzLCB0aGF0IHlvdSBjb3VsZG4ndCBjdXQgb2ZmIGEgaGVhZCB1bmxlc3MgdG\"\n        \"hlcmUgd2FzIGEgYm9keSB0byBjdXQgaXQgb2ZmIGZyb206IHRoYXQgaGUgaGFkIG5ldmVyIGhhZCB0byBkbyBzdWNoIGEgdGhpbmcgYmVmb3Jl\"\n        \"LCBhbmQgaGUgd2Fzbid0IGdvaW5nIHRvIGJlZ2luIGF0IGhpcyB0aW1lIG9mIGxpZmUuVGhlIEtpbmcncyBhcmd1bWVudCB3YXMsIHRoYXQgYW\"\n        \"55dGhpbmcgdGhhdCBoYWQgYSBoZWFkIGNvdWxkIGJlIGJlaGVhZGVkLCBhbmQgdGhhdCB5b3Ugd2VyZW4ndCB0byB0YWxrIG5vbnNlbnNlLlRo\"\n        \"ZSBRdWVlbidzIGFyZ3VtZW50IHdhcywgdGhhdCBpZiBzb21ldGhpbmcgd2Fzbid0IGRvbmUgYWJvdXQgaXQgaW4gbGVzcyB0aGFuIG5vIHRpbW\"\n        \"Ugc2hlJ2QgaGF2ZSBldmVyeWJvZHkgZXhlY3V0ZWQsIGFsbCByb3VuZC4gKEl0IHdhcyB0aGlzIGxhc3QgcmVtYXJrIHRoYXQgaGFkIG1hZGUg\"\n        \"dGhlIHdob2xlIHBhcnR5IGxvb2sgc28gZ3JhdmUgYW5kIGFueGlvdXMuKUFsaWNlIGNvdWxkIHRoaW5rIG9mIG5vdGhpbmcgZWxzZSB0byBzYX\"\n        \"kgYnV0ICdJdCBiZWxvbmdzIHRvIHRoZSBEdWNoZXNzOiB5b3UnZCBiZXR0ZXIgYXNrIGhlciBhYm91dCBpdC4nJ1NoZSdzIGluIHByaXNvbiwn\"\n        \"IHRoZSBRdWVlbiBzYWlkIHRvIHRoZSBleGVjdXRpb25lcjogJ2ZldGNoIGhlciBoZXJlLicgQW5kIHRoZSBleGVjdXRpb25lciB3ZW50IG9mZi\"\n        \"BsaWtlIGFuIGFycm93LlRoZSBDYXQncyBoZWFkIGJlZ2FuIGZhZGluZyBhd2F5IHRoZSBtb21lbnQgaGUgd2FzIGdvbmUsIGFuZCwgYnkgdGhl\"\n        \"IHRpbWUgaGUgaGFkIGNvbWUgYmFjayB3aXRoIHRoZSBEdWNoZXNzLCBpdCBoYWQgZW50aXJlbHkgZGlzYXBwZWFyZWQ7IHNvIHRoZSBLaW5nIG\"\n        \"FuZCB0aGUgZXhlY3V0aW9uZXIgcmFuIHdpbGRseSB1cCBhbmQgZG93biBsb29raW5nIGZvciBpdCwgd2hpbGUgdGhlIHJlc3Qgb2YgdGhlIHBh\"\n        \"cnR5IHdlbnQgYmFjayB0byB0aGUgZ2FtZS4=\";\n    using it_base64_t = bai::base64_from_binary<bai::transform_width<std::string::const_iterator, 6, 8>>;\n\n    auto writePaddChars = (3 - input.length() % 3) % 3;\n    std::string base64(it_base64_t(input.begin()), it_base64_t(input.end()));\n    base64.append(writePaddChars, '=');\n    assert(base64 == output);\n    return 0;\n}\n#elif 0\n\n#include <memory>\n#include <sstream>\n\n#include <boost/archive/text_iarchive.hpp>\n#include <boost/archive/text_oarchive.hpp>\n#include <boost/serialization/shared_ptr.hpp>\n\nstruct S\n{\n\tint i;\n\tchar c;\n\n\ttemplate <class Archive>\n\tvoid serialize(Archive & ar, const unsigned int version)\n\t{\n\t\tar & i;\n\t\tar & c;\n\t}\n};\n\nint main()\n{\n\tconst auto s0 = std::make_shared<S>();\n\ts0->i = 42;\n\ts0->c = 'c';\n\n\tstd::stringstream ss;\n\n\t{\n\t\tboost::archive::text_oarchive oa(ss);\n\t\toa << s0;\n\t}\n\n\tstd::shared_ptr<S> s1;\n\t{\n\t\tboost::archive::text_iarchive ia(ss);\n\t\tia >> s1;\n\t}\n\n\treturn 0;\n}\n\n#elif 0\n#include <boost/archive/binary_iarchive.hpp>\n#include <boost/serialization/vector.hpp>\n#include <sstream>\n#include <vector>\n\nvoid f()\n{\n  std::stringstream iss;\n  boost::archive::binary_iarchive ar(iss);\n  std::vector<int> out;\n  ar >> out;\n}\n\nint main(int argc, char* argv[])\n{\n    return 0;\n}\n\n#include <boost/archive/xml_oarchive.hpp>\n#include <boost/archive/xml_iarchive.hpp>\n#include <boost/archive/detail/archive_serializer_map.hpp>\n#include <boost/archive/impl/archive_serializer_map.ipp>\n#include <boost/archive/impl/basic_xml_iarchive.ipp>\n#include <boost/archive/impl/xml_iarchive_impl.ipp>\n#include <boost/serialization/nvp.hpp>\n#include <limits>\n#include <fstream>\n\nclass xml_iarchive_nan :\npublic boost::archive::xml_iarchive_impl<xml_iarchive_nan>\n{\nprotected:\n    friend class boost::archive::detail::interface_iarchive<xml_iarchive_nan>;\n    friend class boost::archive::detail::common_iarchive<xml_iarchive_nan>;\n    friend class boost::archive::basic_xml_iarchive<xml_iarchive_nan>;\n    friend class boost::archive::load_access;\n\n    using boost::archive::xml_iarchive_impl<xml_iarchive_nan>::load;\n    void load(double & t)\n    {\n        char c='0';\n        if(!is.fail())\n        {\n            c=is.peek();\n            if(c!='n')\n            {\n                boost::archive::xml_iarchive_impl<xml_iarchive_nan>::load(t);\n            }\n            else\n            {\n                char c1='0',c2='0';\n                is.get(c).get(c1).get(c2);\n                if(is.fail()||(!((c=='n')&&(c1=='a')&&(c2=='n'))))\n                    boost::serialization::throw_exception(\n                                                          boost::archive::archive_exception(\n                                                                                            boost::archive::archive_exception::input_stream_error));\n                else\n                    t=std::numeric_limits<double>::quiet_NaN();\n            }\n        }\n        else\n            boost::serialization::throw_exception(\n                                                  boost::archive::archive_exception(boost::archive::archive_exception::input_stream_error));\n    }\n\npublic:\n    xml_iarchive_nan(std::istream & is, unsigned int flags = 0) :\n    boost::archive::xml_iarchive_impl<xml_iarchive_nan>(is, flags)\n    {}\n    ~xml_iarchive_nan(){};\n};\n\nBOOST_SERIALIZATION_REGISTER_ARCHIVE(xml_iarchive_nan)\n\nnamespace boost\n{\n    namespace archive\n    {\n        template class detail::archive_serializer_map<xml_iarchive_nan>;\n        template class detail::interface_iarchive<xml_iarchive_nan>;\n        template class detail::common_iarchive<xml_iarchive_nan>;\n        template class basic_xml_iarchive<xml_iarchive_nan>;\n        template class xml_iarchive_impl<xml_iarchive_nan>;\n\n    }\n}\n\nint main(int argc, char** argv)\n{\n    double value=0.0;\n    std::ifstream ifile(\"./somefile.xml\");\n    xml_iarchive_nan ia(ifile);\n    ia>>BOOST_SERIALIZATION_NVP(value);\n}\n\n#elif 0\n// submitted as https://github.com/boostorg/serialization/issues/154\n\n#include <boost/archive/text_iarchive.hpp>\n#include <boost/archive/text_oarchive.hpp>\n\n#include <boost/serialization/vector.hpp>\n#include <boost/serialization/string.hpp>\n\n#include <iostream>\n#include <sstream>\n#include <cassert>\n\nstruct Tracked {\n    std::string x;\n    Tracked(std::string s) : x(s) {}\n    Tracked() : x(\"tracked\"){}\n    template <class A> void serialize(A& ar, unsigned int ) {\n        ar & x;\n    }\n};\n\nstruct Main {\n    Tracked t_before;\n    Tracked* t_pointer;\n    Tracked t_after;\n    Main() : t_before(\"before\"), t_pointer(0), t_after(\"after\") {}\n    template <class A> void serialize(A& ar, unsigned int ) {\n        ar\n            & t_before\n            & t_pointer\n            & t_after\n        ;\n    }\n};\n\n#define CHECK_EQUAL(X,Y) assert(X==Y)\n#define REQUIRE_EQUAL(X,Y) CHECK_EQUAL(X,Y)\nint main(int argc, char *argv[])\n{\n    typedef std::vector<Main> Mains;\n\n    std::stringstream ss;\n\n    {\n        Mains ms;\n        ms.push_back( Main());\n        ms.push_back( Main());\n        ms.back().t_pointer = ms.front().t_pointer = new Tracked;\n\n        REQUIRE_EQUAL( ms.size(), 2);\n        CHECK_EQUAL( ms[0].t_pointer, ms[1].t_pointer );\n        CHECK_EQUAL( ms[0].t_pointer->x, \"tracked\" );\n\n        boost::archive::text_oarchive oa(ss);\n        oa << ms;\n\n        delete ms.back().t_pointer;\n    }\n\n    std::cout << ss.str() << std::endl;\n\n    {\n        Mains ms;\n        boost::archive::text_iarchive ia(ss);\n        ia >> ms;\n\n        REQUIRE_EQUAL( ms.size(), 2);\n        CHECK_EQUAL( ms[0].t_pointer, ms[1].t_pointer );\n        CHECK_EQUAL( ms[0].t_pointer->x, \"tracked\" );\n    }\n\n    return 0;\n}\n\n#elif 0\n\n// boost::variant not correctly serialized when reusing the memory location #203\n#include <boost/archive/text_iarchive.hpp>\n#include <boost/archive/text_oarchive.hpp>\n#include <boost/serialization/serialization.hpp>\n#include <boost/serialization/variant.hpp>\n\nint main() {\n  boost::variant<int> variant = 1;\n\n  // write it two times\n  std::stringstream ss;\n  boost::archive::text_oarchive oa(ss);\n  oa << make_nvp(\"var1\", variant);\n  oa << make_nvp(\"var2\", variant);\n  ss.flush();\n\n  // read it two times\n  boost::variant<int> v1;\n  boost::variant<int> v2;\n  boost::archive::text_iarchive ia(ss);\n  ia >> boost::serialization::make_nvp(\"var1\", v1);\n  ia >> boost::serialization::make_nvp(\"var2\", v2);\n\n  assert(boost::get<int>(v1) == 1);\n  assert(boost::get<int>(v2) == 1);  // Fails: v2 is actually zero\n}\n\n#else\n\n#include <boost/serialization/set.hpp>\n\nint main(int argc, char* argv[])\n{\n    return 0;\n}\n#endif\n"
  },
  {
    "path": "test/text_archive.hpp",
    "content": "// (C) Copyright 2002-4 Robert Ramey - http://www.rrsd.com .\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for updates, documentation, and revision history.\n// text_archive\n#include <boost/archive/text_oarchive.hpp>\ntypedef boost::archive::text_oarchive test_oarchive;\ntypedef std::ofstream test_ostream;\n#include <boost/archive/text_iarchive.hpp>\ntypedef boost::archive::text_iarchive test_iarchive;\ntypedef std::ifstream test_istream;\n"
  },
  {
    "path": "test/text_warchive.hpp",
    "content": "// (C) Copyright 2002-4 Robert Ramey - http://www.rrsd.com .\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for updates, documentation, and revision history.\n// text_warchive\n#include <boost/archive/text_woarchive.hpp>\ntypedef boost::archive::text_woarchive test_oarchive;\ntypedef std::wofstream test_ostream;\n#include <boost/archive/text_wiarchive.hpp>\ntypedef boost::archive::text_wiarchive test_iarchive;\ntypedef std::wifstream test_istream;\n"
  },
  {
    "path": "test/xml_archive.hpp",
    "content": "// (C) Copyright 2002-4 Robert Ramey - http://www.rrsd.com .\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for updates, documentation, and revision history.\n// xml_archive\n#include <boost/archive/xml_oarchive.hpp>\ntypedef boost::archive::xml_oarchive test_oarchive;\ntypedef std::ofstream test_ostream;\n#include <boost/archive/xml_iarchive.hpp>\ntypedef boost::archive::xml_iarchive test_iarchive;\ntypedef std::ifstream test_istream;\n"
  },
  {
    "path": "test/xml_warchive.hpp",
    "content": "// (C) Copyright 2002-4 Robert Ramey - http://www.rrsd.com .\n// Use, modification and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for updates, documentation, and revision history.\n// xml_warchive\n#include <boost/archive/xml_woarchive.hpp>\ntypedef boost::archive::xml_woarchive test_oarchive;\ntypedef std::wofstream test_ostream;\n#include <boost/archive/xml_wiarchive.hpp>\ntypedef boost::archive::xml_wiarchive test_iarchive;\ntypedef std::wifstream test_istream;\n"
  },
  {
    "path": "util/test.jam",
    "content": "# Boost serialization Library utility test Jamfile\n\n#  (C) Copyright Robert Ramey 2002-2004.\n#  Use, modification, and distribution are subject to the\n#  Boost Software License, Version 1.0. (See accompanying file\n#  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n#\n\n# the file contains Jam rules which are used in both the normal\n# boost test, as well as the performance test and comprehensive\n# tests.\n\n# import rules for testing conditional on config file variables\nimport config : requires ;\n\nBOOST_ARCHIVE_LIST = [ modules.peek : BOOST_ARCHIVE_LIST ] ;\n\n# these are used to shorten testing while in development.  It permits\n# testing to be applied to just a particular type of archive\nif ! $(BOOST_ARCHIVE_LIST) {\n    BOOST_ARCHIVE_LIST =\n        \"text_archive.hpp\"\n        \"text_warchive.hpp\"\n        \"binary_archive.hpp\"\n        \"xml_archive.hpp\"\n        \"xml_warchive.hpp\"\n    ;\n    # enable the tests which don't depend on a particular archive\n    BOOST_SERIALIZATION_TEST = true ;\n}\n\nrule run-template ( test-name : sources * : files * : requirements * ) {\n    return [\n        run\n            $(sources)\n        : # command\n        : #input files\n            $(files)\n        : # requirements\n            # toolset warnings\n            <toolset>borland:<cxxflags>\"-w-8080 -w-8071 -w-8057 -w-8062 -w-8008 -w-0018 -w-8066\"\n            #<toolset>gcc:<warnings>all # ?\n            <toolset>gcc:<cxxflags>\"-Wno-unused-variable -Wno-long-long\"\n            # <toolset>gcc:<variant>debug><define>_STLP_DEBUG\n            # <toolset>gcc:<variant>debug><define>_GLIBCXX_DEBUG\n            <toolset>darwin:<cxxflags>\"-Wno-unused-variable -Wno-long-long\"\n            <toolset>msvc:<warnings>all # == /W4\n            <toolset>msvc:<define>_SCL_SECURE_NO_WARNINGS\n            <toolset>msvc:<define>_SCL_SECURE_NO_DEPRECATE\n            <toolset>msvc:<define>_CRT_SECURE_NO_WARNINGS\n            <toolset>msvc:<define>_CRT_SECURE_NO_DEPRECATE\n            <toolset>msvc:<cxxflags>\"-wd4996\"\n            <toolset>clang:<variant>debug:<cxxflags>\"-fsanitize=memory\"\n            # toolset optimizations\n            <toolset>msvc:<cxxflags>\"-Gy\"\n            # linking\n            <link>shared:<define>BOOST_SERIALIZATION_DYN_LINK=1\n            <link>shared:<define>BOOST_WSERIALIZATION_DYN_LINK=1\n            $(requirements)\n        : # test name\n            $(test-name)\n    ] ;\n}\n\n# Given a name of test, return the 'save' test that must be run\n# before the named test, or empty string if there's no such test.\nrule dependency-save-test ( test )\n{\n    local m = [ MATCH (.*)load(.*) : $(test) ] ;\n    if $(m)\n    {\n        return $(m[1])save$(m[2]) ;\n    }\n}\n\n# each of the following tests is run with each type of archive\nrule run-invoke ( test-name : sources * : files * : requirements * )\n{\n    local save-test = [ dependency-save-test $(test-name) ] ;\n\n    local tests ;\n    tests += [\n        run-template $(test-name)\n        : # sources\n            $(sources)\n            ../build//boost_serialization\n        : # input files\n        : # requirements\n            $(requirements)\n            <define>BOOST_LIB_DIAGNOSTIC=1\n            <dependency>$(save-test)\n    ] ;\n    return $(tests) ;\n}\n\n# each of the following tests is run with each type of archive\nrule run-winvoke ( test-name : sources * : files * : requirements * )\n{\n    local save-test = [ dependency-save-test $(test-name) ] ;\n\n    local tests ;\n    tests += [\n        run-template $(test-name)\n        : # sources\n            $(sources)\n            ../build//boost_serialization\n            ../build//boost_wserialization\n        : # input files\n        : # requirements\n            $(requirements)\n            <define>BOOST_LIB_DIAGNOSTIC=1\n            # both stlport and msvc6 define iswspace\n            <toolset>msvc,<stdlib>stlport:<linkflags>\"-force:multiple\"\n            <dependency>$(save-test)\n            [ requires std_wstreambuf ]\n    ] ;\n    return $(tests) ;\n}\n\n# for tests which don't use library code - usually just headers\nrule test-bsl-run-no-lib  ( test-name : sources * : requirements * )\n{\n    local tests ;\n    tests += [\n        run-template $(test-name)\n        : # sources\n            $(test-name).cpp $(sources).cpp\n        : # input files\n        : # requirements\n            $(requirements)\n    ] ;\n    return $(tests) ;\n}\n\n# for tests which are run just once rather than for every archive\nrule test-bsl-run ( test-name : sources * : libs * : requirements * )\n{\n    local tests ;\n    tests +=  [\n        run-invoke $(test-name)\n        : # sources\n            $(test-name).cpp $(sources).cpp $(libs)\n        : # input files\n        : # requirements\n            $(requirements)\n    ] ;\n    return $(tests) ;\n}\n\nrule test-bsl-run_archive ( test-name : archive-name : sources * : libs * : requirements * ) {\n    local tests ;\n    switch $(archive-name) {\n    case \"*_warchive\" :\n        tests +=  [\n            run-winvoke $(test-name)_$(archive-name)\n            : # sources\n                $(sources).cpp $(libs)\n            : # input files\n            : # requirements\n                <define>BOOST_ARCHIVE_TEST=$(archive-name).hpp\n                $(requirements)\n        ] ;\n    case \"*xml_archive\" :\n        tests +=  [\n            run-invoke $(test-name)_$(archive-name)\n            : # sources\n                $(sources).cpp $(libs)\n            : # input files\n            : # requirements\n                <define>BOOST_ARCHIVE_TEST=$(archive-name).hpp\n                $(requirements)\n                [ requires std_wstreambuf ]\n        ] ;\n    case \"*\" :\n        tests +=  [\n            run-invoke $(test-name)_$(archive-name)\n            : # sources\n                $(sources).cpp $(libs)\n            : # input files\n            : # requirements\n                <define>BOOST_ARCHIVE_TEST=$(archive-name).hpp\n                $(requirements)\n        ] ;\n    }\n    return $(tests) ;\n}\n\nrule test-bsl-run_files ( test-name : sources * : libs * : requirements * ) {\n    local tests ;\n    for local defn in $(BOOST_ARCHIVE_LIST) {\n        tests += [\n            test-bsl-run_archive $(test-name)\n            : $(defn:LB)\n            : $(test-name) $(sources)\n            : $(libs)\n            : $(requirements)\n        ] ;\n    }\n    return $(tests) ;\n}\n\nrule test-bsl-run_polymorphic_files ( test-name : sources * : libs * : requirements * ) {\n    local tests ;\n    for local defn in $(BOOST_ARCHIVE_LIST) {\n        #ECHO polymorphic_$(defn:LB) ;\n        tests += [\n            test-bsl-run_archive $(test-name)\n            : polymorphic_$(defn:LB)\n            : $(test-name) $(sources)\n            : $(libs)\n            : $(requirements)\n        ] ;\n    }\n    return $(tests) ;\n}\n\n"
  }
]