mirror of
https://github.com/boostorg/exception.git
synced 2026-01-14 03:06:58 +01:00
Compare commits
52 Commits
boost-1.76
...
feature/se
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
c1e7e3511e | ||
|
|
95b1ead06c | ||
|
|
e46dd22b3c | ||
|
|
1da3782f79 | ||
|
|
71ff2a5254 | ||
|
|
9238ef8e7f | ||
|
|
5ea93e34e1 | ||
|
|
40554e238c | ||
|
|
95854acc9a | ||
|
|
b5bf79462e | ||
|
|
ec7442e3b7 | ||
|
|
a27c2d5127 | ||
|
|
64ca508153 | ||
|
|
ece51fe0f7 | ||
|
|
399208b682 | ||
|
|
1c66828bb5 | ||
|
|
fd72443067 | ||
|
|
752185750d | ||
|
|
948578d5b4 | ||
|
|
b9170a02f1 | ||
|
|
f719cc1af5 | ||
|
|
ad15fefae7 | ||
|
|
11f102a987 | ||
|
|
fe23c01a93 | ||
|
|
ea70868a45 | ||
|
|
03aa58e06e | ||
|
|
0d69599d91 | ||
|
|
652e8e01d2 | ||
|
|
b039b4ea18 | ||
|
|
89d8033fed | ||
|
|
bd347f048a | ||
|
|
e2faee265d | ||
|
|
7df9fc8a85 | ||
|
|
9259706f08 | ||
|
|
eafe6dbd5c | ||
|
|
941754ed23 | ||
|
|
0d205cd71f | ||
|
|
b8e9e98b33 | ||
|
|
54f2228f78 | ||
|
|
4d18ec3e0d | ||
|
|
929ae48aa0 | ||
|
|
1dd151ae69 | ||
|
|
076211f4b4 | ||
|
|
52da83a1d7 | ||
|
|
1ed2045e07 | ||
|
|
38769cfd6b | ||
|
|
fdfd8f49fb | ||
|
|
c5367711b7 | ||
|
|
3ae756dd49 | ||
|
|
f93f374607 | ||
|
|
5a5434e6e8 | ||
|
|
21f522e4b6 |
274
.github/workflows/ci.yml
vendored
274
.github/workflows/ci.yml
vendored
@@ -17,116 +17,212 @@ jobs:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
include:
|
||||
- toolset: gcc-4.7
|
||||
cxxstd: "03,11"
|
||||
os: ubuntu-16.04
|
||||
install: g++-4.7
|
||||
- toolset: gcc-4.8
|
||||
cxxstd: "03,11"
|
||||
os: ubuntu-16.04
|
||||
cxxstd: "11"
|
||||
os: ubuntu-latest
|
||||
container: ubuntu:18.04
|
||||
install: g++-4.8
|
||||
- toolset: gcc-4.9
|
||||
cxxstd: "03,11"
|
||||
os: ubuntu-16.04
|
||||
install: g++-4.9
|
||||
- toolset: gcc-5
|
||||
cxxstd: "03,11,14,1z"
|
||||
os: ubuntu-16.04
|
||||
cxxstd: "11,14,1z"
|
||||
os: ubuntu-latest
|
||||
container: ubuntu:18.04
|
||||
install: g++-5
|
||||
- toolset: gcc-6
|
||||
cxxstd: "03,11,14,1z"
|
||||
os: ubuntu-16.04
|
||||
cxxstd: "11,14,1z"
|
||||
os: ubuntu-latest
|
||||
container: ubuntu:18.04
|
||||
install: g++-6
|
||||
- toolset: gcc-7
|
||||
cxxstd: "03,11,14,17"
|
||||
os: ubuntu-18.04
|
||||
cxxstd: "11,14,17"
|
||||
os: ubuntu-latest
|
||||
container: ubuntu:18.04
|
||||
- toolset: gcc-8
|
||||
cxxstd: "03,11,14,17,2a"
|
||||
os: ubuntu-18.04
|
||||
cxxstd: "11,14,17,2a"
|
||||
os: ubuntu-20.04
|
||||
install: g++-8
|
||||
- toolset: gcc-9
|
||||
cxxstd: "03,11,14,17,2a"
|
||||
os: ubuntu-18.04
|
||||
cxxstd: "11,14,17,2a"
|
||||
os: ubuntu-20.04
|
||||
- toolset: gcc-10
|
||||
cxxstd: "03,11,14,17,2a"
|
||||
os: ubuntu-18.04
|
||||
- toolset: clang
|
||||
compiler: clang++-3.5
|
||||
cxxstd: "03,11,14"
|
||||
os: ubuntu-16.04
|
||||
install: clang-3.5
|
||||
- toolset: clang
|
||||
compiler: clang++-3.6
|
||||
cxxstd: "03,11,14"
|
||||
os: ubuntu-16.04
|
||||
install: clang-3.6
|
||||
- toolset: clang
|
||||
compiler: clang++-3.7
|
||||
cxxstd: "03,11,14"
|
||||
os: ubuntu-16.04
|
||||
install: clang-3.7
|
||||
- toolset: clang
|
||||
compiler: clang++-3.8
|
||||
cxxstd: "03,11,14"
|
||||
os: ubuntu-16.04
|
||||
install: clang-3.8
|
||||
cxxstd: "11,14,17,2a"
|
||||
os: ubuntu-20.04
|
||||
install: g++-10
|
||||
- toolset: gcc-11
|
||||
cxxstd: "11,14,17,2a"
|
||||
os: ubuntu-22.04
|
||||
- toolset: gcc-12
|
||||
cxxstd: "11,14,17,20,2b"
|
||||
os: ubuntu-22.04
|
||||
install: g++-12
|
||||
- toolset: gcc-13
|
||||
cxxstd: "11,14,17,20,2b"
|
||||
os: ubuntu-latest
|
||||
container: ubuntu:24.04
|
||||
install: g++-13
|
||||
- toolset: gcc-14
|
||||
cxxstd: "11,14,17,20,2b"
|
||||
os: ubuntu-latest
|
||||
container: ubuntu:24.04
|
||||
install: g++-14
|
||||
- toolset: clang
|
||||
compiler: clang++-3.9
|
||||
cxxstd: "03,11,14"
|
||||
os: ubuntu-16.04
|
||||
cxxstd: "11,14"
|
||||
os: ubuntu-latest
|
||||
container: ubuntu:18.04
|
||||
install: clang-3.9
|
||||
- toolset: clang
|
||||
compiler: clang++-4.0
|
||||
cxxstd: "03,11,14"
|
||||
os: ubuntu-16.04
|
||||
cxxstd: "11,14"
|
||||
os: ubuntu-latest
|
||||
container: ubuntu:18.04
|
||||
install: clang-4.0
|
||||
- toolset: clang
|
||||
compiler: clang++-5.0
|
||||
cxxstd: "03,11,14,1z"
|
||||
os: ubuntu-16.04
|
||||
cxxstd: "11,14,1z"
|
||||
os: ubuntu-latest
|
||||
container: ubuntu:18.04
|
||||
install: clang-5.0
|
||||
- toolset: clang
|
||||
compiler: clang++-6.0
|
||||
cxxstd: "03,11,14,17"
|
||||
os: ubuntu-18.04
|
||||
cxxstd: "11,14,17"
|
||||
os: ubuntu-20.04
|
||||
install: clang-6.0
|
||||
- toolset: clang
|
||||
compiler: clang++-7
|
||||
cxxstd: "03,11,14,17"
|
||||
os: ubuntu-18.04
|
||||
cxxstd: "11,14,17"
|
||||
os: ubuntu-20.04
|
||||
install: clang-7
|
||||
- toolset: clang
|
||||
compiler: clang++-8
|
||||
cxxstd: "03,11,14,17,2a"
|
||||
cxxstd: "11,14,17"
|
||||
os: ubuntu-20.04
|
||||
install: clang-8
|
||||
- toolset: clang
|
||||
compiler: clang++-9
|
||||
cxxstd: "03,11,14,17,2a"
|
||||
cxxstd: "11,14,17"
|
||||
os: ubuntu-20.04
|
||||
install: clang-9
|
||||
- toolset: clang
|
||||
compiler: clang++-10
|
||||
cxxstd: "03,11,14,17,2a"
|
||||
cxxstd: "11,14,17,2a"
|
||||
os: ubuntu-20.04
|
||||
- toolset: clang
|
||||
cxxstd: "03,11,14,17,2a"
|
||||
os: macos-10.15
|
||||
compiler: clang++-11
|
||||
cxxstd: "11,14,17,2a"
|
||||
os: ubuntu-20.04
|
||||
- toolset: clang
|
||||
compiler: clang++-12
|
||||
cxxstd: "11,14,17,20"
|
||||
os: ubuntu-20.04
|
||||
- toolset: clang
|
||||
compiler: clang++-13
|
||||
cxxstd: "11,14,17,20,2b"
|
||||
container: ubuntu:22.04
|
||||
os: ubuntu-latest
|
||||
install: clang-13
|
||||
- toolset: clang
|
||||
compiler: clang++-14
|
||||
cxxstd: "11,14,17,20,2b"
|
||||
container: ubuntu:22.04
|
||||
os: ubuntu-latest
|
||||
install: clang-14
|
||||
- toolset: clang
|
||||
compiler: clang++-15
|
||||
cxxstd: "11,14,17,20,2b"
|
||||
container: ubuntu:22.04
|
||||
os: ubuntu-latest
|
||||
install: clang-15
|
||||
- toolset: clang
|
||||
compiler: clang++-16
|
||||
cxxstd: "11,14,17,20,2b"
|
||||
container: ubuntu:24.04
|
||||
os: ubuntu-latest
|
||||
install: clang-16
|
||||
- toolset: clang
|
||||
compiler: clang++-17
|
||||
cxxstd: "11,14,17,20,2b"
|
||||
container: ubuntu:24.04
|
||||
os: ubuntu-latest
|
||||
install: clang-17
|
||||
- toolset: clang
|
||||
compiler: clang++-18
|
||||
cxxstd: "11,14,17,20,2b"
|
||||
container: ubuntu:24.04
|
||||
os: ubuntu-latest
|
||||
install: clang-18
|
||||
- toolset: clang
|
||||
compiler: clang++-19
|
||||
cxxstd: "11,14,17,20,2b"
|
||||
container: ubuntu:24.10
|
||||
os: ubuntu-latest
|
||||
install: clang-19
|
||||
- toolset: clang
|
||||
cxxstd: "11,14,17,20,2b"
|
||||
os: macos-13
|
||||
- toolset: clang
|
||||
cxxstd: "11,14,17,20,2b"
|
||||
os: macos-14
|
||||
- toolset: clang
|
||||
cxxstd: "11,14,17,20,2b"
|
||||
os: macos-15
|
||||
|
||||
runs-on: ${{matrix.os}}
|
||||
|
||||
container:
|
||||
image: ${{matrix.container}}
|
||||
volumes:
|
||||
- /node20217:/node20217:rw,rshared
|
||||
- ${{ startsWith(matrix.container, 'ubuntu:1') && '/node20217:/__e/node20:ro,rshared' || ' ' }}
|
||||
|
||||
defaults:
|
||||
run:
|
||||
shell: bash
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
- name: Setup container environment
|
||||
if: matrix.container
|
||||
run: |
|
||||
apt-get update
|
||||
apt-get -y install sudo python3 git g++ curl xz-utils
|
||||
|
||||
- name: Install nodejs20glibc2.17
|
||||
if: ${{ startsWith( matrix.container, 'ubuntu:1' ) }}
|
||||
run: |
|
||||
curl -LO https://archives.boost.io/misc/node/node-v20.9.0-linux-x64-glibc-217.tar.xz
|
||||
tar -xf node-v20.9.0-linux-x64-glibc-217.tar.xz --strip-components 1 -C /node20217
|
||||
ldd /__e/node20/bin/node
|
||||
|
||||
- uses: actions/checkout@v4
|
||||
|
||||
- name: Install packages
|
||||
if: matrix.install
|
||||
run: sudo apt install ${{matrix.install}}
|
||||
run: |
|
||||
sudo apt-get update
|
||||
sudo apt-get -y install ${{matrix.install}}
|
||||
|
||||
- name: Setup Boost
|
||||
run: |
|
||||
echo GITHUB_REPOSITORY: $GITHUB_REPOSITORY
|
||||
LIBRARY=${GITHUB_REPOSITORY#*/}
|
||||
echo LIBRARY: $LIBRARY
|
||||
echo "LIBRARY=$LIBRARY" >> $GITHUB_ENV
|
||||
echo GITHUB_BASE_REF: $GITHUB_BASE_REF
|
||||
echo GITHUB_REF: $GITHUB_REF
|
||||
REF=${GITHUB_BASE_REF:-$GITHUB_REF}
|
||||
REF=${REF#refs/heads/}
|
||||
echo REF: $REF
|
||||
BOOST_BRANCH=develop && [ "$REF" == "master" ] && BOOST_BRANCH=master || true
|
||||
echo BOOST_BRANCH: $BOOST_BRANCH
|
||||
cd ..
|
||||
git clone -b $BOOST_BRANCH --depth 1 https://github.com/boostorg/boost.git boost-root
|
||||
cd boost-root
|
||||
cp -r $GITHUB_WORKSPACE/* libs/exception
|
||||
cp -r $GITHUB_WORKSPACE/* libs/$LIBRARY
|
||||
git submodule update --init tools/boostdep
|
||||
python tools/boostdep/depinst/depinst.py --git_args "--jobs 3" exception
|
||||
python3 tools/boostdep/depinst/depinst.py --git_args "--jobs 3" $LIBRARY
|
||||
cd libs/throw_exception
|
||||
git fetch origin feature/serialization
|
||||
git checkout feature/serialization
|
||||
cd ../..
|
||||
./bootstrap.sh
|
||||
./b2 -d0 headers
|
||||
|
||||
@@ -135,51 +231,81 @@ jobs:
|
||||
run: |
|
||||
echo "using ${{matrix.toolset}} : : ${{matrix.compiler}} ;" > ~/user-config.jam
|
||||
|
||||
- name: Download nlohmann/json
|
||||
run: |
|
||||
cd ../boost-root/libs/$LIBRARY
|
||||
python3 scripts/download_nlohmann_json.py
|
||||
|
||||
- name: Run tests
|
||||
run: |
|
||||
cd ../boost-root
|
||||
./b2 -j3 libs/exception/test toolset=${{matrix.toolset}} cxxstd=${{matrix.cxxstd}} variant=debug,release exception-handling=on,off rtti=on,off link=static,shared visibility=hidden,global
|
||||
./b2 -j3 libs/$LIBRARY/test toolset=${{matrix.toolset}} cxxstd=${{matrix.cxxstd}} variant=debug,release exception-handling=on,off rtti=on,off link=static,shared visibility=hidden,global
|
||||
|
||||
windows:
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
include:
|
||||
- toolset: msvc-14.1
|
||||
cxxstd: "14,17,latest"
|
||||
addrmd: 32,64
|
||||
os: windows-2016
|
||||
- toolset: msvc-14.2
|
||||
cxxstd: "14,17,latest"
|
||||
- toolset: msvc-14.0
|
||||
cxxstd: "14"
|
||||
addrmd: 32,64
|
||||
os: windows-2019
|
||||
- toolset: msvc-14.2
|
||||
cxxstd: "14,17,20,latest"
|
||||
addrmd: 32,64
|
||||
os: windows-2019
|
||||
- toolset: msvc-14.3
|
||||
cxxstd: "14,17,20,latest"
|
||||
addrmd: 32,64
|
||||
os: windows-2022
|
||||
- toolset: clang-win
|
||||
cxxstd: "14,17,20,latest"
|
||||
addrmd: 32,64
|
||||
os: windows-2022
|
||||
- toolset: gcc
|
||||
cxxstd: "03,11,14,17,2a"
|
||||
cxxstd: "11,14,17,2a"
|
||||
addrmd: 64
|
||||
os: windows-2019
|
||||
|
||||
runs-on: ${{matrix.os}}
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
- uses: actions/checkout@v4
|
||||
|
||||
- name: Setup Boost
|
||||
shell: cmd
|
||||
run: |
|
||||
echo GITHUB_REPOSITORY: %GITHUB_REPOSITORY%
|
||||
for /f %%i in ("%GITHUB_REPOSITORY%") do set LIBRARY=%%~nxi
|
||||
echo LIBRARY: %LIBRARY%
|
||||
echo LIBRARY=%LIBRARY%>>%GITHUB_ENV%
|
||||
echo GITHUB_BASE_REF: %GITHUB_BASE_REF%
|
||||
echo GITHUB_REF: %GITHUB_REF%
|
||||
if "%GITHUB_BASE_REF%" == "" set GITHUB_BASE_REF=%GITHUB_REF%
|
||||
set BOOST_BRANCH=develop
|
||||
if "%GITHUB_BASE_REF%" == "master" set BOOST_BRANCH=master
|
||||
for /f %%i in ("%GITHUB_BASE_REF%") do if "%%~nxi" == "master" set BOOST_BRANCH=master
|
||||
echo BOOST_BRANCH: %BOOST_BRANCH%
|
||||
cd ..
|
||||
git clone -b %BOOST_BRANCH% --depth 1 https://github.com/boostorg/boost.git boost-root
|
||||
cd boost-root
|
||||
xcopy /s /e /q %GITHUB_WORKSPACE% libs\exception\
|
||||
xcopy /s /e /q %GITHUB_WORKSPACE% libs\%LIBRARY%\
|
||||
git submodule update --init tools/boostdep
|
||||
python tools/boostdep/depinst/depinst.py --git_args "--jobs 3" exception
|
||||
python tools/boostdep/depinst/depinst.py --git_args "--jobs 3" %LIBRARY%
|
||||
cd libs\throw_exception
|
||||
git fetch origin feature/serialization
|
||||
git checkout feature/serialization
|
||||
cd ..\..
|
||||
cmd /c bootstrap
|
||||
b2 -d0 headers
|
||||
|
||||
- name: Download nlohmann/json
|
||||
shell: cmd
|
||||
run: |
|
||||
cd ../boost-root/libs/%LIBRARY%
|
||||
python3 scripts/download_nlohmann_json.py
|
||||
|
||||
- name: Run tests
|
||||
shell: cmd
|
||||
run: |
|
||||
cd ../boost-root
|
||||
b2 -j3 libs/exception/test toolset=${{matrix.toolset}} cxxstd=${{matrix.cxxstd}} address-model=${{matrix.addrmd}} variant=debug,release exception-handling=on,off rtti=on,off
|
||||
b2 -j3 libs/%LIBRARY%/test toolset=${{matrix.toolset}} cxxstd=${{matrix.cxxstd}} address-model=${{matrix.addrmd}} variant=debug,release exception-handling=on,off rtti=on,off embed-manifest-via=linker
|
||||
|
||||
1
.gitignore
vendored
1
.gitignore
vendored
@@ -1,3 +1,4 @@
|
||||
/.vscode/ipch/*
|
||||
/.vscode/settings.json
|
||||
.DS_Store
|
||||
/test/nlohmann/
|
||||
101
.vscode/tasks.json
vendored
Normal file
101
.vscode/tasks.json
vendored
Normal file
@@ -0,0 +1,101 @@
|
||||
{
|
||||
"version": "2.0.0",
|
||||
"tasks": [
|
||||
{
|
||||
"label": "Download nlohmann/json.hpp",
|
||||
"type": "shell",
|
||||
"command": "python scripts/download_nlohmann_json.py",
|
||||
"options": {
|
||||
"cwd": "${workspaceFolder}"
|
||||
},
|
||||
"problemMatcher": []
|
||||
},
|
||||
{
|
||||
"label": "b2: Run all tests (default)",
|
||||
"type": "shell",
|
||||
"dependsOn": ["Download nlohmann/json.hpp"],
|
||||
"command": "../../b2 test",
|
||||
"options": {
|
||||
"cwd": "${workspaceFolder}"
|
||||
},
|
||||
"group": "test",
|
||||
"problemMatcher": {
|
||||
"base": "$gcc",
|
||||
"fileLocation": ["relative", "${workspaceFolder}"]
|
||||
},
|
||||
"windows": {
|
||||
"command": "..\\..\\b2 test",
|
||||
"problemMatcher": {
|
||||
"base": "$msCompile",
|
||||
"fileLocation": ["relative", "${workspaceFolder}"]
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"label": "b2: Run all tests (release)",
|
||||
"type": "shell",
|
||||
"dependsOn": ["Download nlohmann/json.hpp"],
|
||||
"command": "../../b2 test variant=release",
|
||||
"options": {
|
||||
"cwd": "${workspaceFolder}"
|
||||
},
|
||||
"group": "test",
|
||||
"problemMatcher": {
|
||||
"base": "$gcc",
|
||||
"fileLocation": ["relative", "${workspaceFolder}"]
|
||||
},
|
||||
"windows": {
|
||||
"command": "..\\..\\b2 test variant=release",
|
||||
"problemMatcher": {
|
||||
"base": "$msCompile",
|
||||
"fileLocation": ["relative", "${workspaceFolder}"]
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"label": "b2: Run all tests (all configs)",
|
||||
"type": "shell",
|
||||
"dependsOn": ["Download nlohmann/json.hpp"],
|
||||
"command": "../../b2 test exception-handling=on,off rtti=on,off variant=debug,release link=static,shared",
|
||||
"options": {
|
||||
"cwd": "${workspaceFolder}"
|
||||
},
|
||||
"group": "test",
|
||||
"problemMatcher": {
|
||||
"base": "$gcc",
|
||||
"fileLocation": ["relative", "${workspaceFolder}"]
|
||||
},
|
||||
"windows": {
|
||||
"command": "..\\..\\b2 test exception-handling=on,off rtti=on,off variant=debug,release link=static,shared",
|
||||
"problemMatcher": {
|
||||
"base": "$msCompile",
|
||||
"fileLocation": ["relative", "${workspaceFolder}"]
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"label": "b2: Run test for current editor file",
|
||||
"type": "shell",
|
||||
"dependsOn": ["Download nlohmann/json.hpp"],
|
||||
"command": "../../b2 test ${fileBasenameNoExtension}.test",
|
||||
"options": {
|
||||
"cwd": "${workspaceFolder}"
|
||||
},
|
||||
"group": {
|
||||
"kind": "test",
|
||||
"isDefault": true
|
||||
},
|
||||
"problemMatcher": {
|
||||
"base": "$gcc",
|
||||
"fileLocation": ["relative", "${workspaceFolder}"]
|
||||
},
|
||||
"windows": {
|
||||
"command": "..\\..\\b2 test ${fileBasenameNoExtension}.test",
|
||||
"problemMatcher": {
|
||||
"base": "$msCompile",
|
||||
"fileLocation": ["relative", "${workspaceFolder}"]
|
||||
}
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -1,30 +1,30 @@
|
||||
# Copyright 2019 Mike Dev
|
||||
# Generated by `boostdep --cmake exception`
|
||||
# Copyright 2020, 2021 Peter Dimov
|
||||
# Distributed under the Boost Software License, Version 1.0.
|
||||
# See accompanying file LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt
|
||||
#
|
||||
# NOTE: CMake support for Boost.Exception is currently experimental at best
|
||||
# and the interface is likely to change in the future
|
||||
# https://www.boost.org/LICENSE_1_0.txt
|
||||
|
||||
cmake_minimum_required( VERSION 3.5 )
|
||||
project( BoostException LANGUAGES CXX )
|
||||
cmake_minimum_required(VERSION 3.5...3.20)
|
||||
|
||||
# We treat Boost.Exception as header only for now.
|
||||
# See https://github.com/boostorg/exception/pull/17
|
||||
# for more information.
|
||||
project(boost_exception VERSION "${BOOST_SUPERPROJECT_VERSION}" LANGUAGES CXX)
|
||||
|
||||
add_library( boost_exception INTERFACE )
|
||||
add_library( Boost::exception ALIAS boost_exception )
|
||||
add_library(boost_exception INTERFACE)
|
||||
add_library(Boost::exception ALIAS boost_exception)
|
||||
|
||||
target_include_directories( boost_exception INTERFACE include )
|
||||
target_include_directories(boost_exception INTERFACE include)
|
||||
|
||||
target_link_libraries( boost_exception
|
||||
INTERFACE
|
||||
Boost::assert
|
||||
Boost::config
|
||||
Boost::core
|
||||
Boost::smart_ptr
|
||||
Boost::throw_exception
|
||||
Boost::tuple
|
||||
Boost::type_traits
|
||||
target_link_libraries(boost_exception
|
||||
INTERFACE
|
||||
Boost::assert
|
||||
Boost::config
|
||||
Boost::core
|
||||
Boost::smart_ptr
|
||||
Boost::throw_exception
|
||||
Boost::tuple
|
||||
Boost::type_traits
|
||||
)
|
||||
|
||||
if(BUILD_TESTING AND EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/test/CMakeLists.txt")
|
||||
|
||||
add_subdirectory(test)
|
||||
|
||||
endif()
|
||||
|
||||
@@ -16,6 +16,7 @@ environment:
|
||||
matrix:
|
||||
- APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2015
|
||||
TOOLSET: msvc-9.0,msvc-10.0,msvc-11.0
|
||||
ADDRMD: 32
|
||||
- APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2015
|
||||
TOOLSET: msvc-12.0,msvc-14.0
|
||||
ADDRMD: 32,64
|
||||
@@ -29,18 +30,22 @@ environment:
|
||||
ADDRMD: 64
|
||||
- APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2019
|
||||
TOOLSET: msvc-14.2
|
||||
CXXSTD: 14,17
|
||||
CXXSTD: 14,17,latest
|
||||
ADDRMD: 32,64
|
||||
- APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2015
|
||||
ADDPATH: C:\cygwin\bin;
|
||||
TOOLSET: gcc
|
||||
CXXSTD: 03,11,14,1z
|
||||
- APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2015
|
||||
ADDPATH: C:\cygwin64\bin;
|
||||
TOOLSET: gcc
|
||||
CXXSTD: 03,11,14,1z
|
||||
- APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2015
|
||||
ADDPATH: C:\mingw\bin;
|
||||
TOOLSET: gcc
|
||||
CXXSTD: 03,11,14,1z
|
||||
- APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2015
|
||||
ADDPATH: C:\mingw-w64\x86_64-7.2.0-posix-seh-rt_v5-rev1\mingw64\bin;
|
||||
ADDPATH: C:\mingw-w64\x86_64-6.3.0-posix-seh-rt_v5-rev1\mingw64\bin;
|
||||
TOOLSET: gcc
|
||||
CXXSTD: 03,11,14,1z
|
||||
|
||||
|
||||
27
build.jam
Normal file
27
build.jam
Normal file
@@ -0,0 +1,27 @@
|
||||
# Copyright René Ferdinand Rivera Morell 2023-2024
|
||||
# Distributed under the Boost Software License, Version 1.0.
|
||||
# (See accompanying file LICENSE_1_0.txt or copy at
|
||||
# http://www.boost.org/LICENSE_1_0.txt)
|
||||
|
||||
require-b2 5.2 ;
|
||||
|
||||
constant boost_dependencies :
|
||||
/boost/assert//boost_assert
|
||||
/boost/config//boost_config
|
||||
/boost/core//boost_core
|
||||
/boost/smart_ptr//boost_smart_ptr
|
||||
/boost/throw_exception//boost_throw_exception
|
||||
/boost/tuple//boost_tuple
|
||||
/boost/type_traits//boost_type_traits ;
|
||||
|
||||
project /boost/exception
|
||||
;
|
||||
|
||||
explicit
|
||||
[ alias boost_exception : build//boost_exception ]
|
||||
[ alias all : boost_exception example test ]
|
||||
;
|
||||
|
||||
call-if : boost-library exception
|
||||
: install boost_exception
|
||||
;
|
||||
@@ -5,10 +5,11 @@
|
||||
# Distributed under the Boost Software License, Version 1.0. (See accompanying
|
||||
# file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
||||
|
||||
project boost/exception
|
||||
project
|
||||
: source-location ../src
|
||||
: common-requirements <include>../include <library>$(boost_dependencies)
|
||||
: requirements <link>static
|
||||
: usage-requirements <define>BOOST_EXCEPTION_NO_LIB=1
|
||||
;
|
||||
|
||||
lib boost_exception : clone_current_exception_non_intrusive.cpp ;
|
||||
boost-install boost_exception ;
|
||||
lib boost_exception : clone_current_exception_non_intrusive.cpp : <exception-handling>on ;
|
||||
|
||||
@@ -21,19 +21,7 @@
|
||||
<!-- file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -->
|
||||
<div class="RenoIncludeDIV"><div class="RenoAutoDIV"><h3>BOOST_THROW_EXCEPTION</h3>
|
||||
</div>
|
||||
<div class="RenoIncludeDIV"><p><span class="RenoEscape">#<!--<wiki>`#</wiki>--></span>include <<span class="RenoLink"><a href="boost_throw_exception_hpp.html">boost/throw_exception.hpp</a></span>></p>
|
||||
<div class="RenoIncludeDIV"><pre>#if !defined( BOOST_EXCEPTION_DISABLE )
|
||||
#include <<span class="RenoLink"><a href="boost_exception_exception_hpp.html">boost/exception/exception.hpp</a></span>>
|
||||
#include <boost/current_function.hpp>
|
||||
#define <span class="RenoLink">BOOST_THROW_EXCEPTION</span>(x)\
|
||||
::boost::<span class="RenoLink"><a href="throw_exception.html">throw_exception</a></span>( ::boost::<span class="RenoLink"><a href="enable_error_info.html">enable_error_info</a></span>(x) <<\
|
||||
::boost::<span class="RenoLink"><a href="boost_exception_exception_hpp.html">throw_function</a></span>(<span class="RenoLink"><a href="configuration_macros.html">BOOST_THROW_EXCEPTION_CURRENT_FUNCTION</a></span>) <<\
|
||||
::boost::<span class="RenoLink"><a href="boost_exception_exception_hpp.html">throw_file</a></span>(__FILE__) <<\
|
||||
::boost::<span class="RenoLink"><a href="boost_exception_exception_hpp.html">throw_line</a></span>((int)__LINE__) )
|
||||
#else
|
||||
#define <span class="RenoLink">BOOST_THROW_EXCEPTION</span>(x) ::boost::<span class="RenoLink"><a href="throw_exception.html">throw_exception</a></span>(x)
|
||||
#endif</pre>
|
||||
</div></div><p>This macro takes an exception object, records the current function name, __FILE__ and __LINE__ in it, and forwards it to <span class="RenoLink"><a href="throw_exception.html">throw_exception</a></span>. To recover this information at the catch site, use <span class="RenoLink"><a href="get_error_info.html">get_error_info</a></span>; the information is also included in the message returned by <span class="RenoLink"><a href="diagnostic_information.html">diagnostic_information</a></span>.</p>
|
||||
<p>Please see <a href="https://www.boost.org/doc/libs/release/libs/throw_exception/doc/html/throw_exception.html">Boost.ThrowException</a>.</p>
|
||||
</div><div class="RenoAutoDIV"><div class="RenoHR"><hr/></div>
|
||||
See also: <span class="RenoPageList"><a href="boost-exception.html">Boost Exception</a> | <a href="boost_throw_exception_hpp.html">boost/throw_exception.hpp</a> | <a href="configuration_macros.html">Configuration Macros</a> | <a href="frequently_asked_questions.html">Frequently Asked Questions</a></span>
|
||||
</div>
|
||||
|
||||
@@ -27,7 +27,6 @@
|
||||
#include <boost/current_function.hpp>
|
||||
#define <span class="RenoLink"><a href="BOOST_THROW_EXCEPTION.html">BOOST_THROW_EXCEPTION</a></span>(x)\
|
||||
::boost::<span class="RenoLink"><a href="throw_exception.html">throw_exception</a></span>( ::boost::<span class="RenoLink"><a href="enable_error_info.html">enable_error_info</a></span>(x) <<\
|
||||
::boost::<span class="RenoLink"><a href="boost_exception_exception_hpp.html">throw_function</a></span>(<span class="RenoLink"><a href="configuration_macros.html">BOOST_THROW_EXCEPTION_CURRENT_FUNCTION</a></span>) <<\
|
||||
::boost::<span class="RenoLink"><a href="boost_exception_exception_hpp.html">throw_file</a></span>(__FILE__) <<\
|
||||
::boost::<span class="RenoLink"><a href="boost_exception_exception_hpp.html">throw_line</a></span>((int)__LINE__) )
|
||||
#else
|
||||
|
||||
@@ -22,18 +22,17 @@
|
||||
<div class="RenoIncludeDIV"><div class="RenoAutoDIV"><h2>Configuration Macros</h2>
|
||||
</div>
|
||||
<p>Boost Exception responds to the following configuration macros:</p>
|
||||
<p><b>BOOST_NO_RTTI</b><span class="RenoBR"> </span><br/><b>BOOST_NO_TYPEID</b></p>
|
||||
<p><b>BOOST_NO_RTTI</b><span class="RenoBR"> </span><br/><b>BOOST_NO_TYPEID</b> (both defined automatically by boost/config.hpp)</p>
|
||||
<p>The first macro prevents Boost Exception from using dynamic_cast and dynamic typeid. If the second macro is also defined, Boost Exception does not use static typeid either. There are no observable degrading effects on the library functionality, except for the following:</p>
|
||||
<blockquote><p>By default, the <span class="RenoLink"><a href="get_error_info.html">get_error_info</a></span> function template can be called with any exception type. If BOOST_NO_RTTI is defined, <span class="RenoLink"><a href="get_error_info.html">get_error_info</a></span> can be used only with objects of type boost::<span class="RenoLink"><a href="exception.html">exception</a></span>.</p></blockquote>
|
||||
<h4>Note:</h4>
|
||||
<p>The library needs RTTI functionality. Disabling the language RTTI support enables an internal RTTI system, which may have more or less overhead depending on the platform.</p>
|
||||
<p><b>BOOST_EXCEPTION_DISABLE</b></p>
|
||||
<p>By default, <span class="RenoLink"><a href="enable_current_exception.html">enable_current_exception</a></span> and <span class="RenoLink"><a href="enable_error_info.html">enable_error_info</a></span> are integrated directly in the <span class="RenoLink"><a href="throw_exception.html">throw_exception</a></span> function. Defining BOOST_EXCEPTION_DISABLE disables this integration.</p>
|
||||
<p>Note that on some non-conformant compilers, for example MSVC 7.0 and older, as well as BCC, BOOST_EXCEPTION_DISABLE is implicitly defined in <span class="RenoLink"><a href="boost_throw_exception_hpp.html">boost/throw_exception.hpp</a></span>.</p>
|
||||
<p><b>BOOST_NO_EXCEPTIONS</b></p>
|
||||
<p><b>BOOST_NO_EXCEPTIONS</b> (defined automatically by boost/config.hpp)</p>
|
||||
<p>This macro disables exception handling in Boost, forwarding all exceptions to a user-defined non-template version of boost::<span class="RenoLink"><a href="throw_exception.html">throw_exception</a></span>. However, unless BOOST_EXCEPTION_DISABLE is also defined, users can still examine the exception object for any data added at the point of the throw, or use boost::<span class="RenoLink"><a href="diagnostic_information.html">diagnostic_information</a></span> (of course under BOOST_NO_EXCEPTIONS, the user-defined boost::throw_exception is not allowed to return to the caller.)</p>
|
||||
<p><b>BOOST_THROW_EXCEPTION_CURRENT_FUNCTION</b></p>
|
||||
<p>The <span class="RenoLink"><a href="BOOST_THROW_EXCEPTION.html">BOOST_THROW_EXCEPTION</a></span> macro uses BOOST_THROW_EXCEPTION_CURRENT_FUNCTION to record the name of the current function in the exception object. Unless overridden by the user, BOOST_THROW_EXCEPTION_CURRENT_FUNCTION expands to BOOST_CURRENT_FUNCTION.</p>
|
||||
<p>In addition, the following user-defined macros are recognized:</p>
|
||||
<p><b>BOOST_EXCEPTION_DISABLE</b> (user-defined)</p>
|
||||
<p>By default, <span class="RenoLink"><a href="enable_current_exception.html">enable_current_exception</a></span> and <span class="RenoLink"><a href="enable_error_info.html">enable_error_info</a></span> are integrated directly in the <span class="RenoLink"><a href="throw_exception.html">throw_exception</a></span> function. Defining BOOST_EXCEPTION_DISABLE disables this integration.</p>
|
||||
</div><div class="RenoAutoDIV"><div class="RenoHR"><hr/></div>
|
||||
See also: <span class="RenoPageList"><a href="BOOST_THROW_EXCEPTION.html">BOOST_THROW_EXCEPTION</a> | <a href="boost-exception.html">Boost Exception</a> | <a href="boost_exception_all_hpp.html">boost/exception/all.hpp</a> | <a href="frequently_asked_questions.html">Frequently Asked Questions</a> | <a href="get_error_info.html">get_error_info</a></span>
|
||||
</div>
|
||||
|
||||
@@ -25,7 +25,7 @@
|
||||
<p>The cost is that boost::<span class="RenoLink"><a href="exception.html">exception</a></span> is added as a base of the exception emitted by boost::<span class="RenoLink"><a href="throw_exception.html">throw_exception</a></span> (unless the passed type already derives from boost::<span class="RenoLink"><a href="exception.html">exception</a></span>.)</p>
|
||||
<p>Calling boost::<span class="RenoLink"><a href="throw_exception.html">throw_exception</a></span> does not cause dynamic memory allocations.</p>
|
||||
<h3>What is the cost of BOOST_THROW_EXCEPTION?</h3>
|
||||
<p>In addition to calling boost::<span class="RenoLink"><a href="throw_exception.html">throw_exception</a></span>, <span class="RenoLink"><a href="BOOST_THROW_EXCEPTION.html">BOOST_THROW_EXCEPTION</a></span> invokes __FILE__, __LINE__ and the <span class="RenoLink"><a href="configuration_macros.html">BOOST_THROW_EXCEPTION_CURRENT_FUNCTION</a></span> macros. The space required to store the information is already included in sizeof(boost::<span class="RenoLink"><a href="exception.html">exception</a></span>).</p>
|
||||
<p>In addition to calling boost::<span class="RenoLink"><a href="throw_exception.html">throw_exception</a></span>, <span class="RenoLink"><a href="BOOST_THROW_EXCEPTION.html">BOOST_THROW_EXCEPTION</a></span> invokes __FILE__ and __LINE__ macros. The space required to store the information is already included in sizeof(boost::<span class="RenoLink"><a href="exception.html">exception</a></span>).</p>
|
||||
<p>Calling <span class="RenoLink"><a href="BOOST_THROW_EXCEPTION.html">BOOST_THROW_EXCEPTION</a></span> does not cause dynamic memory allocations.</p>
|
||||
<h3>Should I use boost::throw_exception or BOOST_THROW_EXCEPTION or just throw?</h3>
|
||||
<p>The benefit of calling boost::<span class="RenoLink"><a href="throw_exception.html">throw_exception</a></span> instead of using throw directly is that it ensures that the emitted exception derives from boost::<span class="RenoLink"><a href="exception.html">exception</a></span> and that it is compatible with boost::<span class="RenoLink"><a href="current_exception.html">current_exception</a></span>.</p>
|
||||
|
||||
@@ -29,15 +29,15 @@ boost
|
||||
<span class="RenoLink"><a href="exception.html">exception</a></span>
|
||||
{
|
||||
protected:
|
||||
|
||||
|
||||
<span class="RenoIncludeSPAN"> <span class="RenoLink"><a href="exception_constructors.html">exception</a></span>();
|
||||
<span class="RenoLink"><a href="exception_constructors.html">exception</a></span>( <span class="RenoLink"><a href="exception.html">exception</a></span> const & x );</span>
|
||||
<span class="RenoIncludeSPAN"> <span class="RenoLink"><a href="exception_destructor.html">~exception</a></span>();</span>
|
||||
};</span>
|
||||
|
||||
<span class="RenoLink"><a href="exception_constructors.html">exception</a></span>( <span class="RenoLink"><a href="exception.html">exception</a></span> const & x );</span>
|
||||
<span class="RenoIncludeSPAN"> <span class="RenoLink"><a href="exception_destructor.html">~exception</a></span>();</span>
|
||||
};</span>
|
||||
|
||||
<span class="RenoIncludeSPAN">template <class Tag,class T>
|
||||
class <span class="RenoLink"><a href="error_info.html">error_info</a></span>;</span>
|
||||
|
||||
class <span class="RenoLink"><a href="error_info.html">error_info</a></span>;</span>
|
||||
|
||||
typedef <span class="RenoLink"><a href="error_info.html">error_info</a></span><struct throw_function_,char const *> throw_function;
|
||||
typedef <span class="RenoLink"><a href="error_info.html">error_info</a></span><struct throw_file_,char const *> throw_file;
|
||||
typedef <span class="RenoLink"><a href="error_info.html">error_info</a></span><struct throw_line_,int> throw_line;</span>
|
||||
@@ -60,14 +60,14 @@ boost
|
||||
<span class="RenoLink"><a href="error_info.html">error_info</a></span>
|
||||
{
|
||||
public:
|
||||
|
||||
<span class="RenoIncludeSPAN"> typedef T <span class="RenoLink"><a href="error_info_value_type.html">value_type</a></span>;</span>
|
||||
|
||||
<span class="RenoIncludeSPAN"> <span class="RenoLink"><a href="error_info_error_info.html">error_info</a></span>( <span class="RenoLink"><a href="error_info_value_type.html">value_type</a></span> const & v );</span>
|
||||
|
||||
<span class="RenoIncludeSPAN"> typedef T <span class="RenoLink"><a href="error_info_value_type.html">value_type</a></span>;</span>
|
||||
|
||||
<span class="RenoIncludeSPAN"> <span class="RenoLink"><a href="error_info_error_info.html">error_info</a></span>( <span class="RenoLink"><a href="error_info_value_type.html">value_type</a></span> const & v );</span>
|
||||
<span class="RenoIncludeSPAN"> <span class="RenoLink"><a href="error_info_value_type.html">value_type</a></span> const & <span class="RenoLink"><a href="error_info_value.html">value</a></span>() const;
|
||||
<span class="RenoLink"><a href="error_info_value_type.html">value_type</a></span> & <span class="RenoLink"><a href="error_info_value.html">value</a></span>();</span>
|
||||
};</span>
|
||||
|
||||
<span class="RenoLink"><a href="error_info_value_type.html">value_type</a></span> & <span class="RenoLink"><a href="error_info_value.html">value</a></span>();</span>
|
||||
};</span>
|
||||
|
||||
<span class="RenoIncludeSPAN">template <class E, class Tag, class T>
|
||||
E const & <span class="RenoLink"><a href="exception_operator_shl.html">operator<<</a></span>( E const & x, <span class="RenoLink"><a href="error_info.html">error_info</a></span><Tag,T> const & v );</span></span>
|
||||
}</span></pre>
|
||||
@@ -104,11 +104,11 @@ boost
|
||||
|
||||
<span class="RenoIncludeSPAN"> <span class="RenoIncludeSPAN">template <class E>
|
||||
std::string <span class="RenoLink"><a href="diagnostic_information.html">diagnostic_information</a></span>( E const & e, bool verbose=true );
|
||||
|
||||
std::string <span class="RenoLink"><a href="diagnostic_information.html">diagnostic_information</a></span>( <span class="RenoLink"><a href="exception_ptr.html">exception_ptr</a></span> const & p, bool verbose=true );</span>
|
||||
|
||||
<span class="RenoIncludeSPAN">char const * <span class="RenoLink"><a href="diagnostic_information_what.html">diagnostic_information_what</a></span>( boost::<span class="RenoLink"><a href="exception.html">exception</a></span> const & e, bool verbose=true ) throw();</span>
|
||||
|
||||
|
||||
std::string <span class="RenoLink"><a href="diagnostic_information.html">diagnostic_information</a></span>( <span class="RenoLink"><a href="exception_ptr.html">exception_ptr</a></span> const & p, bool verbose=true );</span>
|
||||
|
||||
<span class="RenoIncludeSPAN">char const * <span class="RenoLink"><a href="diagnostic_information_what.html">diagnostic_information_what</a></span>( boost::<span class="RenoLink"><a href="exception.html">exception</a></span> const & e, bool verbose=true ) throw();</span>
|
||||
|
||||
<span class="RenoIncludeSPAN">std::string <span class="RenoLink"><a href="current_exception_diagnostic_information.html">current_exception_diagnostic_information</a></span>();</span></span>
|
||||
}</span></pre>
|
||||
<p><span class="RenoEscape">#<!--<wiki>`#</wiki>--></span>include <<span class="RenoLink"><a href="boost_exception_current_exception_cast_hpp.html">boost/exception/current_exception_cast.hpp</a></span>></p>
|
||||
@@ -130,17 +130,17 @@ boost
|
||||
public boost::<span class="RenoLink"><a href="exception.html">exception</a></span>
|
||||
{
|
||||
---unspecified---
|
||||
};</span>
|
||||
|
||||
<span class="RenoIncludeSPAN">typedef <span class="RenoLink"><a href="error_info.html">error_info</a></span><struct tag_original_exception_type,std::type_info const *> <span class="RenoLink"><a href="original_exception_type.html">original_exception_type</a></span>;</span>
|
||||
|
||||
<span class="RenoIncludeSPAN">typedef ---unspecified--- <span class="RenoLink"><a href="exception_ptr.html">exception_ptr</a></span>;</span>
|
||||
|
||||
};</span>
|
||||
|
||||
<span class="RenoIncludeSPAN">typedef <span class="RenoLink"><a href="error_info.html">error_info</a></span><struct tag_original_exception_type,std::type_info const *> <span class="RenoLink"><a href="original_exception_type.html">original_exception_type</a></span>;</span>
|
||||
|
||||
<span class="RenoIncludeSPAN">typedef ---unspecified--- <span class="RenoLink"><a href="exception_ptr.html">exception_ptr</a></span>;</span>
|
||||
|
||||
<span class="RenoIncludeSPAN">template <class T>
|
||||
<span class="RenoLink"><a href="exception_ptr.html">exception_ptr</a></span> <span class="RenoLink"><a href="copy_exception.html">copy_exception</a></span>( T const & e );</span>
|
||||
|
||||
<span class="RenoIncludeSPAN"><span class="RenoLink"><a href="exception_ptr.html">exception_ptr</a></span> <span class="RenoLink"><a href="current_exception.html">current_exception</a></span>();</span>
|
||||
|
||||
<span class="RenoLink"><a href="exception_ptr.html">exception_ptr</a></span> <span class="RenoLink"><a href="copy_exception.html">copy_exception</a></span>( T const & e );</span>
|
||||
|
||||
<span class="RenoIncludeSPAN"><span class="RenoLink"><a href="exception_ptr.html">exception_ptr</a></span> <span class="RenoLink"><a href="current_exception.html">current_exception</a></span>();</span>
|
||||
|
||||
<span class="RenoIncludeSPAN">void <span class="RenoLink"><a href="rethrow_exception.html">rethrow_exception</a></span>( <span class="RenoLink"><a href="exception_ptr.html">exception_ptr</a></span> const & ep );</span></span>
|
||||
}</span></pre>
|
||||
<p><span class="RenoEscape">#<!--<wiki>`#</wiki>--></span>include <<span class="RenoLink"><a href="boost_exception_enable_current_exception_hpp.html">boost/exception/enable_current_exception.hpp</a></span>></p>
|
||||
@@ -158,7 +158,6 @@ boost
|
||||
#include <boost/current_function.hpp>
|
||||
#define <span class="RenoLink"><a href="BOOST_THROW_EXCEPTION.html">BOOST_THROW_EXCEPTION</a></span>(x)\
|
||||
::boost::<span class="RenoLink"><a href="throw_exception.html">throw_exception</a></span>( ::boost::<span class="RenoLink"><a href="enable_error_info.html">enable_error_info</a></span>(x) <<\
|
||||
::boost::<span class="RenoLink"><a href="boost_exception_exception_hpp.html">throw_function</a></span>(<span class="RenoLink"><a href="configuration_macros.html">BOOST_THROW_EXCEPTION_CURRENT_FUNCTION</a></span>) <<\
|
||||
::boost::<span class="RenoLink"><a href="boost_exception_exception_hpp.html">throw_file</a></span>(__FILE__) <<\
|
||||
::boost::<span class="RenoLink"><a href="boost_exception_exception_hpp.html">throw_line</a></span>((int)__LINE__) )
|
||||
#else
|
||||
|
||||
@@ -21,28 +21,7 @@
|
||||
<!-- file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -->
|
||||
<div class="RenoIncludeDIV"><div class="RenoAutoDIV"><h3>throw_exception</h3>
|
||||
</div>
|
||||
<div class="RenoIncludeDIV"><p><span class="RenoEscape">#<!--<wiki>`#</wiki>--></span>include <<span class="RenoLink"><a href="boost_throw_exception_hpp.html">boost/throw_exception.hpp</a></span>></p>
|
||||
<pre>namespace
|
||||
boost
|
||||
{
|
||||
<span class="RenoIncludeSPAN">#ifdef BOOST_NO_EXCEPTIONS
|
||||
void <span class="RenoLink">throw_exception</span>( std::exception const & e ); // user defined
|
||||
#else
|
||||
template <class E>
|
||||
void <span class="RenoLink">throw_exception</span>( E const & e );
|
||||
#endif</span>
|
||||
}</pre>
|
||||
</div><h4>Effects:</h4>
|
||||
<div><ul><li> If BOOST_NO_EXCEPTIONS is not defined, boost::<span class="RenoLink">throw_exception</span>(e) throws an exception of unspecified type that derives publicly from E and from boost::<span class="RenoLink"><a href="exception.html">exception</a></span>.</li>
|
||||
<li> If BOOST_NO_EXCEPTIONS is defined, the function is left undefined, and the user is expected to supply an appropriate definition. Callers of <span class="RenoLink">throw_exception</span> are allowed to assume that the function never returns; therefore, if the user-defined <span class="RenoLink">throw_exception</span> returns, the behavior is undefined.</li>
|
||||
</ul></div>
|
||||
<h4>Requirements:</h4>
|
||||
<p>E must derive publicly from std::exception. E may or may not derive from boost::<span class="RenoLink"><a href="exception.html">exception</a></span>.</p>
|
||||
<h4>Notes:</h4>
|
||||
<div><ul><li> The emitted exception can be intercepted as E &, std::exception &, or boost::exception &.</li>
|
||||
<li> The emitted exception supports boost::<span class="RenoLink"><a href="exception_ptr.html">exception_ptr</a></span>.</li>
|
||||
<li> If BOOST_EXCEPTION_DISABLE is defined and BOOST_NO_EXCEPTIONS is not defined, boost::<span class="RenoLink">throw_exception</span>(e) equivalent to throw e.</li>
|
||||
</ul></div>
|
||||
<p>Please see <a href="https://www.boost.org/doc/libs/release/libs/throw_exception/doc/html/throw_exception.html">Boost.ThrowException</a>.</p>
|
||||
</div><div class="RenoAutoDIV"><div class="RenoHR"><hr/></div>
|
||||
See also: <span class="RenoPageList"><a href="BOOST_THROW_EXCEPTION.html">BOOST_THROW_EXCEPTION</a> | <a href="boost-exception.html">Boost Exception</a> | <a href="boost_throw_exception_hpp.html">boost/throw_exception.hpp</a> | <a href="configuration_macros.html">Configuration Macros</a> | <a href="enable_current_exception.html">enable_current_exception</a> | <a href="frequently_asked_questions.html">Frequently Asked Questions</a> | <a href="tutorial_exception_ptr.html">Transporting of Exceptions Between Threads</a></span>
|
||||
</div>
|
||||
|
||||
@@ -5,11 +5,13 @@
|
||||
# Distributed under the Boost Software License, Version 1.0. (See accompanying
|
||||
# file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
||||
|
||||
project : requirements <library>/boost/exception//boost_exception ;
|
||||
|
||||
exe example_io : example_io.cpp ;
|
||||
obj error_info_1 : error_info_1.cpp ;
|
||||
obj error_info_2 : error_info_2.cpp ;
|
||||
obj cloning_1 : cloning_1.cpp ;
|
||||
obj cloning_2 : cloning_2.cpp : <threading>multi ;
|
||||
obj cloning_2 : cloning_2.cpp /boost/thread//boost_thread : <threading>multi ;
|
||||
obj info_tuple : info_tuple.cpp ;
|
||||
obj enable_error_info : enable_error_info.cpp ;
|
||||
obj logging : logging.cpp ;
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
#define BOOST_EXCEPTION_7E83C166200811DE885E826156D89593
|
||||
|
||||
#ifndef BOOST_EXCEPTION_ENABLE_WARNINGS
|
||||
#if __GNUC__*100+__GNUC_MINOR__>301
|
||||
#if defined(__GNUC__) && __GNUC__*100+__GNUC_MINOR__>301
|
||||
#pragma GCC system_header
|
||||
#endif
|
||||
#ifdef __clang__
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
#define BOOST_EXCEPTION_81522C0EB56511DFAB613DB0DFD72085
|
||||
|
||||
#ifndef BOOST_EXCEPTION_ENABLE_WARNINGS
|
||||
#if __GNUC__*100+__GNUC_MINOR__>301
|
||||
#if defined(__GNUC__) && __GNUC__*100+__GNUC_MINOR__>301
|
||||
#pragma GCC system_header
|
||||
#endif
|
||||
#ifdef __clang__
|
||||
|
||||
@@ -13,8 +13,10 @@
|
||||
#include <utility>
|
||||
#include <string>
|
||||
|
||||
namespace boost { namespace exception_detail { class writer; } }
|
||||
|
||||
#ifndef BOOST_EXCEPTION_ENABLE_WARNINGS
|
||||
#if __GNUC__*100+__GNUC_MINOR__>301
|
||||
#if defined(__GNUC__) && __GNUC__*100+__GNUC_MINOR__>301
|
||||
#pragma GCC system_header
|
||||
#endif
|
||||
#ifdef __clang__
|
||||
@@ -38,6 +40,7 @@ boost
|
||||
|
||||
virtual std::string name_value_string() const = 0;
|
||||
virtual error_info_base * clone() const = 0;
|
||||
virtual void write_to(writer &) const = 0;
|
||||
|
||||
virtual
|
||||
~error_info_base() BOOST_NOEXCEPT_OR_NOTHROW
|
||||
@@ -97,6 +100,7 @@ boost
|
||||
error_info & operator=( error_info && x );
|
||||
#endif
|
||||
std::string name_value_string() const;
|
||||
void write_to(exception_detail::writer &) const;
|
||||
value_type v_;
|
||||
};
|
||||
}
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
#ifndef BOOST_EXCEPTION_618474C2DE1511DEB74A388C56D89593
|
||||
#define BOOST_EXCEPTION_618474C2DE1511DEB74A388C56D89593
|
||||
|
||||
#include <boost/config.hpp>
|
||||
#include <boost/exception/detail/requires_cxx11.hpp>
|
||||
#include <boost/exception/exception.hpp>
|
||||
#include <boost/exception/info.hpp>
|
||||
#include <boost/exception/diagnostic_information.hpp>
|
||||
@@ -26,7 +26,7 @@
|
||||
#include <stdlib.h>
|
||||
|
||||
#ifndef BOOST_EXCEPTION_ENABLE_WARNINGS
|
||||
#if __GNUC__*100+__GNUC_MINOR__>301
|
||||
#if defined(__GNUC__) && __GNUC__*100+__GNUC_MINOR__>301
|
||||
#pragma GCC system_header
|
||||
#endif
|
||||
#ifdef __clang__
|
||||
@@ -40,6 +40,36 @@
|
||||
namespace
|
||||
boost
|
||||
{
|
||||
namespace
|
||||
exception_detail
|
||||
{
|
||||
#ifndef BOOST_NO_CXX11_HDR_EXCEPTION
|
||||
struct
|
||||
std_exception_ptr_wrapper:
|
||||
std::exception
|
||||
{
|
||||
std::exception_ptr p;
|
||||
explicit std_exception_ptr_wrapper( std::exception_ptr const & ptr ) BOOST_NOEXCEPT:
|
||||
p(ptr)
|
||||
{
|
||||
}
|
||||
#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
|
||||
explicit std_exception_ptr_wrapper( std::exception_ptr && ptr ) BOOST_NOEXCEPT:
|
||||
p(static_cast<std::exception_ptr &&>(ptr))
|
||||
{
|
||||
}
|
||||
#endif
|
||||
};
|
||||
shared_ptr<exception_detail::clone_base const>
|
||||
inline
|
||||
wrap_exception_ptr( std::exception_ptr const & e )
|
||||
{
|
||||
exception_detail::clone_base const & base = boost::enable_current_exception(std_exception_ptr_wrapper(e));
|
||||
return shared_ptr<exception_detail::clone_base const>(base.clone());
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
class exception_ptr;
|
||||
namespace exception_detail { void rethrow_exception_( exception_ptr const & ); }
|
||||
|
||||
@@ -54,6 +84,12 @@ boost
|
||||
exception_ptr()
|
||||
{
|
||||
}
|
||||
#ifndef BOOST_NO_CXX11_HDR_EXCEPTION
|
||||
exception_ptr( std::exception_ptr const & e ):
|
||||
ptr_(exception_detail::wrap_exception_ptr(e))
|
||||
{
|
||||
}
|
||||
#endif
|
||||
explicit
|
||||
exception_ptr( impl const & ptr ):
|
||||
ptr_(ptr)
|
||||
@@ -75,14 +111,24 @@ boost
|
||||
}
|
||||
};
|
||||
|
||||
namespace
|
||||
exception_detail
|
||||
{
|
||||
template <class E>
|
||||
inline
|
||||
exception_ptr
|
||||
copy_exception_impl( E const & e )
|
||||
{
|
||||
return exception_ptr(boost::make_shared<E>(e));
|
||||
}
|
||||
}
|
||||
|
||||
template <class E>
|
||||
inline
|
||||
exception_ptr
|
||||
copy_exception( E const & e )
|
||||
{
|
||||
E cp = e;
|
||||
exception_detail::copy_boost_exception(&cp, &e);
|
||||
return exception_ptr(boost::make_shared<wrapexcept<E> >(cp));
|
||||
return exception_detail::copy_exception_impl(boost::enable_current_exception(e));
|
||||
}
|
||||
|
||||
template <class T>
|
||||
@@ -307,24 +353,6 @@ boost
|
||||
return boost::copy_exception(unknown_exception(e));
|
||||
}
|
||||
|
||||
#ifndef BOOST_NO_CXX11_HDR_EXCEPTION
|
||||
struct
|
||||
std_exception_ptr_wrapper
|
||||
{
|
||||
std::exception_ptr p;
|
||||
explicit std_exception_ptr_wrapper( std::exception_ptr const & ptr ) BOOST_NOEXCEPT:
|
||||
p(ptr)
|
||||
{
|
||||
}
|
||||
#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
|
||||
explicit std_exception_ptr_wrapper( std::exception_ptr && ptr ) BOOST_NOEXCEPT:
|
||||
p(static_cast<std::exception_ptr &&>(ptr))
|
||||
{
|
||||
}
|
||||
#endif
|
||||
};
|
||||
#endif
|
||||
|
||||
inline
|
||||
exception_ptr
|
||||
current_exception_impl()
|
||||
@@ -366,6 +394,9 @@ boost
|
||||
{
|
||||
return exception_ptr(shared_ptr<exception_detail::clone_base const>(e.clone()));
|
||||
}
|
||||
|
||||
#ifdef BOOST_NO_CXX11_HDR_EXCEPTION
|
||||
|
||||
catch(
|
||||
std::domain_error & e )
|
||||
{
|
||||
@@ -438,29 +469,26 @@ boost
|
||||
{
|
||||
return exception_detail::current_exception_std_exception(e);
|
||||
}
|
||||
#ifdef BOOST_NO_CXX11_HDR_EXCEPTION
|
||||
// this case can be handled losslesly with std::current_exception() (see below)
|
||||
catch(
|
||||
std::exception & e )
|
||||
{
|
||||
return exception_detail::current_exception_unknown_std_exception(e);
|
||||
}
|
||||
#endif
|
||||
catch(
|
||||
boost::exception & e )
|
||||
{
|
||||
return exception_detail::current_exception_unknown_boost_exception(e);
|
||||
}
|
||||
|
||||
#endif // #ifdef BOOST_NO_CXX11_HDR_EXCEPTION
|
||||
|
||||
catch(
|
||||
... )
|
||||
{
|
||||
#ifndef BOOST_NO_CXX11_HDR_EXCEPTION
|
||||
try
|
||||
{
|
||||
// wrap the std::exception_ptr in a clone-enabled Boost.Exception object
|
||||
exception_detail::clone_base const & base =
|
||||
boost::enable_current_exception(std_exception_ptr_wrapper(std::current_exception()));
|
||||
return exception_ptr(shared_ptr<exception_detail::clone_base const>(base.clone()));
|
||||
return exception_ptr(std::current_exception());
|
||||
}
|
||||
catch(
|
||||
...)
|
||||
|
||||
@@ -9,7 +9,7 @@
|
||||
#include <ostream>
|
||||
|
||||
#ifndef BOOST_EXCEPTION_ENABLE_WARNINGS
|
||||
#if __GNUC__*100+__GNUC_MINOR__>301
|
||||
#if defined(__GNUC__) && __GNUC__*100+__GNUC_MINOR__>301
|
||||
#pragma GCC system_header
|
||||
#endif
|
||||
#ifdef __clang__
|
||||
|
||||
@@ -14,7 +14,7 @@
|
||||
#include <cstdlib>
|
||||
|
||||
#ifndef BOOST_EXCEPTION_ENABLE_WARNINGS
|
||||
#if __GNUC__*100+__GNUC_MINOR__>301
|
||||
#if defined(__GNUC__) && __GNUC__*100+__GNUC_MINOR__>301
|
||||
#pragma GCC system_header
|
||||
#endif
|
||||
#ifdef __clang__
|
||||
|
||||
24
include/boost/exception/detail/requires_cxx11.hpp
Normal file
24
include/boost/exception/detail/requires_cxx11.hpp
Normal file
@@ -0,0 +1,24 @@
|
||||
#ifndef BOOST_EXCEPTION_DETAIL_REQUIRES_CXX11_HPP_INCLUDED
|
||||
#define BOOST_EXCEPTION_DETAIL_REQUIRES_CXX11_HPP_INCLUDED
|
||||
|
||||
// Copyright 2023 Peter Dimov
|
||||
// Copyright 2024 Emil Dotchevski
|
||||
// Distributed under the Boost Software License, Version 1.0.
|
||||
// https://www.boost.org/LICENSE_1_0.txt
|
||||
|
||||
#include <boost/config.hpp>
|
||||
#include <boost/config/pragma_message.hpp>
|
||||
|
||||
#if defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES) || \
|
||||
defined(BOOST_NO_CXX11_RVALUE_REFERENCES) || \
|
||||
defined(BOOST_NO_CXX11_DECLTYPE) || \
|
||||
defined(BOOST_NO_CXX11_CONSTEXPR) || \
|
||||
defined(BOOST_NO_CXX11_NOEXCEPT) || \
|
||||
defined(BOOST_NO_CXX11_NULLPTR) || \
|
||||
defined(BOOST_NO_CXX11_SMART_PTR)
|
||||
|
||||
BOOST_PRAGMA_MESSAGE("C++03 support was deprecated in Boost.Exception 1.85 and will be removed in Boost.Exception 1.87.")
|
||||
|
||||
#endif
|
||||
|
||||
#endif
|
||||
@@ -11,10 +11,20 @@
|
||||
#include <boost/core/demangle.hpp>
|
||||
#include <boost/current_function.hpp>
|
||||
#include <string>
|
||||
#include <string.h>
|
||||
#include <ostream>
|
||||
#include <cstring>
|
||||
#include <cstddef>
|
||||
|
||||
#ifndef BOOST_EXCEPTION_PRETTY_FUNCTION
|
||||
# if defined(_MSC_VER) && !defined(__clang__) && !defined(__GNUC__)
|
||||
# define BOOST_EXCEPTION_PRETTY_FUNCTION __FUNCSIG__
|
||||
# else
|
||||
# define BOOST_EXCEPTION_PRETTY_FUNCTION __PRETTY_FUNCTION__
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#ifndef BOOST_EXCEPTION_ENABLE_WARNINGS
|
||||
#if __GNUC__*100+__GNUC_MINOR__>301
|
||||
#if defined(__GNUC__) && __GNUC__*100+__GNUC_MINOR__>301
|
||||
#pragma GCC system_header
|
||||
#endif
|
||||
#ifdef __clang__
|
||||
@@ -73,6 +83,206 @@ boost
|
||||
return a.type_!=b.type_ && strcmp(a.type_->name(), b.type_->name()) < 0;
|
||||
}
|
||||
};
|
||||
|
||||
template <int S1, int S2, int I, bool = (S1 >= S2)>
|
||||
struct
|
||||
cpp11_prefix
|
||||
{
|
||||
BOOST_FORCEINLINE static constexpr
|
||||
bool
|
||||
check(char const (&)[S1], char const (&)[S2]) noexcept
|
||||
{
|
||||
return false;
|
||||
}
|
||||
};
|
||||
|
||||
template <int S1, int S2, int I>
|
||||
struct
|
||||
cpp11_prefix<S1, S2, I, true>
|
||||
{
|
||||
BOOST_FORCEINLINE static constexpr
|
||||
bool
|
||||
check(char const (&str)[S1], char const (&prefix)[S2]) noexcept
|
||||
{
|
||||
return str[I] == prefix[I] && cpp11_prefix<S1, S2, I - 1>::check(str, prefix);
|
||||
}
|
||||
};
|
||||
|
||||
template <int S1, int S2>
|
||||
struct
|
||||
cpp11_prefix<S1, S2, 0, true>
|
||||
{
|
||||
BOOST_FORCEINLINE static constexpr
|
||||
bool
|
||||
check(char const (&str)[S1], char const (&prefix)[S2]) noexcept
|
||||
{
|
||||
return str[0] == prefix[0];
|
||||
}
|
||||
};
|
||||
|
||||
template <int S1, int S2>
|
||||
BOOST_FORCEINLINE constexpr
|
||||
int
|
||||
check_prefix(char const (&str)[S1], char const (&prefix)[S2]) noexcept
|
||||
{
|
||||
return cpp11_prefix<S1, S2, S2 - 2>::check(str, prefix) ? S2 - 1 : 0;
|
||||
}
|
||||
|
||||
template <int S1, int S2, int I1, int I2, bool = (S1 >= S2)>
|
||||
struct
|
||||
cpp11_suffix
|
||||
{
|
||||
BOOST_FORCEINLINE static constexpr
|
||||
bool
|
||||
check(char const (&)[S1], char const (&)[S2]) noexcept
|
||||
{
|
||||
return false;
|
||||
}
|
||||
};
|
||||
|
||||
template <int S1, int S2, int I1, int I2>
|
||||
struct
|
||||
cpp11_suffix<S1, S2, I1, I2, true>
|
||||
{
|
||||
BOOST_FORCEINLINE static constexpr
|
||||
bool
|
||||
check(char const (&str)[S1], char const (&suffix)[S2]) noexcept
|
||||
{
|
||||
return str[I1] == suffix[I2] && cpp11_suffix<S1, S2, I1 - 1, I2 - 1>::check(str, suffix);
|
||||
}
|
||||
};
|
||||
|
||||
template <int S1, int S2, int I1>
|
||||
struct
|
||||
cpp11_suffix<S1, S2, I1, 0, true>
|
||||
{
|
||||
BOOST_FORCEINLINE static constexpr
|
||||
bool
|
||||
check(char const (&str)[S1], char const (&suffix)[S2]) noexcept
|
||||
{
|
||||
return str[I1] == suffix[0];
|
||||
}
|
||||
};
|
||||
|
||||
template <int S1, int S2>
|
||||
BOOST_FORCEINLINE constexpr
|
||||
int
|
||||
check_suffix(char const (&str)[S1], char const (&suffix)[S2]) noexcept
|
||||
{
|
||||
return cpp11_suffix<S1, S2, S1 - 2, S2 - 2>::check(str, suffix) ? S1 - S2 : 0;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
namespace
|
||||
n
|
||||
{
|
||||
struct
|
||||
r
|
||||
{
|
||||
char const * name_not_zero_terminated_at_length;
|
||||
std::size_t length;
|
||||
};
|
||||
|
||||
#ifdef _MSC_VER
|
||||
# define BOOST_EXCEPTION_CDECL __cdecl
|
||||
#else
|
||||
# define BOOST_EXCEPTION_CDECL
|
||||
#endif
|
||||
|
||||
template <class T>
|
||||
BOOST_FORCEINLINE
|
||||
r
|
||||
BOOST_EXCEPTION_CDECL
|
||||
p()
|
||||
{
|
||||
#define BOOST_EXCEPTION_P(P) (sizeof(char[1 + exception_detail::check_prefix(BOOST_EXCEPTION_PRETTY_FUNCTION, P)]) - 1)
|
||||
// clang style:
|
||||
std::size_t const p01 = BOOST_EXCEPTION_P("r boost::n::p() [T = ");
|
||||
std::size_t const p02 = BOOST_EXCEPTION_P("r __cdecl boost::n::p(void) [T = ");
|
||||
// old clang style:
|
||||
std::size_t const p03 = BOOST_EXCEPTION_P("boost::n::r boost::n::p() [T = ");
|
||||
std::size_t const p04 = BOOST_EXCEPTION_P("boost::n::r __cdecl boost::n::p(void) [T = ");
|
||||
// gcc style:
|
||||
std::size_t const p05 = BOOST_EXCEPTION_P("boost::n::r boost::n::p() [with T = ");
|
||||
std::size_t const p06 = BOOST_EXCEPTION_P("boost::n::r __cdecl boost::n::p() [with T = ");
|
||||
// msvc style, struct:
|
||||
std::size_t const p07 = BOOST_EXCEPTION_P("struct boost::n::r __cdecl boost::n::p<struct ");
|
||||
// msvc style, class:
|
||||
std::size_t const p08 = BOOST_EXCEPTION_P("struct boost::n::r __cdecl boost::n::p<class ");
|
||||
// msvc style, enum:
|
||||
std::size_t const p09 = BOOST_EXCEPTION_P("struct boost::n::r __cdecl boost::n::p<enum ");
|
||||
// msvc style, built-in type:
|
||||
std::size_t const p10 = BOOST_EXCEPTION_P("struct boost::n::r __cdecl boost::n::p<");
|
||||
#undef BOOST_EXCEPTION_P
|
||||
|
||||
#define BOOST_EXCEPTION_S(S) (sizeof(char[1 + exception_detail::check_suffix(BOOST_EXCEPTION_PRETTY_FUNCTION, S)]) - 1)
|
||||
// clang/gcc style:
|
||||
std::size_t const s01 = BOOST_EXCEPTION_S("]");
|
||||
// msvc style:
|
||||
std::size_t const s02 = BOOST_EXCEPTION_S(">(void)");
|
||||
#undef BOOST_EXCEPTION_S
|
||||
|
||||
char static_assert_unrecognized_pretty_function_format_please_file_github_issue[sizeof(
|
||||
char[
|
||||
(s01 && (1 == (!!p01 + !!p02 + !!p03 + !!p04 + !!p05 + !!p06)))
|
||||
||
|
||||
(s02 && (1 == (!!p07 + !!p08 + !!p09)))
|
||||
||
|
||||
(s02 && !!p10)
|
||||
]
|
||||
) * 2 - 1];
|
||||
(void) static_assert_unrecognized_pretty_function_format_please_file_github_issue;
|
||||
|
||||
if( std::size_t const p = sizeof(char[1 + !!s01 * (p01 + p02 + p03 + p04 + p05 + p06)]) - 1 )
|
||||
return { BOOST_EXCEPTION_PRETTY_FUNCTION + p, s01 - p };
|
||||
|
||||
if( std::size_t const p = sizeof(char[1 + !!s02 * (p07 + p08 + p09)]) - 1 )
|
||||
return { BOOST_EXCEPTION_PRETTY_FUNCTION + p, s02 - p };
|
||||
|
||||
std::size_t const p = sizeof(char[1 + !!s02 * p10]) - 1;
|
||||
return { BOOST_EXCEPTION_PRETTY_FUNCTION + p, s02 - p };
|
||||
}
|
||||
|
||||
#undef BOOST_EXCEPTION_CDECL
|
||||
}
|
||||
|
||||
namespace
|
||||
exception_detail
|
||||
{
|
||||
struct
|
||||
pretty_type_name
|
||||
{
|
||||
char const * name_not_zero_terminated_at_length;
|
||||
std::size_t length;
|
||||
|
||||
template <class CharT, class Traits>
|
||||
friend
|
||||
std::basic_ostream<CharT, Traits> &
|
||||
operator<<(std::basic_ostream<CharT, Traits> & os, pretty_type_name const & x)
|
||||
{
|
||||
return os.write(x.name_not_zero_terminated_at_length, x.length);
|
||||
}
|
||||
|
||||
template <std::size_t S>
|
||||
friend
|
||||
char *
|
||||
to_zstr(char (&zstr)[S], pretty_type_name const & x) noexcept
|
||||
{
|
||||
std::size_t n = x.length < S - 1 ? x.length : S - 1;
|
||||
std::memcpy(zstr, x.name_not_zero_terminated_at_length, n);
|
||||
zstr[n] = 0;
|
||||
return zstr;
|
||||
}
|
||||
};
|
||||
|
||||
template <class T>
|
||||
pretty_type_name
|
||||
get_pretty_tag_type_name()
|
||||
{
|
||||
n::r parsed = n::p<T>();
|
||||
return { parsed.name_not_zero_terminated_at_length, parsed.length };
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
114
include/boost/exception/detail/writer.hpp
Normal file
114
include/boost/exception/detail/writer.hpp
Normal file
@@ -0,0 +1,114 @@
|
||||
//Copyright (c) 2006-2026 Emil Dotchevski and Reverge Studios, Inc.
|
||||
|
||||
//Distributed under the Boost Software License, Version 1.0. (See accompanying
|
||||
//file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
||||
|
||||
#ifndef BOOST_EXCEPTION_DETAIL_WRITER_HPP_INCLUDED
|
||||
#define BOOST_EXCEPTION_DETAIL_WRITER_HPP_INCLUDED
|
||||
|
||||
#include <boost/exception/detail/type_info.hpp>
|
||||
#include <type_traits>
|
||||
#include <utility>
|
||||
|
||||
namespace
|
||||
boost
|
||||
{
|
||||
template <class Tag, class T> class error_info;
|
||||
|
||||
namespace
|
||||
exception_serialization
|
||||
{
|
||||
struct writer_adl {};
|
||||
}
|
||||
|
||||
namespace
|
||||
exception_detail
|
||||
{
|
||||
template <class T>
|
||||
struct first_arg;
|
||||
|
||||
template <class C, class R, class A1, class... A>
|
||||
struct
|
||||
first_arg<R(C::*)(A1, A...)>
|
||||
{
|
||||
using type = A1;
|
||||
};
|
||||
|
||||
template <class C, class R, class A1, class... A>
|
||||
struct
|
||||
first_arg<R(C::*)(A1, A...) const>
|
||||
{
|
||||
using type = A1;
|
||||
};
|
||||
|
||||
class
|
||||
writer:
|
||||
exception_serialization::writer_adl
|
||||
{
|
||||
writer(writer const &) = delete;
|
||||
writer & operator=(writer const &) = delete;
|
||||
|
||||
core::typeinfo const * type_;
|
||||
void * w_;
|
||||
|
||||
bool
|
||||
dispatch_()
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
template <class F1, class... Fn>
|
||||
bool
|
||||
dispatch_(F1 && f1, Fn && ... fn)
|
||||
{
|
||||
using writer_type = typename std::decay<typename first_arg<decltype(&std::decay<F1>::type::operator())>::type>::type;
|
||||
if (writer_type * w = get<writer_type>())
|
||||
{
|
||||
std::forward<F1>(f1)(*w);
|
||||
return true;
|
||||
}
|
||||
return dispatch_(std::forward<Fn>(fn)...);
|
||||
}
|
||||
|
||||
protected:
|
||||
|
||||
template <class Writer>
|
||||
explicit
|
||||
writer(Writer * w) noexcept:
|
||||
type_(&BOOST_CORE_TYPEID(Writer)),
|
||||
w_(w)
|
||||
{
|
||||
}
|
||||
|
||||
public:
|
||||
|
||||
template <class Writer>
|
||||
Writer *
|
||||
get() noexcept
|
||||
{
|
||||
return *type_ == BOOST_CORE_TYPEID(Writer) ? static_cast<Writer *>(w_) : nullptr;
|
||||
}
|
||||
|
||||
template <class... Fn>
|
||||
bool
|
||||
dispatch(Fn && ... fn)
|
||||
{
|
||||
return dispatch_(std::forward<Fn>(fn)...);
|
||||
}
|
||||
};
|
||||
|
||||
template <class Writer>
|
||||
struct
|
||||
writer_adaptor:
|
||||
writer
|
||||
{
|
||||
explicit
|
||||
writer_adaptor(Writer & w) noexcept:
|
||||
writer(&w)
|
||||
{
|
||||
}
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
#endif
|
||||
@@ -9,7 +9,7 @@
|
||||
#include <boost/config.hpp>
|
||||
#include <boost/exception/get_error_info.hpp>
|
||||
#include <boost/exception/info.hpp>
|
||||
#include <boost/utility/enable_if.hpp>
|
||||
#include <boost/core/enable_if.hpp>
|
||||
#ifndef BOOST_NO_RTTI
|
||||
#include <boost/core/demangle.hpp>
|
||||
#endif
|
||||
@@ -21,7 +21,7 @@
|
||||
#endif
|
||||
|
||||
#ifndef BOOST_EXCEPTION_ENABLE_WARNINGS
|
||||
#if __GNUC__*100+__GNUC_MINOR__>301
|
||||
#if defined(__GNUC__) && __GNUC__*100+__GNUC_MINOR__>301
|
||||
#pragma GCC system_header
|
||||
#endif
|
||||
#ifdef __clang__
|
||||
@@ -149,11 +149,11 @@ boost
|
||||
if( f )
|
||||
{
|
||||
tmp << *f;
|
||||
if( int const * l=get_error_info<throw_line>(*be) )
|
||||
if( l )
|
||||
tmp << '(' << *l << "): ";
|
||||
}
|
||||
tmp << "Throw in function ";
|
||||
if( char const * const * fn=get_error_info<throw_function>(*be) )
|
||||
if( fn )
|
||||
tmp << *fn;
|
||||
else
|
||||
tmp << "(unknown)";
|
||||
@@ -205,6 +205,65 @@ boost
|
||||
#endif
|
||||
return w;
|
||||
}
|
||||
|
||||
namespace
|
||||
exception_detail
|
||||
{
|
||||
template <class Writer>
|
||||
void
|
||||
write_diagnostic_information_to_impl_( boost::exception const * be, std::exception const * se, Writer & w )
|
||||
{
|
||||
if( !be && !se )
|
||||
return;
|
||||
#ifndef BOOST_NO_RTTI
|
||||
if( !be )
|
||||
be=dynamic_cast<boost::exception const *>(se);
|
||||
if( !se )
|
||||
se=dynamic_cast<std::exception const *>(be);
|
||||
#endif
|
||||
if( be )
|
||||
{
|
||||
if( char const * const * f=get_error_info<throw_file>(*be) )
|
||||
write_nested(w, *f, "throw_file");
|
||||
if( int const * l=get_error_info<throw_line>(*be) )
|
||||
write_nested(w, *l, "throw_line");
|
||||
if( char const * const * fn=get_error_info<throw_function>(*be) )
|
||||
write_nested(w, *fn, "throw_function");
|
||||
}
|
||||
#ifndef BOOST_NO_RTTI
|
||||
if( be || se )
|
||||
write_nested(w, core::demangle((be?(BOOST_EXCEPTION_DYNAMIC_TYPEID(*be)):(BOOST_EXCEPTION_DYNAMIC_TYPEID(*se))).type_->name()).c_str(), "dynamic_exception_type");
|
||||
#endif
|
||||
if( se )
|
||||
if( char const * wh = se->what() )
|
||||
write_nested(w, wh, "std::exception::what");
|
||||
if( be )
|
||||
if( error_info_container * c = be->data_.get() )
|
||||
{
|
||||
writer_adaptor<Writer> wa(w);
|
||||
c->write_to(wa);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
template <class T, class Writer>
|
||||
void
|
||||
write_diagnostic_information_to( T const & e, Writer & w )
|
||||
{
|
||||
exception_detail::write_diagnostic_information_to_impl_(exception_detail::get_boost_exception(&e),exception_detail::get_std_exception(&e),w);
|
||||
}
|
||||
|
||||
#ifndef BOOST_NO_EXCEPTIONS
|
||||
template <class Writer>
|
||||
void
|
||||
write_current_exception_diagnostic_information_to( Writer & w )
|
||||
{
|
||||
boost::exception const * be=current_exception_cast<boost::exception const>();
|
||||
std::exception const * se=current_exception_cast<std::exception const>();
|
||||
if( be || se )
|
||||
exception_detail::write_diagnostic_information_to_impl_(be,se,w);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
#if defined(_MSC_VER) && !defined(BOOST_EXCEPTION_ENABLE_WARNINGS)
|
||||
|
||||
@@ -11,7 +11,7 @@
|
||||
#include <string.h>
|
||||
|
||||
#ifndef BOOST_EXCEPTION_ENABLE_WARNINGS
|
||||
#if __GNUC__*100+__GNUC_MINOR__>301
|
||||
#if defined(__GNUC__) && __GNUC__*100+__GNUC_MINOR__>301
|
||||
#pragma GCC system_header
|
||||
#endif
|
||||
#ifdef __clang__
|
||||
|
||||
@@ -14,7 +14,7 @@
|
||||
#include <boost/assert.hpp>
|
||||
|
||||
#ifndef BOOST_EXCEPTION_ENABLE_WARNINGS
|
||||
#if __GNUC__*100+__GNUC_MINOR__>301
|
||||
#if defined(__GNUC__) && __GNUC__*100+__GNUC_MINOR__>301
|
||||
#pragma GCC system_header
|
||||
#endif
|
||||
#ifdef __clang__
|
||||
|
||||
@@ -11,10 +11,12 @@
|
||||
#include <boost/exception/to_string_stub.hpp>
|
||||
#include <boost/exception/detail/error_info_impl.hpp>
|
||||
#include <boost/exception/detail/shared_ptr.hpp>
|
||||
#include <boost/exception/detail/writer.hpp>
|
||||
#include <map>
|
||||
#include <type_traits>
|
||||
|
||||
#ifndef BOOST_EXCEPTION_ENABLE_WARNINGS
|
||||
#if __GNUC__*100+__GNUC_MINOR__>301
|
||||
#if defined(__GNUC__) && __GNUC__*100+__GNUC_MINOR__>301
|
||||
#pragma GCC system_header
|
||||
#endif
|
||||
#ifdef __clang__
|
||||
@@ -28,10 +30,40 @@
|
||||
namespace
|
||||
boost
|
||||
{
|
||||
namespace
|
||||
exception_serialization
|
||||
{
|
||||
template <class Writer, class T, class... Unused>
|
||||
typename std::enable_if<std::is_base_of<exception_detail::writer, Writer>::value>::type
|
||||
serialize(Writer &, T const &, char const *, Unused && ...)
|
||||
{
|
||||
}
|
||||
|
||||
template <class Writer, class Tag, class T>
|
||||
void
|
||||
write(Writer & w, error_info<Tag, T> const & e)
|
||||
{
|
||||
write(w, e.value());
|
||||
}
|
||||
}
|
||||
|
||||
namespace
|
||||
exception_detail
|
||||
{
|
||||
template <class Tag, class T>
|
||||
void
|
||||
serialize_(writer & w, error_info<Tag,T> const & x)
|
||||
{
|
||||
using namespace boost::exception_serialization;
|
||||
char buf[256];
|
||||
serialize(w, x.value(), to_zstr(buf, get_pretty_tag_type_name<Tag>()));
|
||||
}
|
||||
}
|
||||
|
||||
template <class Tag,class T>
|
||||
inline
|
||||
std::string
|
||||
error_info_name( error_info<Tag,T> const & x )
|
||||
error_info_name( error_info<Tag,T> const & )
|
||||
{
|
||||
return tag_type_name<Tag>();
|
||||
}
|
||||
@@ -53,6 +85,15 @@ boost
|
||||
return to_string_stub(*this);
|
||||
}
|
||||
|
||||
template <class Tag,class T>
|
||||
inline
|
||||
void
|
||||
error_info<Tag,T>::
|
||||
write_to(exception_detail::writer & w) const
|
||||
{
|
||||
exception_detail::serialize_(w, *this);
|
||||
}
|
||||
|
||||
namespace
|
||||
exception_detail
|
||||
{
|
||||
@@ -108,6 +149,16 @@ boost
|
||||
return diagnostic_info_str_.c_str();
|
||||
}
|
||||
|
||||
void
|
||||
write_to( writer & w ) const
|
||||
{
|
||||
for( error_info_map::const_iterator i=info_.begin(),end=info_.end(); i!=end; ++i )
|
||||
{
|
||||
error_info_base const & x = *i->second;
|
||||
x.write_to(w);
|
||||
}
|
||||
}
|
||||
|
||||
private:
|
||||
|
||||
friend class boost::exception;
|
||||
|
||||
@@ -10,7 +10,7 @@
|
||||
#include <boost/tuple/tuple.hpp>
|
||||
|
||||
#ifndef BOOST_EXCEPTION_ENABLE_WARNINGS
|
||||
#if __GNUC__*100+__GNUC_MINOR__>301
|
||||
#if defined(__GNUC__) && __GNUC__*100+__GNUC_MINOR__>301
|
||||
#pragma GCC system_header
|
||||
#endif
|
||||
#ifdef __clang__
|
||||
|
||||
43
include/boost/exception/serialization/nlohmann_writer.hpp
Normal file
43
include/boost/exception/serialization/nlohmann_writer.hpp
Normal file
@@ -0,0 +1,43 @@
|
||||
//Copyright (c) 2006-2026 Emil Dotchevski and Reverge Studios, Inc.
|
||||
|
||||
//Distributed under the Boost Software License, Version 1.0. (See accompanying
|
||||
//file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
||||
|
||||
#ifndef BOOST_EXCEPTION_SERIALIZATION_NLOHMANN_WRITER_HPP_INCLUDED
|
||||
#define BOOST_EXCEPTION_SERIALIZATION_NLOHMANN_WRITER_HPP_INCLUDED
|
||||
|
||||
#include <utility>
|
||||
|
||||
namespace
|
||||
boost
|
||||
{
|
||||
namespace
|
||||
exception_serialization
|
||||
{
|
||||
template <class Json>
|
||||
struct
|
||||
nlohmann_writer
|
||||
{
|
||||
Json & j_;
|
||||
|
||||
template <class T>
|
||||
friend
|
||||
auto
|
||||
write(nlohmann_writer & w, T const & x) -> decltype(to_json(std::declval<Json &>(), x))
|
||||
{
|
||||
to_json(w.j_, x);
|
||||
}
|
||||
|
||||
template <class T>
|
||||
friend
|
||||
void
|
||||
write_nested(nlohmann_writer & w, T const & x, char const * name)
|
||||
{
|
||||
nlohmann_writer nested{w.j_[name]};
|
||||
write(nested, x);
|
||||
}
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
#endif
|
||||
@@ -6,12 +6,12 @@
|
||||
#ifndef BOOST_EXCEPTION_7E48761AD92811DC9011477D56D89593
|
||||
#define BOOST_EXCEPTION_7E48761AD92811DC9011477D56D89593
|
||||
|
||||
#include <boost/utility/enable_if.hpp>
|
||||
#include <boost/core/enable_if.hpp>
|
||||
#include <boost/exception/detail/is_output_streamable.hpp>
|
||||
#include <sstream>
|
||||
|
||||
#ifndef BOOST_EXCEPTION_ENABLE_WARNINGS
|
||||
#if __GNUC__*100+__GNUC_MINOR__>301
|
||||
#if defined(__GNUC__) && __GNUC__*100+__GNUC_MINOR__>301
|
||||
#pragma GCC system_header
|
||||
#endif
|
||||
#ifdef __clang__
|
||||
|
||||
@@ -11,7 +11,7 @@
|
||||
#include <boost/assert.hpp>
|
||||
|
||||
#ifndef BOOST_EXCEPTION_ENABLE_WARNINGS
|
||||
#if __GNUC__*100+__GNUC_MINOR__>301
|
||||
#if defined(__GNUC__) && __GNUC__*100+__GNUC_MINOR__>301
|
||||
#pragma GCC system_header
|
||||
#endif
|
||||
#ifdef __clang__
|
||||
|
||||
@@ -7,6 +7,7 @@
|
||||
"description": "The Boost Exception library supports transporting of arbitrary data in exception objects, and transporting of exceptions between threads.",
|
||||
"documentation": "doc/boost-exception.html",
|
||||
"category": [
|
||||
"Error-handling",
|
||||
"Emulation"
|
||||
],
|
||||
"maintainers": [
|
||||
|
||||
33
scripts/download_nlohmann_json.py
Normal file
33
scripts/download_nlohmann_json.py
Normal file
@@ -0,0 +1,33 @@
|
||||
"""
|
||||
|
||||
Copyright 2018-2026 Emil Dotchevski and Reverge Studios, Inc.
|
||||
|
||||
Distributed under the Boost Software License, Version 1.0. (See accompanying
|
||||
file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
||||
|
||||
This program downloads the nlohmann/json single header distribution.
|
||||
|
||||
Usage:
|
||||
|
||||
python3 download_nlohmann_json.py
|
||||
|
||||
"""
|
||||
|
||||
import urllib.request
|
||||
import os
|
||||
|
||||
url = "https://github.com/nlohmann/json/releases/download/v3.11.3/json.hpp"
|
||||
output_dir = os.path.join(os.path.dirname(os.path.dirname(os.path.abspath(__file__))), "test", "nlohmann")
|
||||
output_file = os.path.join(output_dir, "json.hpp")
|
||||
|
||||
def _main():
|
||||
if os.path.exists(output_file):
|
||||
print(f"{output_file} already exists, skipping download")
|
||||
return
|
||||
os.makedirs(output_dir, exist_ok=True)
|
||||
print(f"Downloading {url}...")
|
||||
urllib.request.urlretrieve(url, output_file)
|
||||
print(f"Saved to {output_file}")
|
||||
|
||||
if __name__ == "__main__":
|
||||
_main()
|
||||
@@ -7,6 +7,8 @@
|
||||
|
||||
import testing ;
|
||||
|
||||
project : requirements <library>/boost/exception//boost_exception ;
|
||||
|
||||
#to_string
|
||||
|
||||
run is_output_streamable_test.cpp ;
|
||||
@@ -22,7 +24,7 @@ run 2-throw_exception_no_exceptions_test.cpp : : : <exception-handling>off ;
|
||||
run 3-throw_exception_no_integration_test.cpp : : : <exception-handling>on ;
|
||||
run 4-throw_exception_no_both_test.cpp : : : <exception-handling>off ;
|
||||
run cloning_test.cpp : : : <exception-handling>on ;
|
||||
run copy_exception_test.cpp ../../thread/src/tss_null.cpp /boost//thread : : : <threading>multi <exception-handling>on ;
|
||||
run copy_exception_test.cpp ../../thread/src/tss_null.cpp /boost/thread//boost_thread : : : <threading>multi <exception-handling>on ;
|
||||
run copy_exception_no_exceptions_test.cpp : : : <exception-handling>off <rtti>on ;
|
||||
run unknown_exception_test.cpp : : : <exception-handling>on ;
|
||||
run exception_test.cpp : : : <exception-handling>on ;
|
||||
@@ -39,8 +41,10 @@ run refcount_ptr_test.cpp ;
|
||||
run current_exception_cast_test.cpp : : : <exception-handling>on ;
|
||||
run no_exceptions_test.cpp : : : <exception-handling>off ;
|
||||
run errinfos_test.cpp : : : <exception-handling>on ;
|
||||
run exception_ptr_test.cpp/<define>BOOST_ENABLE_NON_INTRUSIVE_EXCEPTION_PTR ../../thread/src/tss_null.cpp /boost/exception /boost//thread : : : <threading>multi <exception-handling>on : non_intrusive_exception_ptr_test ;
|
||||
run exception_ptr_test.cpp ../../thread/src/tss_null.cpp /boost//thread : : : <threading>multi <exception-handling>on ;
|
||||
run nlohmann_test.cpp : : : <exception-handling>on ;
|
||||
run exception_ptr_test.cpp/<define>BOOST_ENABLE_NON_INTRUSIVE_EXCEPTION_PTR ../../thread/src/tss_null.cpp /boost/exception//boost_exception /boost/thread//boost_thread : : : <threading>multi <exception-handling>on : non_intrusive_exception_ptr_test ;
|
||||
run exception_ptr_test.cpp ../../thread/src/tss_null.cpp /boost/thread//boost_thread : : : <threading>multi <exception-handling>on ;
|
||||
run exception_ptr_test2.cpp ;
|
||||
|
||||
lib visibility_test_lib : visibility_test_lib.cpp : <visibility>hidden <exception-handling>on ;
|
||||
run visibility_test.cpp visibility_test_lib/<link>shared : : : <visibility>hidden <exception-handling>on ;
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
#include <boost/exception_ptr.hpp>
|
||||
#include <boost/exception/get_error_info.hpp>
|
||||
#include <boost/thread.hpp>
|
||||
#include <boost/detail/atomic_count.hpp>
|
||||
#include <boost/smart_ptr/detail/atomic_count.hpp>
|
||||
#include <boost/detail/lightweight_test.hpp>
|
||||
|
||||
typedef boost::error_info<struct tag_answer,int> answer;
|
||||
|
||||
@@ -13,6 +13,7 @@
|
||||
#include <boost/exception/info.hpp>
|
||||
#include <boost/detail/lightweight_test.hpp>
|
||||
#include <boost/detail/workaround.hpp>
|
||||
#include <iostream>
|
||||
|
||||
#if BOOST_WORKAROUND(BOOST_CODEGEARC, BOOST_TESTED_AT(0x610))
|
||||
struct test_tag1 {};
|
||||
@@ -141,9 +142,11 @@ main()
|
||||
catch(
|
||||
error1 & x )
|
||||
{
|
||||
std::string di1=boost::diagnostic_information(x);
|
||||
std::string di1 = diagnostic_information(x);
|
||||
std::cout << __LINE__ << " ------------------\n" << di1;
|
||||
x << tagged_int1(2) << tagged_int2(2);
|
||||
std::string di2 = diagnostic_information(x);
|
||||
std::cout << "\n" << di2 << std::endl;
|
||||
test1(di1,di2);
|
||||
}
|
||||
try
|
||||
@@ -155,9 +158,11 @@ main()
|
||||
catch(
|
||||
error1 & x )
|
||||
{
|
||||
std::string di1=boost::current_exception_diagnostic_information();
|
||||
std::string di1 = current_exception_diagnostic_information();
|
||||
std::cout << __LINE__ << " ------------------\n" << di1;
|
||||
x << tagged_int1(2) << tagged_int2(2);
|
||||
std::string di2 = current_exception_diagnostic_information();
|
||||
std::cout << "\n" << di2 << std::endl;
|
||||
test1(di1,di2);
|
||||
}
|
||||
try
|
||||
@@ -170,8 +175,10 @@ main()
|
||||
error2 & x )
|
||||
{
|
||||
std::string di1 = diagnostic_information(x);
|
||||
std::cout << __LINE__ << " ------------------\n" << di1;
|
||||
x << tagged_int1(2) << tagged_int2(2);
|
||||
std::string di2 = diagnostic_information(x);
|
||||
std::cout << "\n" << di2 << std::endl;
|
||||
test2(di1,di2);
|
||||
}
|
||||
try
|
||||
@@ -184,23 +191,27 @@ main()
|
||||
error2 & x )
|
||||
{
|
||||
std::string di1 = current_exception_diagnostic_information();
|
||||
BOOST_TEST(di1==boost::diagnostic_information_what(x));
|
||||
std::cout << __LINE__ << " ------------------\n" << di1;
|
||||
BOOST_TEST(di1 == diagnostic_information_what(x));
|
||||
x << tagged_int1(2) << tagged_int2(2);
|
||||
std::string di2 = current_exception_diagnostic_information();
|
||||
BOOST_TEST(di2==boost::diagnostic_information_what(x));
|
||||
std::cout << "\n" << di2 << std::endl;
|
||||
BOOST_TEST(di2 == diagnostic_information_what(x));
|
||||
test2(di1,di2);
|
||||
}
|
||||
try
|
||||
{
|
||||
error3 x;
|
||||
std::string di=diagnostic_information(x);
|
||||
std::string di = diagnostic_information(x);
|
||||
std::cout << __LINE__ << " ------------------\n" << di << std::endl;
|
||||
test3(di);
|
||||
throw x;
|
||||
}
|
||||
catch(
|
||||
... )
|
||||
{
|
||||
std::string di=current_exception_diagnostic_information();
|
||||
std::string di = current_exception_diagnostic_information();
|
||||
std::cout << __LINE__ << " ------------------\n" << di << std::endl;
|
||||
test3(di);
|
||||
}
|
||||
try
|
||||
@@ -210,9 +221,10 @@ main()
|
||||
catch(
|
||||
error4 & x )
|
||||
{
|
||||
std::string di1=boost::diagnostic_information(x);
|
||||
std::string wh1=x.what();
|
||||
BOOST_TEST(wh1==di1);
|
||||
std::string di1 = diagnostic_information(x);
|
||||
std::cout << __LINE__ << " ------------------\n" << di1 << std::endl;
|
||||
std::string wh1 = x.what();
|
||||
BOOST_TEST(wh1 == di1);
|
||||
}
|
||||
try
|
||||
{
|
||||
@@ -222,13 +234,15 @@ main()
|
||||
catch(
|
||||
error4 & x )
|
||||
{
|
||||
std::string di1=boost::diagnostic_information(x);
|
||||
std::string wh1=x.what();
|
||||
BOOST_TEST(wh1==di1);
|
||||
std::string di1 = diagnostic_information(x);
|
||||
std::cout << __LINE__ << " ------------------\n" << di1;
|
||||
std::string wh1 = x.what();
|
||||
BOOST_TEST(wh1 == di1);
|
||||
x << tagged_int1(2) << tagged_int2(2);
|
||||
std::string di2 = diagnostic_information(x);
|
||||
std::string wh2=x.what();
|
||||
BOOST_TEST(wh2==di2);
|
||||
std::cout << "\n" << di2 << std::endl;
|
||||
std::string wh2 = x.what();
|
||||
BOOST_TEST(wh2 == di2);
|
||||
test4(di1,di2);
|
||||
}
|
||||
try
|
||||
@@ -239,13 +253,15 @@ main()
|
||||
catch(
|
||||
error4 & x )
|
||||
{
|
||||
std::string di1=boost::current_exception_diagnostic_information();
|
||||
std::string wh1=x.what();
|
||||
BOOST_TEST(wh1==di1);
|
||||
std::string di1 = current_exception_diagnostic_information();
|
||||
std::cout << __LINE__ << " ------------------\n" << di1;
|
||||
std::string wh1 = x.what();
|
||||
BOOST_TEST(wh1 == di1);
|
||||
x << tagged_int1(2) << tagged_int2(2);
|
||||
std::string di2 = current_exception_diagnostic_information();
|
||||
std::string wh2=x.what();
|
||||
BOOST_TEST(wh2==di2);
|
||||
std::cout << "\n" << di2 << std::endl;
|
||||
std::string wh2 = x.what();
|
||||
BOOST_TEST(wh2 == di2);
|
||||
test4(di1,di2);
|
||||
}
|
||||
return boost::report_errors();
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
#include <boost/function.hpp>
|
||||
#include <boost/bind.hpp>
|
||||
#include <boost/thread.hpp>
|
||||
#include <boost/detail/atomic_count.hpp>
|
||||
#include <boost/smart_ptr/detail/atomic_count.hpp>
|
||||
#include <boost/detail/lightweight_test.hpp>
|
||||
#include <iostream>
|
||||
|
||||
|
||||
114
test/exception_ptr_test2.cpp
Normal file
114
test/exception_ptr_test2.cpp
Normal file
@@ -0,0 +1,114 @@
|
||||
// Copyright 2022 Peter Dimov
|
||||
// Distributed under the Boost Software License, Version 1.0.
|
||||
// https://www.boost.org/LICENSE_1_0.txt
|
||||
|
||||
#include <boost/config.hpp>
|
||||
|
||||
#if defined(BOOST_NO_EXCEPTIONS)
|
||||
|
||||
#include <boost/config/pragma_message.hpp>
|
||||
BOOST_PRAGMA_MESSAGE( "Skipping test because BOOST_NO_EXCEPTIONS is defined" )
|
||||
|
||||
int main() {}
|
||||
|
||||
#elif defined(BOOST_NO_CXX11_HDR_EXCEPTION)
|
||||
|
||||
#include <boost/config/pragma_message.hpp>
|
||||
BOOST_PRAGMA_MESSAGE( "Skipping test because BOOST_NO_CXX11_HDR_EXCEPTION is defined" )
|
||||
|
||||
int main() {}
|
||||
|
||||
#else
|
||||
|
||||
#include <boost/exception_ptr.hpp>
|
||||
#include <boost/exception/exception.hpp>
|
||||
#include <boost/core/lightweight_test.hpp>
|
||||
#include <exception>
|
||||
#include <new>
|
||||
#include <stdexcept>
|
||||
|
||||
class my_exception
|
||||
{
|
||||
};
|
||||
|
||||
class my_exception2: public std::exception
|
||||
{
|
||||
};
|
||||
|
||||
class my_exception3: public std::bad_alloc
|
||||
{
|
||||
};
|
||||
|
||||
class my_exception4: public std::exception, public boost::exception
|
||||
{
|
||||
};
|
||||
|
||||
class my_exception5: public std::logic_error, public virtual boost::exception
|
||||
{
|
||||
public:
|
||||
|
||||
my_exception5(): std::logic_error( "" ) {}
|
||||
};
|
||||
|
||||
int main()
|
||||
{
|
||||
try
|
||||
{
|
||||
throw my_exception();
|
||||
}
|
||||
catch( ... )
|
||||
{
|
||||
boost::exception_ptr p = boost::current_exception();
|
||||
BOOST_TEST_THROWS( boost::rethrow_exception( p ), my_exception );
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
throw my_exception2();
|
||||
}
|
||||
catch( ... )
|
||||
{
|
||||
boost::exception_ptr p = boost::current_exception();
|
||||
BOOST_TEST_THROWS( boost::rethrow_exception( p ), my_exception2 );
|
||||
BOOST_TEST_THROWS( boost::rethrow_exception( p ), std::exception );
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
throw my_exception3();
|
||||
}
|
||||
catch( ... )
|
||||
{
|
||||
boost::exception_ptr p = boost::current_exception();
|
||||
BOOST_TEST_THROWS( boost::rethrow_exception( p ), my_exception3 );
|
||||
BOOST_TEST_THROWS( boost::rethrow_exception( p ), std::bad_alloc );
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
throw my_exception4();
|
||||
}
|
||||
catch( ... )
|
||||
{
|
||||
boost::exception_ptr p = boost::current_exception();
|
||||
BOOST_TEST_THROWS( boost::rethrow_exception( p ), my_exception4 );
|
||||
BOOST_TEST_THROWS( boost::rethrow_exception( p ), std::exception );
|
||||
BOOST_TEST_THROWS( boost::rethrow_exception( p ), boost::exception );
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
throw my_exception5();
|
||||
}
|
||||
catch( ... )
|
||||
{
|
||||
boost::exception_ptr p = boost::current_exception();
|
||||
BOOST_TEST_THROWS( boost::rethrow_exception( p ), my_exception5 );
|
||||
BOOST_TEST_THROWS( boost::rethrow_exception( p ), std::logic_error );
|
||||
BOOST_TEST_THROWS( boost::rethrow_exception( p ), boost::exception );
|
||||
}
|
||||
|
||||
return boost::report_errors();
|
||||
}
|
||||
|
||||
#endif
|
||||
148
test/nlohmann_test.cpp
Normal file
148
test/nlohmann_test.cpp
Normal file
@@ -0,0 +1,148 @@
|
||||
//Copyright (c) 2006-2026 Emil Dotchevski and Reverge Studios, Inc.
|
||||
|
||||
//Distributed under the Boost Software License, Version 1.0. (See accompanying
|
||||
//file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
||||
|
||||
#include <boost/config.hpp>
|
||||
|
||||
#if defined( BOOST_NO_EXCEPTIONS )
|
||||
# error This program requires exception handling.
|
||||
#endif
|
||||
|
||||
#include <boost/exception/diagnostic_information.hpp>
|
||||
#include <boost/exception/serialization/nlohmann_writer.hpp>
|
||||
#include <boost/throw_exception.hpp>
|
||||
|
||||
#include "nlohmann/json.hpp"
|
||||
#include <boost/detail/lightweight_test.hpp>
|
||||
#include <iomanip>
|
||||
#include <iostream>
|
||||
#include <exception>
|
||||
|
||||
using output_writer = boost::exception_serialization::nlohmann_writer<nlohmann::ordered_json>;
|
||||
|
||||
namespace boost { namespace exception_serialization {
|
||||
|
||||
template <class Handle, class E>
|
||||
void
|
||||
serialize(Handle & h, E const & e, char const * name)
|
||||
{
|
||||
h.dispatch(
|
||||
[&](nlohmann_writer<nlohmann::json> & w) { write_nested(w, e, name); },
|
||||
[&](nlohmann_writer<nlohmann::ordered_json> & w) { write_nested(w, e, name); }
|
||||
);
|
||||
}
|
||||
|
||||
} }
|
||||
|
||||
struct my_error_tag1;
|
||||
struct my_error_tag2;
|
||||
|
||||
typedef boost::error_info<my_error_tag1, int> my_error1;
|
||||
typedef boost::error_info<my_error_tag2, std::string> my_error2;
|
||||
|
||||
struct
|
||||
my_info
|
||||
{
|
||||
int code;
|
||||
char const * message;
|
||||
|
||||
template <class Json>
|
||||
friend
|
||||
void
|
||||
to_json(Json & j, my_info const & e)
|
||||
{
|
||||
j["code"] = e.code;
|
||||
j["message"] = e.message;
|
||||
}
|
||||
};
|
||||
|
||||
struct my_info_tag;
|
||||
typedef boost::error_info<my_info_tag, my_info> my_error3;
|
||||
|
||||
struct
|
||||
test_exception:
|
||||
virtual boost::exception,
|
||||
virtual std::exception
|
||||
{
|
||||
char const *
|
||||
what() const noexcept override
|
||||
{
|
||||
return "test_exception::what";
|
||||
}
|
||||
};
|
||||
|
||||
void
|
||||
check_output(nlohmann::ordered_json const & j, bool has_source_location)
|
||||
{
|
||||
if( has_source_location )
|
||||
{
|
||||
BOOST_TEST(j.contains("throw_file"));
|
||||
BOOST_TEST(j.contains("throw_line"));
|
||||
BOOST_TEST(j.contains("throw_function"));
|
||||
}
|
||||
#ifndef BOOST_NO_RTTI
|
||||
BOOST_TEST(j.contains("dynamic_exception_type"));
|
||||
#endif
|
||||
BOOST_TEST(j.contains("std::exception::what"));
|
||||
BOOST_TEST_EQ(j["std::exception::what"].get<std::string>(), "test_exception::what");
|
||||
|
||||
BOOST_TEST(j.contains("my_error_tag1"));
|
||||
BOOST_TEST_EQ(j["my_error_tag1"].get<int>(), 42);
|
||||
|
||||
BOOST_TEST(j.contains("my_error_tag2"));
|
||||
BOOST_TEST_EQ(j["my_error_tag2"].get<std::string>(), "hello");
|
||||
|
||||
BOOST_TEST(j.contains("my_info_tag"));
|
||||
auto const & mij = j["my_info_tag"];
|
||||
BOOST_TEST_EQ(mij["code"].get<int>(), 1);
|
||||
BOOST_TEST_EQ(mij["message"].get<std::string>(), "error one");
|
||||
}
|
||||
|
||||
int
|
||||
main()
|
||||
{
|
||||
{
|
||||
std::cout << "Testing write_diagnostic_information_to:\n";
|
||||
nlohmann::ordered_json j;
|
||||
try
|
||||
{
|
||||
test_exception e;
|
||||
e <<
|
||||
my_error1(42) <<
|
||||
my_error2("hello") <<
|
||||
my_error3({1, "error one"});
|
||||
BOOST_THROW_EXCEPTION(e);
|
||||
}
|
||||
catch( test_exception & e )
|
||||
{
|
||||
output_writer w{j};
|
||||
boost::write_diagnostic_information_to(e, w);
|
||||
}
|
||||
std::cout << std::setw(2) << j << std::endl;
|
||||
check_output(j, true);
|
||||
}
|
||||
|
||||
{
|
||||
std::cout << "\nTesting write_current_exception_diagnostic_information_to:\n";
|
||||
nlohmann::ordered_json j;
|
||||
try
|
||||
{
|
||||
test_exception e;
|
||||
e <<
|
||||
my_error1(42) <<
|
||||
my_error2("hello") <<
|
||||
my_error3({1, "error one"});
|
||||
BOOST_THROW_EXCEPTION(e);
|
||||
}
|
||||
catch( ... )
|
||||
{
|
||||
output_writer w{j};
|
||||
boost::write_current_exception_diagnostic_information_to(w);
|
||||
}
|
||||
std::cout << std::setw(2) << j << std::endl;
|
||||
check_output(j, true);
|
||||
}
|
||||
|
||||
return boost::report_errors();
|
||||
}
|
||||
Reference in New Issue
Block a user