forked from boostorg/core
Compare commits
133 Commits
boost-1.64
...
feature/mo
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
9db11ce554 | ||
|
|
7d70451b49 | ||
|
|
bf932b4908 | ||
|
|
e3629dd1c1 | ||
|
|
dea6b04157 | ||
|
|
9f9da9dc9b | ||
|
|
cdcc50a455 | ||
|
|
6f3e6254e7 | ||
|
|
245297ab85 | ||
|
|
2574ae8a0c | ||
|
|
bbcd5b8f5c | ||
|
|
83ea633d09 | ||
|
|
2b60d044ac | ||
|
|
3cd1885209 | ||
|
|
9d123dc9a3 | ||
|
|
82957de970 | ||
|
|
d60775659b | ||
|
|
bade4d23e8 | ||
|
|
a5c891441c | ||
|
|
e9f986d11e | ||
|
|
5a55d9572f | ||
|
|
e98a546e89 | ||
|
|
4dc12c59bd | ||
|
|
3c9c9603ad | ||
|
|
026be7659c | ||
|
|
ada6b9e447 | ||
|
|
79e3bf7175 | ||
|
|
1d9d6f579e | ||
|
|
5ed58ee20f | ||
|
|
9dfa265b49 | ||
|
|
3aa817e8d0 | ||
|
|
4ae42efdae | ||
|
|
32ac6c5b36 | ||
|
|
13c09e805b | ||
|
|
81df44e80b | ||
|
|
944f27853b | ||
|
|
0bc795de4a | ||
|
|
d2b20486a0 | ||
|
|
88acbce1e9 | ||
|
|
0c605bf32f | ||
|
|
53772c8c73 | ||
|
|
6dd97ee415 | ||
|
|
8d4f1bb4af | ||
|
|
d56c31d688 | ||
|
|
5e08874182 | ||
|
|
56bd3784bf | ||
|
|
cf66842419 | ||
|
|
861eb5cf4c | ||
|
|
205b319b57 | ||
|
|
6f1d88d153 | ||
|
|
7f7c4c5b83 | ||
|
|
dfd5a0b8db | ||
|
|
d8c0768788 | ||
|
|
d0a9206d6a | ||
|
|
76c3538315 | ||
|
|
f2638b6d64 | ||
|
|
30c006ac82 | ||
|
|
c71eb0e479 | ||
|
|
3f7d36445d | ||
|
|
a08dda22b2 | ||
|
|
2d99acd7ec | ||
|
|
65b98db868 | ||
|
|
edcd9e2cf5 | ||
|
|
2eaba7d6d1 | ||
|
|
a05906fd44 | ||
|
|
f3782a946f | ||
|
|
f504872d89 | ||
|
|
e1f070b7b4 | ||
|
|
740f2142c5 | ||
|
|
5c10ee4517 | ||
|
|
b7ad896707 | ||
|
|
70413b0568 | ||
|
|
b8a9b2c234 | ||
|
|
e11fa9ac03 | ||
|
|
e1d50a1de2 | ||
|
|
e128f4e1b8 | ||
|
|
cc119253b4 | ||
|
|
19ec659a91 | ||
|
|
75ae238d0c | ||
|
|
630ab2aae4 | ||
|
|
2cd4753a02 | ||
|
|
9445d08ea7 | ||
|
|
dbb3305050 | ||
|
|
23f10ab4bf | ||
|
|
e5281335e0 | ||
|
|
b5dcd204e5 | ||
|
|
081ca76d6c | ||
|
|
2a3387451f | ||
|
|
69bd3e73bf | ||
|
|
0296f44b2b | ||
|
|
2738af9b52 | ||
|
|
6a1c3a82a1 | ||
|
|
bb800a05e3 | ||
|
|
2d7f98c844 | ||
|
|
8914603fcf | ||
|
|
3792047e09 | ||
|
|
6de3da8360 | ||
|
|
e55d6279d5 | ||
|
|
a87fd099e7 | ||
|
|
09f4823baa | ||
|
|
526e0b2f53 | ||
|
|
ac6044769f | ||
|
|
2876914d02 | ||
|
|
36f60e47ad | ||
|
|
a88bbcc8ba | ||
|
|
c4f3e1acc0 | ||
|
|
69696c0cba | ||
|
|
283460b991 | ||
|
|
3a2c94df8c | ||
|
|
226ef58027 | ||
|
|
0f8b499bca | ||
|
|
a3f6d12b57 | ||
|
|
cccac1d631 | ||
|
|
6153eebc42 | ||
|
|
ab05c190be | ||
|
|
637b2ffaff | ||
|
|
43426067df | ||
|
|
f76116405d | ||
|
|
89b1792724 | ||
|
|
87dd2883b8 | ||
|
|
cba69f5e4c | ||
|
|
5eaa31e366 | ||
|
|
2d56d6f55b | ||
|
|
6fd649d7fd | ||
|
|
335aa4f396 | ||
|
|
26cab26e52 | ||
|
|
b805efd4fe | ||
|
|
80875a19b6 | ||
|
|
6ba388125e | ||
|
|
889502504d | ||
|
|
16c5503648 | ||
|
|
dc6003e26f | ||
|
|
46545326d8 |
271
.travis.yml
271
.travis.yml
@@ -1,4 +1,4 @@
|
||||
# Copyright 2016 Peter Dimov
|
||||
# Copyright 2016-2018 Peter Dimov
|
||||
# Distributed under the Boost Software License, Version 1.0.
|
||||
# (See accompanying file LICENSE_1_0.txt or copy at http://boost.org/LICENSE_1_0.txt)
|
||||
|
||||
@@ -6,14 +6,13 @@ language: cpp
|
||||
|
||||
sudo: false
|
||||
|
||||
os:
|
||||
- linux
|
||||
- osx
|
||||
python: "2.7"
|
||||
|
||||
branches:
|
||||
only:
|
||||
- master
|
||||
- develop
|
||||
- /feature\/.*/
|
||||
|
||||
env:
|
||||
matrix:
|
||||
@@ -26,10 +25,32 @@ matrix:
|
||||
|
||||
include:
|
||||
- os: linux
|
||||
env: TOOLSET=gcc COMPILER=g++ CXXSTD=c++03
|
||||
compiler: g++
|
||||
env: TOOLSET=gcc COMPILER=g++ CXXSTD=03,11
|
||||
|
||||
- os: linux
|
||||
env: TOOLSET=gcc COMPILER=g++-4.7 CXXSTD=c++03
|
||||
compiler: g++-4.4
|
||||
env: TOOLSET=gcc COMPILER=g++-4.4 CXXSTD=98,0x
|
||||
addons:
|
||||
apt:
|
||||
packages:
|
||||
- g++-4.4
|
||||
sources:
|
||||
- ubuntu-toolchain-r-test
|
||||
|
||||
- os: linux
|
||||
compiler: g++-4.6
|
||||
env: TOOLSET=gcc COMPILER=g++-4.6 CXXSTD=03,0x
|
||||
addons:
|
||||
apt:
|
||||
packages:
|
||||
- g++-4.6
|
||||
sources:
|
||||
- ubuntu-toolchain-r-test
|
||||
|
||||
- os: linux
|
||||
compiler: g++-4.7
|
||||
env: TOOLSET=gcc COMPILER=g++-4.7 CXXSTD=03,11
|
||||
addons:
|
||||
apt:
|
||||
packages:
|
||||
@@ -38,16 +59,8 @@ matrix:
|
||||
- ubuntu-toolchain-r-test
|
||||
|
||||
- os: linux
|
||||
env: TOOLSET=gcc COMPILER=g++-4.7 CXXSTD=c++11
|
||||
addons:
|
||||
apt:
|
||||
packages:
|
||||
- g++-4.7
|
||||
sources:
|
||||
- ubuntu-toolchain-r-test
|
||||
|
||||
- os: linux
|
||||
env: TOOLSET=gcc COMPILER=g++-4.8 CXXSTD=c++03
|
||||
compiler: g++-4.8
|
||||
env: TOOLSET=gcc COMPILER=g++-4.8 CXXSTD=03,11
|
||||
addons:
|
||||
apt:
|
||||
packages:
|
||||
@@ -56,16 +69,8 @@ matrix:
|
||||
- ubuntu-toolchain-r-test
|
||||
|
||||
- os: linux
|
||||
env: TOOLSET=gcc COMPILER=g++-4.8 CXXSTD=c++11
|
||||
addons:
|
||||
apt:
|
||||
packages:
|
||||
- g++-4.8
|
||||
sources:
|
||||
- ubuntu-toolchain-r-test
|
||||
|
||||
- os: linux
|
||||
env: TOOLSET=gcc COMPILER=g++-4.9 CXXSTD=c++03
|
||||
compiler: g++-4.9
|
||||
env: TOOLSET=gcc COMPILER=g++-4.9 CXXSTD=03,11
|
||||
addons:
|
||||
apt:
|
||||
packages:
|
||||
@@ -74,16 +79,8 @@ matrix:
|
||||
- ubuntu-toolchain-r-test
|
||||
|
||||
- os: linux
|
||||
env: TOOLSET=gcc COMPILER=g++-4.9 CXXSTD=c++11
|
||||
addons:
|
||||
apt:
|
||||
packages:
|
||||
- g++-4.9
|
||||
sources:
|
||||
- ubuntu-toolchain-r-test
|
||||
|
||||
- os: linux
|
||||
env: TOOLSET=gcc COMPILER=g++-5 CXXSTD=c++03
|
||||
compiler: g++-5
|
||||
env: TOOLSET=gcc COMPILER=g++-5 CXXSTD=03,11,14,1z
|
||||
addons:
|
||||
apt:
|
||||
packages:
|
||||
@@ -92,25 +89,8 @@ matrix:
|
||||
- ubuntu-toolchain-r-test
|
||||
|
||||
- os: linux
|
||||
env: TOOLSET=gcc COMPILER=g++-5 CXXSTD=c++11
|
||||
addons:
|
||||
apt:
|
||||
packages:
|
||||
- g++-5
|
||||
sources:
|
||||
- ubuntu-toolchain-r-test
|
||||
|
||||
- os: linux
|
||||
env: TOOLSET=gcc COMPILER=g++-5 CXXSTD=c++14
|
||||
addons:
|
||||
apt:
|
||||
packages:
|
||||
- g++-5
|
||||
sources:
|
||||
- ubuntu-toolchain-r-test
|
||||
|
||||
- os: linux
|
||||
env: TOOLSET=gcc COMPILER=g++-6 CXXSTD=c++03
|
||||
compiler: g++-6
|
||||
env: TOOLSET=gcc COMPILER=g++-6 CXXSTD=03,11,14,1z
|
||||
addons:
|
||||
apt:
|
||||
packages:
|
||||
@@ -119,146 +99,211 @@ matrix:
|
||||
- ubuntu-toolchain-r-test
|
||||
|
||||
- os: linux
|
||||
env: TOOLSET=gcc COMPILER=g++-6 CXXSTD=c++11
|
||||
dist: trusty
|
||||
compiler: g++-7
|
||||
env: TOOLSET=gcc COMPILER=g++-7 CXXSTD=03,11,14,17
|
||||
addons:
|
||||
apt:
|
||||
packages:
|
||||
- g++-6
|
||||
- g++-7
|
||||
sources:
|
||||
- ubuntu-toolchain-r-test
|
||||
|
||||
- os: linux
|
||||
env: TOOLSET=gcc COMPILER=g++-6 CXXSTD=c++14
|
||||
compiler: g++-8
|
||||
env: TOOLSET=gcc COMPILER=g++-8 CXXSTD=03,11,14,17
|
||||
addons:
|
||||
apt:
|
||||
packages:
|
||||
- g++-6
|
||||
- g++-8
|
||||
sources:
|
||||
- ubuntu-toolchain-r-test
|
||||
|
||||
- os: linux
|
||||
env: TOOLSET=gcc COMPILER=g++-6 CXXSTD=c++1z
|
||||
compiler: g++-8
|
||||
env: UBSAN=1 TOOLSET=gcc COMPILER=g++-8 CXXSTD=03,11,14,17 UBSAN_OPTIONS=print_stacktrace=1 LINKFLAGS=-fuse-ld=gold
|
||||
addons:
|
||||
apt:
|
||||
packages:
|
||||
- g++-6
|
||||
- g++-8
|
||||
sources:
|
||||
- ubuntu-toolchain-r-test
|
||||
|
||||
- os: linux
|
||||
env: TOOLSET=clang COMPILER=clang++ CXXSTD=c++03
|
||||
compiler: clang++
|
||||
env: TOOLSET=clang COMPILER=clang++ CXXSTD=03,11
|
||||
|
||||
- os: linux
|
||||
env: TOOLSET=clang COMPILER=clang++ CXXSTD=c++11
|
||||
compiler: clang++-3.5
|
||||
env: TOOLSET=clang COMPILER=clang++-3.5 CXXSTD=03,11,14,1z
|
||||
addons:
|
||||
apt:
|
||||
packages:
|
||||
- clang-3.5
|
||||
- libstdc++-4.9-dev
|
||||
sources:
|
||||
- ubuntu-toolchain-r-test
|
||||
|
||||
- os: linux
|
||||
env: TOOLSET=clang COMPILER=clang++-3.6 CXXSTD=c++03
|
||||
compiler: clang++-3.6
|
||||
env: TOOLSET=clang COMPILER=clang++-3.6 CXXSTD=03,11,14,1z
|
||||
addons:
|
||||
apt:
|
||||
packages:
|
||||
- clang-3.6
|
||||
- libstdc++-4.9-dev
|
||||
sources:
|
||||
- ubuntu-toolchain-r-test
|
||||
- llvm-toolchain-precise-3.6
|
||||
|
||||
- os: linux
|
||||
env: TOOLSET=clang COMPILER=clang++-3.6 CXXSTD=c++11
|
||||
addons:
|
||||
apt:
|
||||
packages:
|
||||
- clang-3.6
|
||||
sources:
|
||||
- ubuntu-toolchain-r-test
|
||||
- llvm-toolchain-precise-3.6
|
||||
|
||||
- os: linux
|
||||
env: TOOLSET=clang COMPILER=clang++-3.7 CXXSTD=c++03
|
||||
addons:
|
||||
apt:
|
||||
packages:
|
||||
- clang-3.7
|
||||
sources:
|
||||
- ubuntu-toolchain-r-test
|
||||
- llvm-toolchain-precise-3.7
|
||||
|
||||
- os: linux
|
||||
env: TOOLSET=clang COMPILER=clang++-3.7 CXXSTD=c++11
|
||||
addons:
|
||||
apt:
|
||||
packages:
|
||||
- clang-3.7
|
||||
sources:
|
||||
- ubuntu-toolchain-r-test
|
||||
- llvm-toolchain-precise-3.7
|
||||
|
||||
- os: linux
|
||||
env: TOOLSET=clang COMPILER=clang++-3.8 CXXSTD=c++03
|
||||
compiler: clang++-3.8
|
||||
env: TOOLSET=clang COMPILER=clang++-3.8 CXXSTD=03,11,14,1z
|
||||
addons:
|
||||
apt:
|
||||
packages:
|
||||
- clang-3.8
|
||||
- libstdc++-4.9-dev
|
||||
sources:
|
||||
- ubuntu-toolchain-r-test
|
||||
- llvm-toolchain-precise-3.8
|
||||
|
||||
- os: linux
|
||||
env: TOOLSET=clang COMPILER=clang++-3.8 CXXSTD=c++11
|
||||
compiler: clang++-3.9
|
||||
env: TOOLSET=clang COMPILER=clang++-3.9 CXXSTD=03,11,14,1z
|
||||
addons:
|
||||
apt:
|
||||
packages:
|
||||
- clang-3.8
|
||||
- clang-3.9
|
||||
- libstdc++-4.9-dev
|
||||
sources:
|
||||
- ubuntu-toolchain-r-test
|
||||
- llvm-toolchain-precise-3.8
|
||||
|
||||
- os: linux
|
||||
env: TOOLSET=clang COMPILER=clang++-3.8 CXXSTD=c++14
|
||||
compiler: clang++-4.0
|
||||
env: TOOLSET=clang COMPILER=clang++-4.0 CXXSTD=03,11,14,1z
|
||||
addons:
|
||||
apt:
|
||||
packages:
|
||||
- clang-3.8
|
||||
- clang-4.0
|
||||
sources:
|
||||
- ubuntu-toolchain-r-test
|
||||
- llvm-toolchain-precise-3.8
|
||||
- llvm-toolchain-trusty-4.0
|
||||
|
||||
- os: linux
|
||||
env: TOOLSET=clang COMPILER=clang++-3.8 CXXSTD=c++1z
|
||||
compiler: clang++-5.0
|
||||
env: TOOLSET=clang COMPILER=clang++-5.0 CXXSTD=03,11,14,1z
|
||||
addons:
|
||||
apt:
|
||||
packages:
|
||||
- clang-3.8
|
||||
- clang-5.0
|
||||
sources:
|
||||
- ubuntu-toolchain-r-test
|
||||
- llvm-toolchain-precise-3.8
|
||||
- llvm-toolchain-trusty-5.0
|
||||
|
||||
- os: linux
|
||||
compiler: clang++-6.0
|
||||
env: TOOLSET=clang COMPILER=clang++-6.0 CXXSTD=03,11,14,17
|
||||
addons:
|
||||
apt:
|
||||
packages:
|
||||
- clang-6.0
|
||||
sources:
|
||||
- ubuntu-toolchain-r-test
|
||||
- llvm-toolchain-trusty-6.0
|
||||
|
||||
- os: linux
|
||||
compiler: clang++-7
|
||||
env: TOOLSET=clang COMPILER=clang++-7 CXXSTD=03,11,14,17
|
||||
addons:
|
||||
apt:
|
||||
packages:
|
||||
- clang-7
|
||||
sources:
|
||||
- ubuntu-toolchain-r-test
|
||||
- llvm-toolchain-trusty-7
|
||||
|
||||
- os: linux
|
||||
compiler: clang++-6.0
|
||||
env: UBSAN=1 TOOLSET=clang COMPILER=clang++-6.0 CXXSTD=03,11,14,1z UBSAN_OPTIONS=print_stacktrace=1
|
||||
addons:
|
||||
apt:
|
||||
packages:
|
||||
- clang-6.0
|
||||
- libstdc++-5-dev
|
||||
sources:
|
||||
- ubuntu-toolchain-r-test
|
||||
- llvm-toolchain-trusty-6.0
|
||||
|
||||
- os: linux
|
||||
compiler: clang++-libc++
|
||||
env: TOOLSET=clang COMPILER=clang++-libc++ CXXSTD=03,11,14,1z
|
||||
addons:
|
||||
apt:
|
||||
packages:
|
||||
- libc++-dev
|
||||
- libc++abi-dev
|
||||
|
||||
- os: linux
|
||||
compiler: clang++-libc++
|
||||
env: UBSAN=1 TOOLSET=clang COMPILER=clang++-libc++ CXXSTD=03,11,14,1z UBSAN_OPTIONS=print_stacktrace=1
|
||||
addons:
|
||||
apt:
|
||||
packages:
|
||||
- libc++-dev
|
||||
- libc++abi-dev
|
||||
|
||||
- os: osx
|
||||
env: TOOLSET=clang COMPILER=clang++ CXXSTD=c++03
|
||||
compiler: clang++
|
||||
env: TOOLSET=clang COMPILER=clang++ CXXSTD=03,11,14,1z
|
||||
osx_image: xcode7.3
|
||||
|
||||
- os: osx
|
||||
env: TOOLSET=clang COMPILER=clang++ CXXSTD=c++11
|
||||
compiler: clang++
|
||||
env: TOOLSET=clang COMPILER=clang++ CXXSTD=03,11,14,1z
|
||||
osx_image: xcode8.3
|
||||
|
||||
- os: osx
|
||||
env: TOOLSET=clang COMPILER=clang++ CXXSTD=c++14
|
||||
compiler: clang++
|
||||
env: TOOLSET=clang COMPILER=clang++ CXXSTD=03,11,14,1z
|
||||
osx_image: xcode9.4
|
||||
|
||||
- os: osx
|
||||
compiler: clang++
|
||||
env: TOOLSET=clang COMPILER=clang++ CXXSTD=03,11,14,1z
|
||||
osx_image: xcode10.1
|
||||
|
||||
- os: linux
|
||||
compiler: g++
|
||||
env: CMAKE_SUBDIR_TEST=1
|
||||
script:
|
||||
- cd libs/core/test/cmake_subdir_test && mkdir __build__ && cd __build__
|
||||
- cmake ..
|
||||
- cmake --build .
|
||||
- cmake --build . --target check
|
||||
|
||||
install:
|
||||
- BOOST_BRANCH=develop
|
||||
- if [ "$TRAVIS_BRANCH" = "master" ]; then BOOST_BRANCH=master; fi
|
||||
- cd ..
|
||||
- git clone -b $TRAVIS_BRANCH https://github.com/boostorg/boost.git boost-root
|
||||
- git clone -b $BOOST_BRANCH https://github.com/boostorg/boost.git boost-root
|
||||
- cd boost-root
|
||||
- git submodule init libs/headers
|
||||
- git submodule init libs/assert
|
||||
- git submodule init libs/config
|
||||
- git submodule init libs/predef
|
||||
- git submodule init libs/static_assert
|
||||
- git submodule init libs/type_traits
|
||||
- git submodule init tools/build
|
||||
- git submodule update
|
||||
- git submodule init tools/boost_install
|
||||
- git submodule update --jobs 4
|
||||
- cp -r $TRAVIS_BUILD_DIR/* libs/core
|
||||
- ./bootstrap.sh
|
||||
- ./b2 headers
|
||||
|
||||
script:
|
||||
- |-
|
||||
echo "using $TOOLSET : : $COMPILER : <cxxflags>-std=$CXXSTD ;" > ~/user-config.jam
|
||||
- ./b2 libs/core/test toolset=$TOOLSET
|
||||
echo "using $TOOLSET : : $COMPILER ;" > ~/user-config.jam
|
||||
- BUILD_JOBS=`(nproc || sysctl -n hw.ncpu) 2> /dev/null`
|
||||
- ./b2 -j $BUILD_JOBS libs/core/test toolset=$TOOLSET cxxstd=$CXXSTD variant=debug,release ${UBSAN:+cxxflags=-fsanitize=undefined cxxflags=-fno-sanitize-recover=undefined linkflags=-fsanitize=undefined define=UBSAN=1 debug-symbols=on} ${LINKFLAGS:+linkflags=$LINKFLAGS}
|
||||
|
||||
notifications:
|
||||
email:
|
||||
|
||||
21
CMakeLists.txt
Normal file
21
CMakeLists.txt
Normal file
@@ -0,0 +1,21 @@
|
||||
# Copyright 2018 Peter Dimov
|
||||
# Distributed under the Boost Software License, Version 1.0.
|
||||
# See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt
|
||||
|
||||
# Partial (add_subdirectory only) and experimental CMake support
|
||||
# Subject to change; please do not rely on the contents of this file yet
|
||||
|
||||
cmake_minimum_required(VERSION 3.5)
|
||||
|
||||
project(BoostCore LANGUAGES CXX)
|
||||
|
||||
add_library(boost_core INTERFACE)
|
||||
add_library(Boost::core ALIAS boost_core)
|
||||
|
||||
target_include_directories(boost_core INTERFACE include)
|
||||
|
||||
target_link_libraries(boost_core
|
||||
INTERFACE
|
||||
Boost::assert
|
||||
Boost::config
|
||||
)
|
||||
@@ -1,7 +1,7 @@
|
||||
Boost.Core
|
||||
==========
|
||||
|
||||
Boost.Core, part of collection of the [Boost C++ Libraries](http://github.com/boostorg), is a collection of core utilities used by other Boost libraries.
|
||||
Boost.Core, part of collection of the [Boost C++ Libraries](https://github.com/boostorg), is a collection of core utilities used by other Boost libraries.
|
||||
The criteria for inclusion is that the utility component be:
|
||||
|
||||
* simple,
|
||||
@@ -23,10 +23,10 @@ Master | [
|
||||
* [Documentation](https://boost.org/libs/core)
|
||||
* [Report bugs](https://svn.boost.org/trac/boost/newticket?component=core;version=Boost%20Release%20Branch). Be sure to mention Boost version, platform and compiler you're using. A small compilable code sample to reproduce the problem is always good as well.
|
||||
* Submit your patches as pull requests against **develop** branch. Note that by submitting patches you agree to license your modifications under the [Boost Software License, Version 1.0](http://www.boost.org/LICENSE_1_0.txt).
|
||||
* Submit your patches as pull requests against **develop** branch. Note that by submitting patches you agree to license your modifications under the [Boost Software License, Version 1.0](https://www.boost.org/LICENSE_1_0.txt).
|
||||
|
||||
### License
|
||||
|
||||
Distributed under the [Boost Software License, Version 1.0](http://boost.org/LICENSE_1_0.txt).
|
||||
Distributed under the [Boost Software License, Version 1.0](https://boost.org/LICENSE_1_0.txt).
|
||||
|
||||
54
appveyor.yml
54
appveyor.yml
@@ -1,4 +1,4 @@
|
||||
# Copyright 2016 Peter Dimov
|
||||
# Copyright 2016, 2017 Peter Dimov
|
||||
# Distributed under the Boost Software License, Version 1.0.
|
||||
# (See accompanying file LICENSE_1_0.txt or copy at http://boost.org/LICENSE_1_0.txt)
|
||||
|
||||
@@ -10,23 +10,67 @@ branches:
|
||||
only:
|
||||
- master
|
||||
- develop
|
||||
- /feature\/.*/
|
||||
|
||||
environment:
|
||||
matrix:
|
||||
- APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2013
|
||||
TOOLSET: msvc-9.0,msvc-10.0,msvc-11.0,msvc-12.0
|
||||
|
||||
- APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2015
|
||||
TOOLSET: msvc-14.0
|
||||
|
||||
- APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2017
|
||||
TOOLSET: msvc-14.1
|
||||
CXXSTD: 14,17
|
||||
|
||||
- APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2013
|
||||
ADDPATH: C:\cygwin\bin;
|
||||
TOOLSET: gcc
|
||||
CXXSTD: 03,11,14,1z
|
||||
|
||||
- APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2013
|
||||
ADDPATH: C:\cygwin64\bin;
|
||||
TOOLSET: gcc
|
||||
CXXSTD: 03,11,14,1z
|
||||
|
||||
- APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2013
|
||||
ADDPATH: C:\mingw\bin;
|
||||
TOOLSET: gcc
|
||||
CXXSTD: 03,11,14,1z
|
||||
|
||||
- APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2013
|
||||
ADDPATH: C:\mingw-w64\x86_64-6.3.0-posix-seh-rt_v5-rev1\mingw64\bin;
|
||||
TOOLSET: gcc
|
||||
CXXSTD: 03,11,14,1z
|
||||
|
||||
- APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2013
|
||||
ADDPATH: C:\mingw-w64\x86_64-7.2.0-posix-seh-rt_v5-rev1\mingw64\bin;
|
||||
TOOLSET: gcc
|
||||
CXXSTD: 03,11,14,1z
|
||||
|
||||
install:
|
||||
- set BOOST_BRANCH=develop
|
||||
- if "%APPVEYOR_REPO_BRANCH%" == "master" set BOOST_BRANCH=master
|
||||
- cd ..
|
||||
- git clone -b %APPVEYOR_REPO_BRANCH% https://github.com/boostorg/boost.git boost-root
|
||||
- git clone -b %BOOST_BRANCH% https://github.com/boostorg/boost.git boost-root
|
||||
- cd boost-root
|
||||
- git submodule init libs/headers
|
||||
- git submodule init libs/assert
|
||||
- git submodule init libs/config
|
||||
- git submodule init libs/predef
|
||||
- git submodule init libs/static_assert
|
||||
- git submodule init libs/type_traits
|
||||
- git submodule init tools/build
|
||||
- git submodule update
|
||||
- git submodule init tools/boost_install
|
||||
- git submodule update --jobs 4
|
||||
- xcopy /s /e /q %APPVEYOR_BUILD_FOLDER% libs\core
|
||||
- bootstrap
|
||||
- cmd /c bootstrap
|
||||
- b2 headers
|
||||
|
||||
build: off
|
||||
|
||||
test_script:
|
||||
- b2 libs/core/test toolset=msvc-9.0,msvc-10.0,msvc-11.0,msvc-14.0
|
||||
- PATH=%ADDPATH%%PATH%
|
||||
- if not "%CXXSTD%" == "" set CXXSTD=cxxstd=%CXXSTD%
|
||||
- b2 -j %NUMBER_OF_PROCESSORS% libs/core/test toolset=%TOOLSET% %CXXSTD%
|
||||
|
||||
3
doc/.gitignore
vendored
Normal file
3
doc/.gitignore
vendored
Normal file
@@ -0,0 +1,3 @@
|
||||
/html/
|
||||
/pdf/
|
||||
ref_reference.xml
|
||||
@@ -1,5 +1,5 @@
|
||||
# Copyright (c) 2014 Glen Joseph Fernandes
|
||||
# glenfe at live dot com
|
||||
# Copyright 2014 Glen Joseph Fernandes
|
||||
# (glenjofe@gmail.com)
|
||||
#
|
||||
# Distributed under the Boost Software License,
|
||||
# Version 1.0. (See accompanying file LICENSE_1_0.txt
|
||||
|
||||
15
doc/core.qbk
15
doc/core.qbk
@@ -1,10 +1,10 @@
|
||||
[/
|
||||
Copyright (c) 2014 Glen Joseph Fernandes
|
||||
glenfe at live dot com
|
||||
Copyright 2014 Glen Joseph Fernandes
|
||||
(glenjofe@gmail.com)
|
||||
|
||||
Distributed under the Boost Software License,
|
||||
Version 1.0. (See accompanying file LICENSE_1_0.txt
|
||||
or copy at http://boost.org/LICENSE_1_0.txt)
|
||||
Distributed under the Boost Software License,
|
||||
Version 1.0. (See accompanying file LICENSE_1_0.txt
|
||||
or copy at http://boost.org/LICENSE_1_0.txt)
|
||||
]
|
||||
|
||||
[library Boost.Core
|
||||
@@ -41,7 +41,9 @@ criteria for inclusion is that the utility component be:
|
||||
[include addressof.qbk]
|
||||
[include checked_delete.qbk]
|
||||
[include demangle.qbk]
|
||||
[include empty_value.qbk]
|
||||
[include enable_if.qbk]
|
||||
[include exchange.qbk]
|
||||
[include explicit_operator_bool.qbk]
|
||||
[include ignore_unused.qbk]
|
||||
[include is_same.qbk]
|
||||
@@ -49,7 +51,10 @@ criteria for inclusion is that the utility component be:
|
||||
[include no_exceptions_support.qbk]
|
||||
[include noncopyable.qbk]
|
||||
[include null_deleter.qbk]
|
||||
[include pointer_traits.qbk]
|
||||
[include quick_exit.qbk]
|
||||
[include ref.qbk]
|
||||
[include scoped_enum.qbk]
|
||||
[include swap.qbk]
|
||||
[include typeinfo.qbk]
|
||||
[include uncaught_exceptions.qbk]
|
||||
|
||||
137
doc/empty_value.qbk
Normal file
137
doc/empty_value.qbk
Normal file
@@ -0,0 +1,137 @@
|
||||
[/
|
||||
Copyright 2018 Glen Joseph Fernandes
|
||||
(glenjofe@gmail.com)
|
||||
|
||||
Distributed under the Boost Software License, Version 1.0.
|
||||
(http://www.boost.org/LICENSE_1_0.txt)
|
||||
]
|
||||
|
||||
[section:empty_value empty_value]
|
||||
|
||||
[simplesect Authors]
|
||||
|
||||
* Glen Fernandes
|
||||
|
||||
[endsimplesect]
|
||||
|
||||
[section Overview]
|
||||
|
||||
The header <boost/core/empty_value.hpp> provides the class template
|
||||
`boost::empty_value` for library authors to conveniently leverage the Empty
|
||||
Base Optimization to store objects of potentially empty types.
|
||||
|
||||
[endsect]
|
||||
|
||||
[section Examples]
|
||||
|
||||
The following example shows `boost::empty_value` used to create a type that
|
||||
stores a pointer, comparer, and allocator, where the comparer and allocator
|
||||
could be empty types.
|
||||
|
||||
```
|
||||
template<class Ptr, class Compare, class Allocator>
|
||||
class storage
|
||||
: empty_value<Compare, 0>
|
||||
, empty_value<Allocator, 1> {
|
||||
public:
|
||||
storage()
|
||||
: empty_value<Compare, 0>(empty_init_t())
|
||||
, empty_value<Allocator, 1>(empty_init_t())
|
||||
, ptr_() { }
|
||||
|
||||
storage(const Compare& c, const Allocator& a)
|
||||
: empty_value<Compare, 0>(empty_init_t(), c)
|
||||
, empty_value<Allocator, 1>(empty_init_t(), a)
|
||||
, ptr_() { }
|
||||
|
||||
const Ptr& pointer() const {
|
||||
return ptr_;
|
||||
}
|
||||
|
||||
Ptr& pointer() {
|
||||
return ptr_;
|
||||
}
|
||||
|
||||
const Compare& compare() const {
|
||||
return empty_value<Compare, 0>::get();
|
||||
}
|
||||
|
||||
Compare& compare() {
|
||||
return empty_value<Compare, 0>::get();
|
||||
}
|
||||
|
||||
const Allocator& allocator() const {
|
||||
return empty_value<Allocator, 1>::get();
|
||||
}
|
||||
|
||||
Allocator& allocator() {
|
||||
return empty_value<Allocator, 1>::get();
|
||||
}
|
||||
|
||||
private:
|
||||
Ptr ptr_;
|
||||
};
|
||||
```
|
||||
|
||||
[endsect]
|
||||
|
||||
[section Reference]
|
||||
|
||||
```
|
||||
namespace boost {
|
||||
|
||||
struct empty_init_t { };
|
||||
|
||||
template<class T, unsigned Index = 0, bool Empty = ``/see below/``>
|
||||
class empty_value {
|
||||
public:
|
||||
typedef T type;
|
||||
|
||||
empty_value() = default;
|
||||
|
||||
template<class... Args>
|
||||
explicit empty_value(empty_init_t, Args&&... args);
|
||||
|
||||
const T& get() const noexcept;
|
||||
|
||||
T& get() noexcept;
|
||||
};
|
||||
|
||||
} /* boost */
|
||||
```
|
||||
|
||||
[section Template parameters]
|
||||
|
||||
[variablelist
|
||||
[[`T`][The type of value to store]]
|
||||
[[`Index`][Optional: Specify to create a distinct base type]]
|
||||
[[`Empty`][Optional: Specify to force inheritance from type]]]
|
||||
|
||||
[endsect]
|
||||
|
||||
[section Member types]
|
||||
|
||||
[variablelist [[`type`][The template parameter `T`]]]
|
||||
|
||||
[endsect]
|
||||
|
||||
[section Constructors]
|
||||
|
||||
[variablelist
|
||||
[[`empty_value() = default;`][Default initialize the value]]
|
||||
[[`template<class... Args> empty_value(empty_init_t, Args&&... args);`]
|
||||
[Initialize the value with `std::forward<Args>(args)...`]]]
|
||||
|
||||
[endsect]
|
||||
|
||||
[section Member functions]
|
||||
|
||||
[variablelist
|
||||
[[`const T& get() const noexcept;`][Returns the value]]
|
||||
[[`T& get() noexcept;`][Returns the value]]]
|
||||
|
||||
[endsect]
|
||||
|
||||
[endsect]
|
||||
|
||||
[endsect]
|
||||
62
doc/exchange.qbk
Normal file
62
doc/exchange.qbk
Normal file
@@ -0,0 +1,62 @@
|
||||
[/
|
||||
Copyright 2018 Glen Joseph Fernandes
|
||||
(glenjofe@gmail.com)
|
||||
|
||||
Distributed under the Boost Software License, Version 1.0.
|
||||
(http://www.boost.org/LICENSE_1_0.txt)
|
||||
]
|
||||
|
||||
[section:exchange exchange]
|
||||
|
||||
[simplesect Authors]
|
||||
|
||||
* Glen Fernandes
|
||||
|
||||
[endsimplesect]
|
||||
|
||||
[section Overview]
|
||||
|
||||
The header <boost/core/exchange.hpp> provides the function template
|
||||
`boost::exchange` which is an implementation of the `std::exchange`
|
||||
function introduced in C++14.
|
||||
|
||||
[endsect]
|
||||
|
||||
[section Examples]
|
||||
|
||||
The following example shows `boost::exchange` used to simplify the
|
||||
implementation of a move constructor.
|
||||
|
||||
```
|
||||
Node(Node&& other)
|
||||
: head_(boost::exchange(other.head_, nullptr))
|
||||
, tail_(boost::exchange(other.tail_, nullptr)) { }
|
||||
```
|
||||
|
||||
[endsect]
|
||||
|
||||
[section Reference]
|
||||
|
||||
```
|
||||
namespace boost {
|
||||
template<class T, class U = T>
|
||||
constexpr T exchange(T& t, U&& u);
|
||||
}
|
||||
```
|
||||
[section Functions]
|
||||
|
||||
[*`template<class T, class U = T> constexpr T exchange(T& t, U&& u);`]
|
||||
|
||||
Equivalent to:
|
||||
|
||||
```
|
||||
T v = std::move(t);
|
||||
t = std::forward<U>(u);
|
||||
return v;
|
||||
```
|
||||
|
||||
[endsect]
|
||||
|
||||
[endsect]
|
||||
|
||||
[endsect]
|
||||
@@ -1,7 +1,8 @@
|
||||
[/
|
||||
Copyright 2010, 2011 Beman Dawes
|
||||
Copyright 2013 Ion Gaztanaga
|
||||
Copyright 2014 Peter Dimov
|
||||
Copyright 2014, 2017 Peter Dimov
|
||||
Copyright 2017 Kohei Takahashi
|
||||
|
||||
Distributed under the Boost Software License, Version 1.0.
|
||||
|
||||
@@ -36,6 +37,10 @@ When using `lightweight_test.hpp`, *do not forget* to
|
||||
#define BOOST_ERROR(message) /*unspecified*/
|
||||
#define BOOST_TEST_EQ(expr1, expr2) /*unspecified*/
|
||||
#define BOOST_TEST_NE(expr1, expr2) /*unspecified*/
|
||||
#define BOOST_TEST_LT(expr1, expr2) /*unspecified*/
|
||||
#define BOOST_TEST_LE(expr1, expr2) /*unspecified*/
|
||||
#define BOOST_TEST_GT(expr1, expr2) /*unspecified*/
|
||||
#define BOOST_TEST_GE(expr1, expr2) /*unspecified*/
|
||||
#define BOOST_TEST_CSTR_EQ(expr1, expr2) /*unspecified*/
|
||||
#define BOOST_TEST_CSTR_NE(expr1, expr2) /*unspecified*/
|
||||
#define BOOST_TEST_ALL_EQ(begin1, end1, begin2, end2) /* unspecified */
|
||||
@@ -89,7 +94,7 @@ Increases error count and outputs a message containing
|
||||
BOOST_TEST_EQ(expr1, expr2)
|
||||
``
|
||||
|
||||
If `expr1 != expr2` increases the error count and outputs a
|
||||
If `expr1 == expr2` is not true increases the error count and outputs a
|
||||
message containing both expressions.
|
||||
|
||||
[endsect]
|
||||
@@ -100,7 +105,51 @@ message containing both expressions.
|
||||
BOOST_TEST_NE(expr1, expr2)
|
||||
``
|
||||
|
||||
If `expr1 == expr2` increases the error count and outputs a
|
||||
If `expr1 != expr2` is not true increases the error count and outputs a
|
||||
message containing both expressions.
|
||||
|
||||
[endsect]
|
||||
|
||||
[section BOOST_TEST_LT]
|
||||
|
||||
``
|
||||
BOOST_TEST_LT(expr1, expr2)
|
||||
``
|
||||
|
||||
If `expr1 < expr2` is not true increases the error count and outputs a
|
||||
message containing both expressions.
|
||||
|
||||
[endsect]
|
||||
|
||||
[section BOOST_TEST_LE]
|
||||
|
||||
``
|
||||
BOOST_TEST_LE(expr1, expr2)
|
||||
``
|
||||
|
||||
If `expr1 <= expr2` is not true increases the error count and outputs a
|
||||
message containing both expressions.
|
||||
|
||||
[endsect]
|
||||
|
||||
[section BOOST_TEST_GT]
|
||||
|
||||
``
|
||||
BOOST_TEST_GT(expr1, expr2)
|
||||
``
|
||||
|
||||
If `expr1 > expr2` is not true increases the error count and outputs a
|
||||
message containing both expressions.
|
||||
|
||||
[endsect]
|
||||
|
||||
[section BOOST_TEST_GE]
|
||||
|
||||
``
|
||||
BOOST_TEST_GE(expr1, expr2)
|
||||
``
|
||||
|
||||
If `expr1 >= expr2` is not true increases the error count and outputs a
|
||||
message containing both expressions.
|
||||
|
||||
[endsect]
|
||||
@@ -111,7 +160,7 @@ message containing both expressions.
|
||||
BOOST_TEST_CSTR_EQ(expr1, expr2)
|
||||
``
|
||||
|
||||
Specialization of BOOST_TEST_EQ which interprets expr1 and expr2 as pointers to null-terminated byte strings (C strings). If `std::strcmp(expr1, expr2) != 0`, increase the error count and output a message containing both expressions.
|
||||
Specialization of `BOOST_TEST_EQ` which interprets `expr1` and `expr2` as pointers to null-terminated byte strings (C strings). If `std::strcmp(expr1, expr2) != 0`, increase the error count and output a message containing both expressions.
|
||||
|
||||
[endsect]
|
||||
|
||||
@@ -121,7 +170,7 @@ Specialization of BOOST_TEST_EQ which interprets expr1 and expr2 as pointers to
|
||||
BOOST_TEST_CSTR_NE(expr1, expr2)
|
||||
``
|
||||
|
||||
Specialization of BOOST_TEST_NE which interprets expr1 and expr2 as pointers to null-terminated byte strings (C strings). If `std::strcmp(expr1, expr2) == 0`, increase the error count and output a message containing both expressions.
|
||||
Specialization of `BOOST_TEST_NE` which interprets `expr1` and `expr2` as pointers to null-terminated byte strings (C strings). If `std::strcmp(expr1, expr2) == 0`, increase the error count and output a message containing both expressions.
|
||||
|
||||
[endsect]
|
||||
|
||||
|
||||
@@ -18,9 +18,9 @@
|
||||
|
||||
[section Header <boost/core/noncopyable.hpp>]
|
||||
|
||||
The header `<boost/noncopyable.hpp>` defines the class
|
||||
The header `<boost/core/noncopyable.hpp>` defines the class
|
||||
`boost::noncopyable`. It is intended to be used as a private
|
||||
base. `boost::noncopyable` has private (under C++03) or
|
||||
base class. `boost::noncopyable` has private (under C++03) or
|
||||
deleted (under C++11) copy constructor and a copy assignment
|
||||
operator and can't be copied or assigned; a class that derives
|
||||
from it inherits these properties.
|
||||
|
||||
150
doc/pointer_traits.qbk
Normal file
150
doc/pointer_traits.qbk
Normal file
@@ -0,0 +1,150 @@
|
||||
[/
|
||||
Copyright 2017-2018 Glen Joseph Fernandes
|
||||
(glenjofe@gmail.com)
|
||||
|
||||
Distributed under the Boost Software License, Version 1.0.
|
||||
(http://www.boost.org/LICENSE_1_0.txt)
|
||||
]
|
||||
|
||||
[section:pointer_traits pointer_traits]
|
||||
|
||||
[simplesect Authors]
|
||||
|
||||
* Glen Fernandes
|
||||
|
||||
[endsimplesect]
|
||||
|
||||
[section Overview]
|
||||
|
||||
The header <boost/core/pointer_traits.hpp> provides the class template
|
||||
`boost::pointer_traits` to facilitate use of pointer-like types. The C++11
|
||||
standard library introduced `std::pointer_traits` along with an allocator
|
||||
model which supported pointer-like types in addition to plain raw pointers.
|
||||
This implementation also supports C++98.
|
||||
|
||||
It also provides the function template `boost::to_address` to obtain a raw
|
||||
pointer from an object of any pointer-like type.
|
||||
|
||||
[endsect]
|
||||
|
||||
[section Examples]
|
||||
|
||||
The following example allocates storage and constructs an object in that
|
||||
storage using an allocator.
|
||||
|
||||
```
|
||||
template<class Allocator>
|
||||
void function(Allocator& a)
|
||||
{
|
||||
auto p = a.allocate(1);
|
||||
std::allocator_traits<Allocator>::construct(a, boost::to_address(p));
|
||||
}
|
||||
```
|
||||
|
||||
[endsect]
|
||||
|
||||
[section Reference]
|
||||
|
||||
```
|
||||
namespace boost {
|
||||
template<class T> struct pointer_traits {
|
||||
typedef T pointer;
|
||||
typedef ``['see below]`` element_type;
|
||||
typedef ``['see below]`` difference_type;
|
||||
|
||||
template<class U> struct rebind_to { typedef ``['see below]`` type; };
|
||||
template<class U> using rebind = typename rebind_to<U>::type;
|
||||
|
||||
static pointer pointer_to(``['see below]`` v);
|
||||
};
|
||||
|
||||
template<class T> struct pointer_traits<T*> {
|
||||
typedef T* pointer;
|
||||
typedef T element_type;
|
||||
typedef std::ptrdiff_t difference_type;
|
||||
|
||||
template<class U> struct rebind_to { typedef U* type; };
|
||||
template<class U> using rebind = typename rebind_to<U>::type;
|
||||
|
||||
static pointer pointer_to(``['see below]`` v) noexcept;
|
||||
};
|
||||
|
||||
template<class T>
|
||||
constexpr T* to_address(T* v) noexcept;
|
||||
|
||||
template<class T>
|
||||
auto to_address(const T& v) noexcept;
|
||||
}
|
||||
```
|
||||
|
||||
[section Member types]
|
||||
|
||||
[variablelist
|
||||
[[`typedef` ['see below] `element_type;`]
|
||||
[`T::element_type` if such a type exists; otherwise `U` if `T` is a class
|
||||
template instantiation of the form `Pointer<U, Args>`, where `Args` is zero
|
||||
or more type arguments; otherwise the specialization is ill-formed.]]
|
||||
[[`typedef` ['see below] `difference_type;`]
|
||||
[`T::difference_type` if such a type exists; otherwise `std::ptrdiff_t`.]]
|
||||
[[`template<class U> struct rebind_to { typedef` ['see below] `type; };`]
|
||||
[`type` is `T::rebind<U>` if such a type exists; otherwise, `Pointer<V, Args>`
|
||||
if `T` is a class template instantiation of the form `Pointer<T, Args>`,
|
||||
where `Args` is zero or more type arguments; otherwise, the instantiation of
|
||||
`rebind_to` is ill-formed.]]]
|
||||
|
||||
[endsect]
|
||||
|
||||
[section Member functions]
|
||||
|
||||
[variablelist
|
||||
[[`static pointer pointer_traits::pointer_to(`['see below] `v);`]
|
||||
[[variablelist
|
||||
[[Remark]
|
||||
[If `element_type` is a void type, the type of `v` is unspecified; otherwise,
|
||||
it is `element_type&`.]]
|
||||
[[Returns]
|
||||
[A pointer to `v` obtained by calling `T::pointer_to(v)`.]]]]]
|
||||
[[`static pointer pointer_traits<T*>::pointer_to(`['see below] `v) noexcept;`]
|
||||
[[variablelist
|
||||
[[Remark]
|
||||
[If `element_type` is a void type, the type of `v` is unspecified; otherwise,
|
||||
it is `element_type&`.]]
|
||||
[[Returns] [`addressof(v)`.]]]]]]
|
||||
|
||||
[endsect]
|
||||
|
||||
[section Optional members]
|
||||
|
||||
[variablelist
|
||||
[[`static element_type* to_address(pointer v) noexcept;`]
|
||||
[[variablelist
|
||||
[[Returns]
|
||||
[A pointer of type `element_type*` that references the same location as the
|
||||
argument `p`.]]
|
||||
[[Note]
|
||||
[This function should be the inverse of `pointer_to`. If defined, it
|
||||
customizes the behavior of the non-member function `to_address`.]]]]]]
|
||||
|
||||
[endsect]
|
||||
|
||||
[section Free functions]
|
||||
|
||||
[variablelist
|
||||
[[`template<class T> constexpr T* to_address(T* v) noexcept;`]
|
||||
[[variablelist [[Returns] [`v`.]]]]]
|
||||
[[`template<class T> auto to_address(const T& v) noexcept;`]
|
||||
[[variablelist [[Returns] [`pointer_traits<T>::to_address(v)` if that
|
||||
expression is well-formed, otherwise `to_address(v.operator->())`.]]]]]]
|
||||
|
||||
[endsect]
|
||||
|
||||
[endsect]
|
||||
|
||||
[section Acknowledgments]
|
||||
|
||||
Glen Fernandes implemented `pointer_traits` and `to_address` with reviews and
|
||||
guidance from Peter Dimov.
|
||||
|
||||
[endsect]
|
||||
|
||||
[endsect]
|
||||
40
doc/quick_exit.qbk
Normal file
40
doc/quick_exit.qbk
Normal file
@@ -0,0 +1,40 @@
|
||||
[/
|
||||
Copyright 2018 Peter Dimov
|
||||
|
||||
Distributed under the Boost Software License, Version 1.0.
|
||||
|
||||
See accompanying file LICENSE_1_0.txt
|
||||
or copy at http://boost.org/LICENSE_1_0.txt
|
||||
]
|
||||
|
||||
[section:quick_exit quick_exit]
|
||||
|
||||
[simplesect Authors]
|
||||
|
||||
* Peter Dimov
|
||||
|
||||
[endsimplesect]
|
||||
|
||||
[section Header <boost/core/quick_exit.hpp>]
|
||||
|
||||
The header `<boost/core/quick_exit.hpp>` defines the function
|
||||
`void boost::quick_exit(int code)`. It calls the standard C++11 function
|
||||
[@https://en.cppreference.com/w/cpp/utility/program/quick_exit
|
||||
`std::quick_exit(code)`], if that is available, and otherwise exits the
|
||||
process via [@https://en.cppreference.com/w/cpp/utility/program/_Exit
|
||||
`std::_Exit(code)`] or equivalent.
|
||||
|
||||
[section Synopsis]
|
||||
|
||||
``
|
||||
namespace boost
|
||||
{
|
||||
[[noreturn]] void quick_exit(int code) noexcept;
|
||||
}
|
||||
``
|
||||
|
||||
[endsect]
|
||||
|
||||
[endsect]
|
||||
|
||||
[endsect]
|
||||
52
doc/uncaught_exceptions.qbk
Normal file
52
doc/uncaught_exceptions.qbk
Normal file
@@ -0,0 +1,52 @@
|
||||
[/
|
||||
/ Copyright (c) 2018 Andrey Semashev
|
||||
/
|
||||
/ 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)
|
||||
/]
|
||||
|
||||
[section:uncaught_exceptions uncaught_exceptions]
|
||||
|
||||
[simplesect Authors]
|
||||
|
||||
* Andrey Semashev
|
||||
|
||||
[endsimplesect]
|
||||
|
||||
[section Header <boost/core/uncaught_exceptions.hpp>]
|
||||
|
||||
The header `<boost/core/uncaught_exceptions.hpp>` defines the `boost::core::uncaught_exceptions` function,
|
||||
which is a more portable implementation of the same named function introduced in C++17. The function
|
||||
returns the number of the currently pending exceptions. When that function returns a value greater than 0,
|
||||
throwing an exception from a destructor can terminate the program.
|
||||
|
||||
Unfortunately, the function cannot be implemented on every pre-C++17 compiler, although the most commonly
|
||||
used compilers are supported. When the compiler does not provide the necessary functionality,
|
||||
`boost::core::uncaught_exceptions` returns a non-zero value if at least one exception is pending (i.e. not
|
||||
necessarily the number of pending exceptions), and `BOOST_CORE_UNCAUGHT_EXCEPTIONS_EMULATED` macro
|
||||
is defined.
|
||||
|
||||
[section Example]
|
||||
``
|
||||
class my_class
|
||||
{
|
||||
private:
|
||||
const unsigned int m_exception_count;
|
||||
|
||||
public:
|
||||
my_class() : m_exception_count(boost::core::uncaught_exceptions())
|
||||
{
|
||||
}
|
||||
|
||||
~my_class() noexcept(false)
|
||||
{
|
||||
if (m_exception_count == boost::core::uncaught_exceptions())
|
||||
do_something_potentially_throwing();
|
||||
}
|
||||
};
|
||||
``
|
||||
[endsect]
|
||||
|
||||
[endsect]
|
||||
|
||||
[endsect]
|
||||
@@ -42,27 +42,27 @@ addressof(T& o) BOOST_NOEXCEPT
|
||||
|
||||
} /* boost */
|
||||
#else
|
||||
#include <boost/detail/workaround.hpp>
|
||||
#include <boost/config/workaround.hpp>
|
||||
#include <cstddef>
|
||||
|
||||
namespace boost {
|
||||
namespace detail {
|
||||
|
||||
template<class T>
|
||||
class addressof_ref {
|
||||
class addrof_ref {
|
||||
public:
|
||||
BOOST_FORCEINLINE addressof_ref(T& o) BOOST_NOEXCEPT
|
||||
BOOST_FORCEINLINE addrof_ref(T& o) BOOST_NOEXCEPT
|
||||
: o_(o) { }
|
||||
BOOST_FORCEINLINE operator T&() const BOOST_NOEXCEPT {
|
||||
return o_;
|
||||
}
|
||||
private:
|
||||
addressof_ref& operator=(const addressof_ref&);
|
||||
addrof_ref& operator=(const addrof_ref&);
|
||||
T& o_;
|
||||
};
|
||||
|
||||
template<class T>
|
||||
struct address_of {
|
||||
struct addrof {
|
||||
static BOOST_FORCEINLINE T* get(T& o, long) BOOST_NOEXCEPT {
|
||||
return reinterpret_cast<T*>(&
|
||||
const_cast<char&>(reinterpret_cast<const volatile char&>(o)));
|
||||
@@ -76,38 +76,38 @@ struct address_of {
|
||||
#if !defined(BOOST_NO_CXX11_DECLTYPE) && \
|
||||
(defined(__INTEL_COMPILER) || \
|
||||
(defined(__clang__) && !defined(_LIBCPP_VERSION)))
|
||||
typedef decltype(nullptr) addressof_null_t;
|
||||
typedef decltype(nullptr) addrof_null_t;
|
||||
#else
|
||||
typedef std::nullptr_t addressof_null_t;
|
||||
typedef std::nullptr_t addrof_null_t;
|
||||
#endif
|
||||
|
||||
template<>
|
||||
struct address_of<addressof_null_t> {
|
||||
typedef addressof_null_t type;
|
||||
struct addrof<addrof_null_t> {
|
||||
typedef addrof_null_t type;
|
||||
static BOOST_FORCEINLINE type* get(type& o, int) BOOST_NOEXCEPT {
|
||||
return &o;
|
||||
}
|
||||
};
|
||||
|
||||
template<>
|
||||
struct address_of<const addressof_null_t> {
|
||||
typedef const addressof_null_t type;
|
||||
struct addrof<const addrof_null_t> {
|
||||
typedef const addrof_null_t type;
|
||||
static BOOST_FORCEINLINE type* get(type& o, int) BOOST_NOEXCEPT {
|
||||
return &o;
|
||||
}
|
||||
};
|
||||
|
||||
template<>
|
||||
struct address_of<volatile addressof_null_t> {
|
||||
typedef volatile addressof_null_t type;
|
||||
struct addrof<volatile addrof_null_t> {
|
||||
typedef volatile addrof_null_t type;
|
||||
static BOOST_FORCEINLINE type* get(type& o, int) BOOST_NOEXCEPT {
|
||||
return &o;
|
||||
}
|
||||
};
|
||||
|
||||
template<>
|
||||
struct address_of<const volatile addressof_null_t> {
|
||||
typedef const volatile addressof_null_t type;
|
||||
struct addrof<const volatile addrof_null_t> {
|
||||
typedef const volatile addrof_null_t type;
|
||||
static BOOST_FORCEINLINE type* get(type& o, int) BOOST_NOEXCEPT {
|
||||
return &o;
|
||||
}
|
||||
@@ -117,7 +117,6 @@ struct address_of<const volatile addressof_null_t> {
|
||||
} /* detail */
|
||||
|
||||
#if defined(BOOST_NO_CXX11_SFINAE_EXPR) || \
|
||||
defined(BOOST_NO_CXX11_RVALUE_REFERENCES) || \
|
||||
defined(BOOST_NO_CXX11_CONSTEXPR) || \
|
||||
defined(BOOST_NO_CXX11_DECLTYPE)
|
||||
#define BOOST_CORE_NO_CONSTEXPR_ADDRESSOF
|
||||
@@ -128,9 +127,9 @@ addressof(T& o) BOOST_NOEXCEPT
|
||||
{
|
||||
#if BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x610)) || \
|
||||
BOOST_WORKAROUND(__SUNPRO_CC, <= 0x5120)
|
||||
return detail::address_of<T>::get(o, 0);
|
||||
return boost::detail::addrof<T>::get(o, 0);
|
||||
#else
|
||||
return detail::address_of<T>::get(detail::addressof_ref<T>(o), 0);
|
||||
return boost::detail::addrof<T>::get(boost::detail::addrof_ref<T>(o), 0);
|
||||
#endif
|
||||
}
|
||||
|
||||
@@ -138,14 +137,14 @@ addressof(T& o) BOOST_NOEXCEPT
|
||||
namespace detail {
|
||||
|
||||
template<class T>
|
||||
struct addressof_result {
|
||||
struct addrof_result {
|
||||
typedef T* type;
|
||||
};
|
||||
|
||||
} /* detail */
|
||||
|
||||
template<class T, std::size_t N>
|
||||
BOOST_FORCEINLINE typename detail::addressof_result<T[N]>::type
|
||||
BOOST_FORCEINLINE typename boost::detail::addrof_result<T[N]>::type
|
||||
addressof(T (&o)[N]) BOOST_NOEXCEPT
|
||||
{
|
||||
return &o;
|
||||
@@ -171,79 +170,79 @@ const T (*addressof(const T (&o)[N]) BOOST_NOEXCEPT)[N]
|
||||
namespace detail {
|
||||
|
||||
template<class T>
|
||||
T&& addressof_declval() BOOST_NOEXCEPT;
|
||||
T addrof_declval() BOOST_NOEXCEPT;
|
||||
|
||||
template<class>
|
||||
struct addressof_void {
|
||||
struct addrof_void {
|
||||
typedef void type;
|
||||
};
|
||||
|
||||
template<class T, class E = void>
|
||||
struct addressof_member_operator {
|
||||
struct addrof_member_operator {
|
||||
static constexpr bool value = false;
|
||||
};
|
||||
|
||||
template<class T>
|
||||
struct addressof_member_operator<T, typename
|
||||
addressof_void<decltype(addressof_declval<T&>().operator&())>::type> {
|
||||
struct addrof_member_operator<T, typename
|
||||
addrof_void<decltype(addrof_declval<T&>().operator&())>::type> {
|
||||
static constexpr bool value = true;
|
||||
};
|
||||
|
||||
#if BOOST_WORKAROUND(BOOST_INTEL, < 1600)
|
||||
struct addressof_addressable { };
|
||||
struct addrof_addressable { };
|
||||
|
||||
addressof_addressable*
|
||||
operator&(addressof_addressable&) BOOST_NOEXCEPT;
|
||||
addrof_addressable*
|
||||
operator&(addrof_addressable&) BOOST_NOEXCEPT;
|
||||
#endif
|
||||
|
||||
template<class T, class E = void>
|
||||
struct addressof_non_member_operator {
|
||||
struct addrof_non_member_operator {
|
||||
static constexpr bool value = false;
|
||||
};
|
||||
|
||||
template<class T>
|
||||
struct addressof_non_member_operator<T, typename
|
||||
addressof_void<decltype(operator&(addressof_declval<T&>()))>::type> {
|
||||
struct addrof_non_member_operator<T, typename
|
||||
addrof_void<decltype(operator&(addrof_declval<T&>()))>::type> {
|
||||
static constexpr bool value = true;
|
||||
};
|
||||
|
||||
template<class T, class E = void>
|
||||
struct addressof_expression {
|
||||
struct addrof_expression {
|
||||
static constexpr bool value = false;
|
||||
};
|
||||
|
||||
template<class T>
|
||||
struct addressof_expression<T,
|
||||
typename addressof_void<decltype(&addressof_declval<T&>())>::type> {
|
||||
struct addrof_expression<T,
|
||||
typename addrof_void<decltype(&addrof_declval<T&>())>::type> {
|
||||
static constexpr bool value = true;
|
||||
};
|
||||
|
||||
template<class T>
|
||||
struct addressof_is_constexpr {
|
||||
static constexpr bool value = addressof_expression<T>::value &&
|
||||
!addressof_member_operator<T>::value &&
|
||||
!addressof_non_member_operator<T>::value;
|
||||
struct addrof_is_constexpr {
|
||||
static constexpr bool value = addrof_expression<T>::value &&
|
||||
!addrof_member_operator<T>::value &&
|
||||
!addrof_non_member_operator<T>::value;
|
||||
};
|
||||
|
||||
template<bool E, class T>
|
||||
struct addressof_if { };
|
||||
struct addrof_if { };
|
||||
|
||||
template<class T>
|
||||
struct addressof_if<true, T> {
|
||||
struct addrof_if<true, T> {
|
||||
typedef T* type;
|
||||
};
|
||||
|
||||
template<class T>
|
||||
BOOST_FORCEINLINE
|
||||
typename addressof_if<!addressof_is_constexpr<T>::value, T>::type
|
||||
typename addrof_if<!addrof_is_constexpr<T>::value, T>::type
|
||||
addressof(T& o) BOOST_NOEXCEPT
|
||||
{
|
||||
return address_of<T>::get(addressof_ref<T>(o), 0);
|
||||
return addrof<T>::get(addrof_ref<T>(o), 0);
|
||||
}
|
||||
|
||||
template<class T>
|
||||
constexpr BOOST_FORCEINLINE
|
||||
typename addressof_if<addressof_is_constexpr<T>::value, T>::type
|
||||
typename addrof_if<addrof_is_constexpr<T>::value, T>::type
|
||||
addressof(T& o) BOOST_NOEXCEPT
|
||||
{
|
||||
return &o;
|
||||
@@ -255,11 +254,21 @@ template<class T>
|
||||
constexpr BOOST_FORCEINLINE T*
|
||||
addressof(T& o) BOOST_NOEXCEPT
|
||||
{
|
||||
return detail::addressof(o);
|
||||
return boost::detail::addressof(o);
|
||||
}
|
||||
#endif
|
||||
|
||||
} /* boost */
|
||||
#endif
|
||||
|
||||
#if !defined(BOOST_NO_CXX11_RVALUE_REFERENCES) && \
|
||||
!defined(BOOST_NO_CXX11_DELETED_FUNCTIONS)
|
||||
namespace boost {
|
||||
|
||||
template<class T>
|
||||
const T* addressof(const T&&) = delete;
|
||||
|
||||
} /* boost */
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
||||
136
include/boost/core/empty_value.hpp
Normal file
136
include/boost/core/empty_value.hpp
Normal file
@@ -0,0 +1,136 @@
|
||||
/*
|
||||
Copyright 2018 Glen Joseph Fernandes
|
||||
(glenjofe@gmail.com)
|
||||
|
||||
Distributed under the Boost Software License, Version 1.0.
|
||||
(http://www.boost.org/LICENSE_1_0.txt)
|
||||
*/
|
||||
#ifndef BOOST_CORE_EMPTY_VALUE_HPP
|
||||
#define BOOST_CORE_EMPTY_VALUE_HPP
|
||||
|
||||
#include <boost/config.hpp>
|
||||
#if !defined(BOOST_NO_CXX11_RVALUE_REFERENCES)
|
||||
#include <utility>
|
||||
#endif
|
||||
|
||||
#if defined(BOOST_GCC_VERSION) && (BOOST_GCC_VERSION >= 40700)
|
||||
#define BOOST_DETAIL_EMPTY_VALUE_BASE
|
||||
#elif defined(BOOST_INTEL) && defined(_MSC_VER) && (_MSC_VER >= 1800)
|
||||
#define BOOST_DETAIL_EMPTY_VALUE_BASE
|
||||
#elif defined(BOOST_MSVC) && (BOOST_MSVC >= 1800)
|
||||
#define BOOST_DETAIL_EMPTY_VALUE_BASE
|
||||
#elif defined(BOOST_CLANG) && !defined(__CUDACC__)
|
||||
#if __has_feature(is_empty) && __has_feature(is_final)
|
||||
#define BOOST_DETAIL_EMPTY_VALUE_BASE
|
||||
#endif
|
||||
#endif
|
||||
|
||||
namespace boost {
|
||||
|
||||
template<class T>
|
||||
struct use_empty_value_base {
|
||||
enum {
|
||||
#if defined(BOOST_DETAIL_EMPTY_VALUE_BASE)
|
||||
value = __is_empty(T) && !__is_final(T)
|
||||
#else
|
||||
value = false
|
||||
#endif
|
||||
};
|
||||
};
|
||||
|
||||
struct empty_init_t { };
|
||||
|
||||
namespace empty_ {
|
||||
|
||||
template<class T, unsigned N = 0,
|
||||
bool E = boost::use_empty_value_base<T>::value>
|
||||
class empty_value {
|
||||
public:
|
||||
typedef T type;
|
||||
|
||||
#if !defined(BOOST_NO_CXX11_DEFAULTED_FUNCTIONS)
|
||||
empty_value() = default;
|
||||
#else
|
||||
empty_value() { }
|
||||
#endif
|
||||
|
||||
empty_value(boost::empty_init_t)
|
||||
: value_() { }
|
||||
|
||||
#if !defined(BOOST_NO_CXX11_RVALUE_REFERENCES)
|
||||
#if !defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES)
|
||||
template<class... Args>
|
||||
explicit empty_value(boost::empty_init_t, Args&&... args)
|
||||
: value_(std::forward<Args>(args)...) { }
|
||||
#else
|
||||
template<class U>
|
||||
empty_value(boost::empty_init_t, U&& value)
|
||||
: value_(std::forward<U>(value)) { }
|
||||
#endif
|
||||
#else
|
||||
template<class U>
|
||||
empty_value(boost::empty_init_t, const U& value)
|
||||
: value_(value) { }
|
||||
#endif
|
||||
|
||||
const T& get() const BOOST_NOEXCEPT {
|
||||
return value_;
|
||||
}
|
||||
|
||||
T& get() BOOST_NOEXCEPT {
|
||||
return value_;
|
||||
}
|
||||
|
||||
private:
|
||||
T value_;
|
||||
};
|
||||
|
||||
#if !defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION)
|
||||
template<class T, unsigned N>
|
||||
class empty_value<T, N, true>
|
||||
: T {
|
||||
public:
|
||||
typedef T type;
|
||||
|
||||
#if !defined(BOOST_NO_CXX11_DEFAULTED_FUNCTIONS)
|
||||
empty_value() = default;
|
||||
#else
|
||||
empty_value() { }
|
||||
#endif
|
||||
|
||||
empty_value(boost::empty_init_t)
|
||||
: T() { }
|
||||
|
||||
#if !defined(BOOST_NO_CXX11_RVALUE_REFERENCES)
|
||||
#if !defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES)
|
||||
template<class... Args>
|
||||
explicit empty_value(boost::empty_init_t, Args&&... args)
|
||||
: T(std::forward<Args>(args)...) { }
|
||||
#else
|
||||
template<class U>
|
||||
empty_value(boost::empty_init_t, U&& value)
|
||||
: T(std::forward<U>(value)) { }
|
||||
#endif
|
||||
#else
|
||||
template<class U>
|
||||
empty_value(boost::empty_init_t, const U& value)
|
||||
: T(value) { }
|
||||
#endif
|
||||
|
||||
const T& get() const BOOST_NOEXCEPT {
|
||||
return *this;
|
||||
}
|
||||
|
||||
T& get() BOOST_NOEXCEPT {
|
||||
return *this;
|
||||
}
|
||||
};
|
||||
#endif
|
||||
|
||||
} /* empty_ */
|
||||
|
||||
using empty_::empty_value;
|
||||
|
||||
} /* boost */
|
||||
|
||||
#endif
|
||||
49
include/boost/core/exchange.hpp
Normal file
49
include/boost/core/exchange.hpp
Normal file
@@ -0,0 +1,49 @@
|
||||
/*
|
||||
Copyright 2018 Glen Joseph Fernandes
|
||||
(glenjofe@gmail.com)
|
||||
|
||||
Distributed under the Boost Software License, Version 1.0.
|
||||
(http://www.boost.org/LICENSE_1_0.txt)
|
||||
*/
|
||||
#ifndef BOOST_CORE_EXCHANGE_HPP
|
||||
#define BOOST_CORE_EXCHANGE_HPP
|
||||
|
||||
#include <boost/config.hpp>
|
||||
#if !defined(BOOST_NO_CXX11_RVALUE_REFERENCES)
|
||||
#include <boost/config/workaround.hpp>
|
||||
#include <utility>
|
||||
#endif
|
||||
|
||||
namespace boost {
|
||||
|
||||
#if defined(BOOST_NO_CXX11_RVALUE_REFERENCES)
|
||||
template<class T, class U>
|
||||
inline T exchange(T& t, const U& u)
|
||||
{
|
||||
T v = t;
|
||||
t = u;
|
||||
return v;
|
||||
}
|
||||
#else
|
||||
#if BOOST_WORKAROUND(BOOST_MSVC, < 1800)
|
||||
template<class T, class U>
|
||||
inline T exchange(T& t, U&& u)
|
||||
{
|
||||
T v = std::move(t);
|
||||
t = std::forward<U>(u);
|
||||
return v;
|
||||
}
|
||||
#else
|
||||
template<class T, class U = T>
|
||||
BOOST_CXX14_CONSTEXPR inline T exchange(T& t, U&& u)
|
||||
{
|
||||
T v = std::move(t);
|
||||
t = std::forward<U>(u);
|
||||
return v;
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
|
||||
} /* boost */
|
||||
|
||||
#endif
|
||||
@@ -19,6 +19,7 @@
|
||||
#define BOOST_CORE_EXPLICIT_OPERATOR_BOOL_HPP
|
||||
|
||||
#include <boost/config.hpp>
|
||||
#include <boost/config/workaround.hpp>
|
||||
|
||||
#ifdef BOOST_HAS_PRAGMA_ONCE
|
||||
#pragma once
|
||||
@@ -52,6 +53,8 @@
|
||||
return !this->operator! ();\
|
||||
}
|
||||
|
||||
#if !BOOST_WORKAROUND(BOOST_GCC, < 40700)
|
||||
|
||||
/*!
|
||||
* \brief The macro defines a constexpr explicit operator of conversion to \c bool
|
||||
*
|
||||
@@ -65,6 +68,12 @@
|
||||
return !this->operator! ();\
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
#define BOOST_CONSTEXPR_EXPLICIT_OPERATOR_BOOL() BOOST_EXPLICIT_OPERATOR_BOOL_NOEXCEPT()
|
||||
|
||||
#endif
|
||||
|
||||
#else // !defined(BOOST_NO_CXX11_EXPLICIT_CONVERSION_OPERATORS)
|
||||
|
||||
#if (defined(__SUNPRO_CC) && (__SUNPRO_CC <= 0x530)) && !defined(BOOST_NO_COMPILER_CONFIG)
|
||||
|
||||
@@ -14,17 +14,21 @@
|
||||
// Copyright (2) Beman Dawes 2010, 2011
|
||||
// Copyright (3) Ion Gaztanaga 2013
|
||||
//
|
||||
// Copyright 2018 Glen Joseph Fernandes
|
||||
// (glenjofe@gmail.com)
|
||||
//
|
||||
// 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 <iterator>
|
||||
#include <boost/assert.hpp>
|
||||
#include <boost/current_function.hpp>
|
||||
#include <boost/core/no_exceptions_support.hpp>
|
||||
#include <boost/current_function.hpp>
|
||||
#include <iostream>
|
||||
#include <iterator>
|
||||
#include <cstdlib>
|
||||
#include <cstring>
|
||||
#include <cstddef>
|
||||
|
||||
// IDE's like Visual Studio perform better if output goes to std::cout or
|
||||
// some other stream, so allow user to configure output stream:
|
||||
@@ -38,29 +42,45 @@ namespace boost
|
||||
namespace detail
|
||||
{
|
||||
|
||||
struct report_errors_reminder
|
||||
{
|
||||
bool called_report_errors_function;
|
||||
|
||||
report_errors_reminder() : called_report_errors_function(false) {}
|
||||
|
||||
~report_errors_reminder()
|
||||
{
|
||||
BOOST_ASSERT(called_report_errors_function); // verify report_errors() was called
|
||||
class test_result {
|
||||
public:
|
||||
test_result()
|
||||
: report_(false)
|
||||
, errors_(0) {
|
||||
#if defined(_MSC_VER) && (_MSC_VER > 1310)
|
||||
::_set_abort_behavior(0, _WRITE_ABORT_MSG | _CALL_REPORTFAULT);
|
||||
#endif
|
||||
}
|
||||
|
||||
~test_result() {
|
||||
if (!report_) {
|
||||
BOOST_LIGHTWEIGHT_TEST_OSTREAM << "main() should return report_errors()" << std::endl;
|
||||
std::abort();
|
||||
}
|
||||
}
|
||||
|
||||
int& errors() {
|
||||
return errors_;
|
||||
}
|
||||
|
||||
void done() {
|
||||
report_ = true;
|
||||
}
|
||||
|
||||
private:
|
||||
bool report_;
|
||||
int errors_;
|
||||
};
|
||||
|
||||
inline report_errors_reminder& report_errors_remind()
|
||||
inline test_result& test_results()
|
||||
{
|
||||
static report_errors_reminder r;
|
||||
return r;
|
||||
static test_result instance;
|
||||
return instance;
|
||||
}
|
||||
|
||||
inline int & test_errors()
|
||||
inline int& test_errors()
|
||||
{
|
||||
static int x = 0;
|
||||
report_errors_remind();
|
||||
return x;
|
||||
return test_results().errors();
|
||||
}
|
||||
|
||||
inline void test_failed_impl(char const * expr, char const * file, int line, char const * function)
|
||||
@@ -68,7 +88,7 @@ inline void test_failed_impl(char const * expr, char const * file, int line, cha
|
||||
BOOST_LIGHTWEIGHT_TEST_OSTREAM
|
||||
<< file << "(" << line << "): test '" << expr << "' failed in function '"
|
||||
<< function << "'" << std::endl;
|
||||
++test_errors();
|
||||
++test_results().errors();
|
||||
}
|
||||
|
||||
inline void error_impl(char const * msg, char const * file, int line, char const * function)
|
||||
@@ -76,7 +96,7 @@ inline void error_impl(char const * msg, char const * file, int line, char const
|
||||
BOOST_LIGHTWEIGHT_TEST_OSTREAM
|
||||
<< file << "(" << line << "): " << msg << " in function '"
|
||||
<< function << "'" << std::endl;
|
||||
++test_errors();
|
||||
++test_results().errors();
|
||||
}
|
||||
|
||||
inline void throw_failed_impl(char const * excep, char const * file, int line, char const * function)
|
||||
@@ -84,7 +104,7 @@ inline void throw_failed_impl(char const * excep, char const * file, int line, c
|
||||
BOOST_LIGHTWEIGHT_TEST_OSTREAM
|
||||
<< file << "(" << line << "): Exception '" << excep << "' not thrown in function '"
|
||||
<< function << "'" << std::endl;
|
||||
++test_errors();
|
||||
++test_results().errors();
|
||||
}
|
||||
|
||||
// In the comparisons below, it is possible that T and U are signed and unsigned integer types, which generates warnings in some compilers.
|
||||
@@ -113,37 +133,62 @@ inline const void* test_output_impl(unsigned char* v) { return v; }
|
||||
inline const void* test_output_impl(signed char* v) { return v; }
|
||||
template<class T> inline const void* test_output_impl(T volatile* v) { return const_cast<T*>(v); }
|
||||
|
||||
template<class T, class U> inline void test_eq_impl( char const * expr1, char const * expr2,
|
||||
char const * file, int line, char const * function, T const & t, U const & u )
|
||||
{
|
||||
if( t == u )
|
||||
{
|
||||
report_errors_remind();
|
||||
}
|
||||
else
|
||||
{
|
||||
BOOST_LIGHTWEIGHT_TEST_OSTREAM
|
||||
<< file << "(" << line << "): test '" << expr1 << " == " << expr2
|
||||
<< "' failed in function '" << function << "': "
|
||||
<< "'" << test_output_impl(t) << "' != '" << test_output_impl(u) << "'" << std::endl;
|
||||
++test_errors();
|
||||
}
|
||||
}
|
||||
#if !defined( BOOST_NO_CXX11_NULLPTR )
|
||||
inline const void* test_output_impl(std::nullptr_t) { return nullptr; }
|
||||
#endif
|
||||
|
||||
template<class T, class U> inline void test_ne_impl( char const * expr1, char const * expr2,
|
||||
char const * file, int line, char const * function, T const & t, U const & u )
|
||||
struct lw_test_eq {
|
||||
template <typename T, typename U>
|
||||
bool operator()(const T& t, const U& u) const { return t == u; }
|
||||
static const char* op() { return "=="; }
|
||||
};
|
||||
|
||||
struct lw_test_ne {
|
||||
template <typename T, typename U>
|
||||
bool operator()(const T& t, const U& u) const { return t != u; }
|
||||
static const char* op() { return "!="; }
|
||||
};
|
||||
|
||||
struct lw_test_lt {
|
||||
template <typename T, typename U>
|
||||
bool operator()(const T& t, const U& u) const { return t < u; }
|
||||
static const char* op() { return "<"; }
|
||||
};
|
||||
|
||||
struct lw_test_le {
|
||||
template <typename T, typename U>
|
||||
bool operator()(const T& t, const U& u) const { return t <= u; }
|
||||
static const char* op() { return "<="; }
|
||||
};
|
||||
|
||||
struct lw_test_gt {
|
||||
template <typename T, typename U>
|
||||
bool operator()(const T& t, const U& u) const { return t > u; }
|
||||
static const char* op() { return ">"; }
|
||||
};
|
||||
|
||||
struct lw_test_ge {
|
||||
template <typename T, typename U>
|
||||
bool operator()(const T& t, const U& u) const { return t >= u; }
|
||||
static const char* op() { return ">="; }
|
||||
};
|
||||
|
||||
template<class BinaryPredicate, class T, class U>
|
||||
inline void test_with_impl(BinaryPredicate pred, char const * expr1, char const * expr2,
|
||||
char const * file, int line, char const * function,
|
||||
T const & t, U const & u)
|
||||
{
|
||||
if( t != u )
|
||||
if( pred(t, u) )
|
||||
{
|
||||
report_errors_remind();
|
||||
test_results();
|
||||
}
|
||||
else
|
||||
{
|
||||
BOOST_LIGHTWEIGHT_TEST_OSTREAM
|
||||
<< file << "(" << line << "): test '" << expr1 << " != " << expr2
|
||||
<< "' failed in function '" << function << "': "
|
||||
<< "'" << test_output_impl(t) << "' == '" << test_output_impl(u) << "'" << std::endl;
|
||||
++test_errors();
|
||||
<< file << "(" << line << "): test '" << expr1 << " " << pred.op() << " " << expr2
|
||||
<< "' ('" << test_output_impl(t) << "' " << pred.op() << " '" << test_output_impl(u)
|
||||
<< "') failed in function '" << function << "'" << std::endl;
|
||||
++test_results().errors();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -152,15 +197,14 @@ inline void test_cstr_eq_impl( char const * expr1, char const * expr2,
|
||||
{
|
||||
if( std::strcmp(t, u) == 0 )
|
||||
{
|
||||
report_errors_remind();
|
||||
test_results();
|
||||
}
|
||||
else
|
||||
{
|
||||
BOOST_LIGHTWEIGHT_TEST_OSTREAM
|
||||
<< file << "(" << line << "): test '" << expr1 << " == " << expr2
|
||||
<< "' failed in function '" << function << "': "
|
||||
<< "'" << t << "' != '" << u << "'" << std::endl;
|
||||
++test_errors();
|
||||
<< file << "(" << line << "): test '" << expr1 << " == " << expr2 << "' ('" << t
|
||||
<< "' == '" << u << "') failed in function '" << function << "'" << std::endl;
|
||||
++test_results().errors();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -169,15 +213,14 @@ inline void test_cstr_ne_impl( char const * expr1, char const * expr2,
|
||||
{
|
||||
if( std::strcmp(t, u) != 0 )
|
||||
{
|
||||
report_errors_remind();
|
||||
test_results();
|
||||
}
|
||||
else
|
||||
{
|
||||
BOOST_LIGHTWEIGHT_TEST_OSTREAM
|
||||
<< file << "(" << line << "): test '" << expr1 << " == " << expr2
|
||||
<< "' failed in function '" << function << "': "
|
||||
<< "'" << t << "' == '" << u << "'" << std::endl;
|
||||
++test_errors();
|
||||
<< file << "(" << line << "): test '" << expr1 << " != " << expr2 << "' ('" << t
|
||||
<< "' != '" << u << "') failed in function '" << function << "'" << std::endl;
|
||||
++test_results().errors();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -240,12 +283,12 @@ void test_all_eq_impl(FormattedOutputFunction& output,
|
||||
|
||||
if (error_count == 0)
|
||||
{
|
||||
boost::detail::report_errors_remind();
|
||||
test_results();
|
||||
}
|
||||
else
|
||||
{
|
||||
output << std::endl;
|
||||
++boost::detail::test_errors();
|
||||
++test_results().errors();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -309,12 +352,12 @@ void test_all_with_impl(FormattedOutputFunction& output,
|
||||
|
||||
if (error_count == 0)
|
||||
{
|
||||
report_errors_remind();
|
||||
test_results();
|
||||
}
|
||||
else
|
||||
{
|
||||
output << std::endl;
|
||||
++test_errors();
|
||||
++test_results().errors();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -332,10 +375,10 @@ void test_all_with_impl(FormattedOutputFunction& output,
|
||||
|
||||
inline int report_errors()
|
||||
{
|
||||
boost::detail::report_errors_remind().called_report_errors_function = true;
|
||||
|
||||
int errors = boost::detail::test_errors();
|
||||
boost::detail::test_result& result = boost::detail::test_results();
|
||||
result.done();
|
||||
|
||||
int errors = result.errors();
|
||||
if( errors == 0 )
|
||||
{
|
||||
BOOST_LIGHTWEIGHT_TEST_OSTREAM
|
||||
@@ -352,13 +395,18 @@ inline int report_errors()
|
||||
|
||||
} // namespace boost
|
||||
|
||||
#define BOOST_TEST(expr) ((expr)? (void)0: ::boost::detail::test_failed_impl(#expr, __FILE__, __LINE__, BOOST_CURRENT_FUNCTION))
|
||||
#define BOOST_TEST(expr) ((expr)? (void)::boost::detail::test_results(): ::boost::detail::test_failed_impl(#expr, __FILE__, __LINE__, BOOST_CURRENT_FUNCTION))
|
||||
#define BOOST_TEST_NOT(expr) BOOST_TEST(!(expr))
|
||||
|
||||
#define BOOST_ERROR(msg) ( ::boost::detail::error_impl(msg, __FILE__, __LINE__, BOOST_CURRENT_FUNCTION) )
|
||||
|
||||
#define BOOST_TEST_EQ(expr1,expr2) ( ::boost::detail::test_eq_impl(#expr1, #expr2, __FILE__, __LINE__, BOOST_CURRENT_FUNCTION, expr1, expr2) )
|
||||
#define BOOST_TEST_NE(expr1,expr2) ( ::boost::detail::test_ne_impl(#expr1, #expr2, __FILE__, __LINE__, BOOST_CURRENT_FUNCTION, expr1, expr2) )
|
||||
#define BOOST_TEST_EQ(expr1,expr2) ( ::boost::detail::test_with_impl(::boost::detail::lw_test_eq(), #expr1, #expr2, __FILE__, __LINE__, BOOST_CURRENT_FUNCTION, expr1, expr2) )
|
||||
#define BOOST_TEST_NE(expr1,expr2) ( ::boost::detail::test_with_impl(::boost::detail::lw_test_ne(), #expr1, #expr2, __FILE__, __LINE__, BOOST_CURRENT_FUNCTION, expr1, expr2) )
|
||||
|
||||
#define BOOST_TEST_LT(expr1,expr2) ( ::boost::detail::test_with_impl(::boost::detail::lw_test_lt(), #expr1, #expr2, __FILE__, __LINE__, BOOST_CURRENT_FUNCTION, expr1, expr2) )
|
||||
#define BOOST_TEST_LE(expr1,expr2) ( ::boost::detail::test_with_impl(::boost::detail::lw_test_le(), #expr1, #expr2, __FILE__, __LINE__, BOOST_CURRENT_FUNCTION, expr1, expr2) )
|
||||
#define BOOST_TEST_GT(expr1,expr2) ( ::boost::detail::test_with_impl(::boost::detail::lw_test_gt(), #expr1, #expr2, __FILE__, __LINE__, BOOST_CURRENT_FUNCTION, expr1, expr2) )
|
||||
#define BOOST_TEST_GE(expr1,expr2) ( ::boost::detail::test_with_impl(::boost::detail::lw_test_ge(), #expr1, #expr2, __FILE__, __LINE__, BOOST_CURRENT_FUNCTION, expr1, expr2) )
|
||||
|
||||
#define BOOST_TEST_CSTR_EQ(expr1,expr2) ( ::boost::detail::test_cstr_eq_impl(#expr1, #expr2, __FILE__, __LINE__, BOOST_CURRENT_FUNCTION, expr1, expr2) )
|
||||
#define BOOST_TEST_CSTR_NE(expr1,expr2) ( ::boost::detail::test_cstr_ne_impl(#expr1, #expr2, __FILE__, __LINE__, BOOST_CURRENT_FUNCTION, expr1, expr2) )
|
||||
@@ -374,6 +422,7 @@ inline int report_errors()
|
||||
(#EXCEP, __FILE__, __LINE__, BOOST_CURRENT_FUNCTION); \
|
||||
} \
|
||||
catch(EXCEP const&) { \
|
||||
::boost::detail::test_results(); \
|
||||
} \
|
||||
catch(...) { \
|
||||
::boost::detail::throw_failed_impl \
|
||||
|
||||
@@ -31,7 +31,7 @@ template< class T > inline void test_trait_impl( char const * trait, void (*)( T
|
||||
{
|
||||
if( T::value == expected )
|
||||
{
|
||||
report_errors_remind();
|
||||
test_results();
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -42,7 +42,7 @@ template< class T > inline void test_trait_impl( char const * trait, void (*)( T
|
||||
<< "' (should have been " << ( expected? "true": "false" ) << ")"
|
||||
<< std::endl;
|
||||
|
||||
++test_errors();
|
||||
++test_results().errors();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -21,7 +21,7 @@
|
||||
//----------------------------------------------------------------------
|
||||
|
||||
#include <boost/config.hpp>
|
||||
#include <boost/detail/workaround.hpp>
|
||||
#include <boost/config/workaround.hpp>
|
||||
|
||||
#if !(defined BOOST_NO_EXCEPTIONS)
|
||||
# define BOOST_TRY { try
|
||||
|
||||
@@ -20,7 +20,22 @@ namespace boost {
|
||||
|
||||
namespace noncopyable_ // protection from unintended ADL
|
||||
{
|
||||
class noncopyable
|
||||
#ifndef BOOST_NONCOPYABLE_BASE_TOKEN_DEFINED
|
||||
#define BOOST_NONCOPYABLE_BASE_TOKEN_DEFINED
|
||||
|
||||
// noncopyable derives from base_token to enable Type Traits to detect
|
||||
// whether a type derives from noncopyable without needing the definition
|
||||
// of noncopyable itself.
|
||||
//
|
||||
// The definition of base_token is macro-guarded so that Type Trais can
|
||||
// define it locally without including this header, to avoid a dependency
|
||||
// on Core.
|
||||
|
||||
struct base_token {};
|
||||
|
||||
#endif // #ifndef BOOST_NONCOPYABLE_BASE_TOKEN_DEFINED
|
||||
|
||||
class noncopyable: base_token
|
||||
{
|
||||
protected:
|
||||
#if !defined(BOOST_NO_CXX11_DEFAULTED_FUNCTIONS) && !defined(BOOST_NO_CXX11_NON_PUBLIC_DEFAULTED_FUNCTIONS)
|
||||
|
||||
233
include/boost/core/pointer_traits.hpp
Normal file
233
include/boost/core/pointer_traits.hpp
Normal file
@@ -0,0 +1,233 @@
|
||||
/*
|
||||
Copyright 2017-2018 Glen Joseph Fernandes
|
||||
(glenjofe@gmail.com)
|
||||
|
||||
Distributed under the Boost Software License, Version 1.0.
|
||||
(http://www.boost.org/LICENSE_1_0.txt)
|
||||
*/
|
||||
#ifndef BOOST_CORE_POINTER_TRAITS_HPP
|
||||
#define BOOST_CORE_POINTER_TRAITS_HPP
|
||||
|
||||
#include <boost/config.hpp>
|
||||
#if !defined(BOOST_NO_CXX11_POINTER_TRAITS)
|
||||
#include <memory>
|
||||
#else
|
||||
#include <boost/core/addressof.hpp>
|
||||
#endif
|
||||
|
||||
namespace boost {
|
||||
|
||||
#if !defined(BOOST_NO_CXX11_POINTER_TRAITS)
|
||||
template<class T>
|
||||
struct pointer_traits
|
||||
: std::pointer_traits<T> {
|
||||
template<class U>
|
||||
struct rebind_to {
|
||||
typedef typename std::pointer_traits<T>::template rebind<U> type;
|
||||
};
|
||||
};
|
||||
|
||||
template<class T>
|
||||
struct pointer_traits<T*>
|
||||
: std::pointer_traits<T*> {
|
||||
template<class U>
|
||||
struct rebind_to {
|
||||
typedef U* type;
|
||||
};
|
||||
};
|
||||
#else
|
||||
namespace detail {
|
||||
|
||||
template<class>
|
||||
struct ptr_void {
|
||||
typedef void type;
|
||||
};
|
||||
|
||||
template<class T>
|
||||
struct ptr_first;
|
||||
|
||||
#if !defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES)
|
||||
template<template<class, class...> class T, class U, class... Args>
|
||||
struct ptr_first<T<U, Args...> > {
|
||||
typedef U type;
|
||||
};
|
||||
#else
|
||||
template<template<class> class T, class U>
|
||||
struct ptr_first<T<U> > {
|
||||
typedef U type;
|
||||
};
|
||||
|
||||
template<template<class, class> class T, class U1, class U2>
|
||||
struct ptr_first<T<U1, U2> > {
|
||||
typedef U1 type;
|
||||
};
|
||||
|
||||
template<template<class, class, class> class T, class U1, class U2, class U3>
|
||||
struct ptr_first<T<U1, U2, U3> > {
|
||||
typedef U1 type;
|
||||
};
|
||||
#endif
|
||||
|
||||
template<class T, class = void>
|
||||
struct ptr_element {
|
||||
typedef typename ptr_first<T>::type type;
|
||||
};
|
||||
|
||||
template<class T>
|
||||
struct ptr_element<T, typename ptr_void<typename T::element_type>::type> {
|
||||
typedef typename T::element_type type;
|
||||
};
|
||||
|
||||
template<class, class = void>
|
||||
struct ptr_difference {
|
||||
typedef std::ptrdiff_t type;
|
||||
};
|
||||
|
||||
template<class T>
|
||||
struct ptr_difference<T,
|
||||
typename ptr_void<typename T::difference_type>::type> {
|
||||
typedef typename T::difference_type type;
|
||||
};
|
||||
|
||||
template<class T, class V>
|
||||
struct ptr_transform;
|
||||
|
||||
#if !defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES)
|
||||
template<template<class, class...> class T, class U, class... Args, class V>
|
||||
struct ptr_transform<T<U, Args...>, V> {
|
||||
typedef T<V, Args...> type;
|
||||
};
|
||||
#else
|
||||
template<template<class> class T, class U, class V>
|
||||
struct ptr_transform<T<U>, V> {
|
||||
typedef T<V> type;
|
||||
};
|
||||
|
||||
template<template<class, class> class T, class U1, class U2, class V>
|
||||
struct ptr_transform<T<U1, U2>, V> {
|
||||
typedef T<V, U2> type;
|
||||
};
|
||||
|
||||
template<template<class, class, class> class T,
|
||||
class U1, class U2, class U3, class V>
|
||||
struct ptr_transform<T<U1, U2, U3>, V> {
|
||||
typedef T<V, U2, U3> type;
|
||||
};
|
||||
#endif
|
||||
|
||||
template<class T, class U, class = void>
|
||||
struct ptr_rebind {
|
||||
typedef typename ptr_transform<T, U>::type type;
|
||||
};
|
||||
|
||||
#if !defined(BOOST_NO_CXX11_TEMPLATE_ALIASES)
|
||||
template<class T, class U>
|
||||
struct ptr_rebind<T, U,
|
||||
typename ptr_void<typename T::template rebind<U> >::type> {
|
||||
typedef typename T::template rebind<U> type;
|
||||
};
|
||||
#endif
|
||||
|
||||
template<class T>
|
||||
struct ptr_value {
|
||||
typedef T type;
|
||||
};
|
||||
|
||||
template<>
|
||||
struct ptr_value<void> {
|
||||
typedef struct { } type;
|
||||
};
|
||||
|
||||
} /* detail */
|
||||
|
||||
template<class T>
|
||||
struct pointer_traits {
|
||||
typedef T pointer;
|
||||
typedef typename detail::ptr_element<T>::type element_type;
|
||||
typedef typename detail::ptr_difference<T>::type difference_type;
|
||||
template<class U>
|
||||
struct rebind_to {
|
||||
typedef typename detail::ptr_rebind<T, U>::type type;
|
||||
};
|
||||
#if !defined(BOOST_NO_CXX11_TEMPLATE_ALIASES)
|
||||
template<class U>
|
||||
using rebind = typename detail::ptr_rebind<T, U>::type;
|
||||
#endif
|
||||
static pointer
|
||||
pointer_to(typename detail::ptr_value<element_type>::type& v) {
|
||||
return pointer::pointer_to(v);
|
||||
}
|
||||
};
|
||||
|
||||
template<class T>
|
||||
struct pointer_traits<T*> {
|
||||
typedef T* pointer;
|
||||
typedef T element_type;
|
||||
typedef std::ptrdiff_t difference_type;
|
||||
template<class U>
|
||||
struct rebind_to {
|
||||
typedef U* type;
|
||||
};
|
||||
#if !defined(BOOST_NO_CXX11_TEMPLATE_ALIASES)
|
||||
template<class U>
|
||||
using rebind = U*;
|
||||
#endif
|
||||
static T*
|
||||
pointer_to(typename detail::ptr_value<T>::type& v) BOOST_NOEXCEPT {
|
||||
return boost::addressof(v);
|
||||
}
|
||||
};
|
||||
#endif
|
||||
|
||||
template<class T>
|
||||
BOOST_CONSTEXPR inline T*
|
||||
to_address(T* v) BOOST_NOEXCEPT
|
||||
{
|
||||
return v;
|
||||
}
|
||||
|
||||
#if !defined(BOOST_NO_CXX14_RETURN_TYPE_DEDUCTION)
|
||||
namespace detail {
|
||||
|
||||
template<class T>
|
||||
inline T*
|
||||
ptr_address(T* v, int) BOOST_NOEXCEPT
|
||||
{
|
||||
return v;
|
||||
}
|
||||
|
||||
template<class T>
|
||||
inline auto
|
||||
ptr_address(const T& v, int) BOOST_NOEXCEPT
|
||||
-> decltype(boost::pointer_traits<T>::to_address(v))
|
||||
{
|
||||
return boost::pointer_traits<T>::to_address(v);
|
||||
}
|
||||
|
||||
template<class T>
|
||||
inline auto
|
||||
ptr_address(const T& v, long) BOOST_NOEXCEPT
|
||||
{
|
||||
return boost::detail::ptr_address(v.operator->(), 0);
|
||||
}
|
||||
|
||||
} /* detail */
|
||||
|
||||
template<class T>
|
||||
inline auto
|
||||
to_address(const T& v) BOOST_NOEXCEPT
|
||||
{
|
||||
return boost::detail::ptr_address(v, 0);
|
||||
}
|
||||
#else
|
||||
template<class T>
|
||||
inline typename pointer_traits<T>::element_type*
|
||||
to_address(const T& v) BOOST_NOEXCEPT
|
||||
{
|
||||
return boost::to_address(v.operator->());
|
||||
}
|
||||
#endif
|
||||
|
||||
} /* boost */
|
||||
|
||||
#endif
|
||||
59
include/boost/core/quick_exit.hpp
Normal file
59
include/boost/core/quick_exit.hpp
Normal file
@@ -0,0 +1,59 @@
|
||||
#ifndef BOOST_CORE_QUICK_EXIT_HPP_INCLUDED
|
||||
#define BOOST_CORE_QUICK_EXIT_HPP_INCLUDED
|
||||
|
||||
// MS compatible compilers support #pragma once
|
||||
|
||||
#if defined(_MSC_VER) && (_MSC_VER >= 1020)
|
||||
# pragma once
|
||||
#endif
|
||||
|
||||
// boost/core/quick_exit.hpp
|
||||
//
|
||||
// Copyright 2018 Peter Dimov
|
||||
//
|
||||
// Distributed under the Boost Software License, Version 1.0.
|
||||
// See accompanying file LICENSE_1_0.txt or copy at
|
||||
// http://www.boost.org/LICENSE_1_0.txt)
|
||||
|
||||
#include <boost/config.hpp>
|
||||
#include <cstdlib>
|
||||
|
||||
#if defined(__MINGW32__) && !defined(__MINGW64_VERSION_MAJOR)
|
||||
|
||||
extern "C" _CRTIMP __cdecl __MINGW_NOTHROW void _exit (int) __MINGW_ATTRIB_NORETURN;
|
||||
|
||||
#endif
|
||||
|
||||
#if defined(__CYGWIN__) && __cplusplus < 201103L
|
||||
|
||||
extern "C" _Noreturn void quick_exit(int);
|
||||
|
||||
#endif
|
||||
|
||||
namespace boost
|
||||
{
|
||||
|
||||
BOOST_NORETURN void quick_exit( int code ) BOOST_NOEXCEPT
|
||||
{
|
||||
#if defined(_MSC_VER) && _MSC_VER < 1900
|
||||
|
||||
::_exit( code );
|
||||
|
||||
#elif defined(__MINGW32__)
|
||||
|
||||
::_exit( code );
|
||||
|
||||
#elif defined(__APPLE__)
|
||||
|
||||
::_Exit( code );
|
||||
|
||||
#else
|
||||
|
||||
::quick_exit( code );
|
||||
|
||||
#endif
|
||||
}
|
||||
|
||||
} // namespace boost
|
||||
|
||||
#endif // #ifndef BOOST_CORE_QUICK_EXIT_HPP_INCLUDED
|
||||
@@ -8,8 +8,8 @@
|
||||
#endif
|
||||
|
||||
#include <boost/config.hpp>
|
||||
#include <boost/utility/addressof.hpp>
|
||||
#include <boost/detail/workaround.hpp>
|
||||
#include <boost/config/workaround.hpp>
|
||||
#include <boost/core/addressof.hpp>
|
||||
|
||||
//
|
||||
// ref.hpp - ref/cref, useful helper functions
|
||||
@@ -19,7 +19,8 @@
|
||||
// Copyright (C) 2002 David Abrahams
|
||||
//
|
||||
// Copyright (C) 2014 Glen Joseph Fernandes
|
||||
// glenfe at live dot com
|
||||
// (glenjofe@gmail.com)
|
||||
//
|
||||
// Copyright (C) 2014 Agustin Berge
|
||||
//
|
||||
// Distributed under the Boost Software License, Version 1.0. (See
|
||||
|
||||
@@ -21,13 +21,19 @@
|
||||
// avoid ambiguity when swapping objects of a Boost type that does
|
||||
// not have its own boost::swap overload.
|
||||
|
||||
#include <boost/core/enable_if.hpp>
|
||||
#include <boost/config.hpp>
|
||||
#include <utility> //for std::swap (C++11)
|
||||
#include <algorithm> //for std::swap (C++98)
|
||||
#include <cstddef> //for std::size_t
|
||||
#include <boost/config.hpp>
|
||||
|
||||
namespace boost_swap_impl
|
||||
{
|
||||
// we can't use type_traits here
|
||||
|
||||
template<class T> struct is_const { enum _vt { value = 0 }; };
|
||||
template<class T> struct is_const<T const> { enum _vt { value = 1 }; };
|
||||
|
||||
template<class T>
|
||||
BOOST_GPU_ENABLED
|
||||
void swap_impl(T& left, T& right)
|
||||
@@ -51,7 +57,8 @@ namespace boost
|
||||
{
|
||||
template<class T1, class T2>
|
||||
BOOST_GPU_ENABLED
|
||||
void swap(T1& left, T2& right)
|
||||
typename enable_if_c< !boost_swap_impl::is_const<T1>::value && !boost_swap_impl::is_const<T2>::value >::type
|
||||
swap(T1& left, T2& right)
|
||||
{
|
||||
::boost_swap_impl::swap_impl(left, right);
|
||||
}
|
||||
|
||||
@@ -21,6 +21,7 @@
|
||||
|
||||
#include <boost/current_function.hpp>
|
||||
#include <functional>
|
||||
#include <cstring>
|
||||
|
||||
namespace boost
|
||||
{
|
||||
@@ -36,26 +37,43 @@ private:
|
||||
typeinfo& operator=( typeinfo const& );
|
||||
|
||||
char const * name_;
|
||||
void (*lib_id_)();
|
||||
|
||||
public:
|
||||
|
||||
explicit typeinfo( char const * name ): name_( name )
|
||||
typeinfo( char const * name, void (*lib_id)() ): name_( name ), lib_id_( lib_id )
|
||||
{
|
||||
}
|
||||
|
||||
bool operator==( typeinfo const& rhs ) const
|
||||
{
|
||||
#if ( defined(_WIN32) || defined(__CYGWIN__) ) && defined(__GNUC__) && !defined(BOOST_DISABLE_CURRENT_FUNCTION)
|
||||
|
||||
return lib_id_ == rhs.lib_id_? this == &rhs: std::strcmp( name_, rhs.name_ ) == 0;
|
||||
|
||||
#else
|
||||
|
||||
return this == &rhs;
|
||||
|
||||
#endif
|
||||
}
|
||||
|
||||
bool operator!=( typeinfo const& rhs ) const
|
||||
{
|
||||
return this != &rhs;
|
||||
return !( *this == rhs );
|
||||
}
|
||||
|
||||
bool before( typeinfo const& rhs ) const
|
||||
{
|
||||
#if ( defined(_WIN32) || defined(__CYGWIN__) ) && defined(__GNUC__) && !defined(BOOST_DISABLE_CURRENT_FUNCTION)
|
||||
|
||||
return lib_id_ == rhs.lib_id_? std::less< typeinfo const* >()( this, &rhs ): std::strcmp( name_, rhs.name_ ) < 0;
|
||||
|
||||
#else
|
||||
|
||||
return std::less< typeinfo const* >()( this, &rhs );
|
||||
|
||||
#endif
|
||||
}
|
||||
|
||||
char const* name() const
|
||||
@@ -74,7 +92,7 @@ inline char const * demangled_name( core::typeinfo const & ti )
|
||||
namespace detail
|
||||
{
|
||||
|
||||
template<class T> struct core_typeid_
|
||||
template<class T> struct BOOST_SYMBOL_VISIBLE core_typeid_
|
||||
{
|
||||
static boost::core::typeinfo ti_;
|
||||
|
||||
@@ -84,13 +102,11 @@ template<class T> struct core_typeid_
|
||||
}
|
||||
};
|
||||
|
||||
#if defined(__SUNPRO_CC)
|
||||
// see #4199, the Sun Studio compiler gets confused about static initialization
|
||||
// constructor arguments. But an assignment works just fine.
|
||||
template<class T> boost::core::typeinfo core_typeid_< T >::ti_ = core_typeid_< T >::name();
|
||||
#else
|
||||
template<class T> boost::core::typeinfo core_typeid_< T >::ti_(core_typeid_< T >::name());
|
||||
#endif
|
||||
BOOST_SYMBOL_VISIBLE inline void core_typeid_lib_id()
|
||||
{
|
||||
}
|
||||
|
||||
template<class T> boost::core::typeinfo core_typeid_< T >::ti_( core_typeid_< T >::name(), &core_typeid_lib_id );
|
||||
|
||||
template<class T> struct core_typeid_< T & >: core_typeid_< T >
|
||||
{
|
||||
|
||||
131
include/boost/core/uncaught_exceptions.hpp
Normal file
131
include/boost/core/uncaught_exceptions.hpp
Normal file
@@ -0,0 +1,131 @@
|
||||
/*
|
||||
* Copyright Andrey Semashev 2018.
|
||||
* 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)
|
||||
*/
|
||||
/*!
|
||||
* \file uncaught_exceptions.hpp
|
||||
* \author Andrey Semashev
|
||||
* \date 2018-11-10
|
||||
*
|
||||
* \brief This header provides an `uncaught_exception` function implementation, which was introduced in C++17.
|
||||
*
|
||||
* The code in this file is based on the implementation by Evgeny Panasyuk:
|
||||
*
|
||||
* https://github.com/panaseleus/stack_unwinding/blob/master/boost/exception/uncaught_exception_count.hpp
|
||||
*/
|
||||
|
||||
#ifndef BOOST_CORE_UNCAUGHT_EXCEPTIONS_HPP_INCLUDED_
|
||||
#define BOOST_CORE_UNCAUGHT_EXCEPTIONS_HPP_INCLUDED_
|
||||
|
||||
#include <exception>
|
||||
#include <boost/config.hpp>
|
||||
|
||||
#if defined(BOOST_HAS_PRAGMA_ONCE)
|
||||
#pragma once
|
||||
#endif
|
||||
|
||||
// Visual Studio 14 supports N4152 std::uncaught_exceptions()
|
||||
#if (defined(__cpp_lib_uncaught_exceptions) && __cpp_lib_uncaught_exceptions >= 201411) || \
|
||||
(defined(_MSC_VER) && _MSC_VER >= 1900)
|
||||
#define BOOST_CORE_HAS_UNCAUGHT_EXCEPTIONS
|
||||
#endif
|
||||
|
||||
#if !defined(BOOST_CORE_HAS_UNCAUGHT_EXCEPTIONS)
|
||||
|
||||
// cxxabi.h availability macro
|
||||
#if defined(__has_include) && (!defined(BOOST_GCC) || (__GNUC__ >= 5))
|
||||
# if __has_include(<cxxabi.h>)
|
||||
# define BOOST_CORE_HAS_CXXABI_H
|
||||
# endif
|
||||
#elif defined(__GLIBCXX__) || defined(__GLIBCPP__)
|
||||
# define BOOST_CORE_HAS_CXXABI_H
|
||||
#endif
|
||||
|
||||
#if defined(BOOST_CORE_HAS_CXXABI_H)
|
||||
// MinGW GCC 4.4 seem to not work the same way the newer GCC versions do. As a result, __cxa_get_globals based implementation will always return 0.
|
||||
// Just disable it for now and fall back to std::uncaught_exception().
|
||||
#if !(defined(__MINGW32__) && (defined(__GNUC__) && (__GNUC__ * 100 + __GNUC_MINOR__) < 405))
|
||||
#include <cxxabi.h>
|
||||
#include <cstring>
|
||||
#define BOOST_CORE_HAS_CXA_GET_GLOBALS
|
||||
// At least on MinGW and Linux, only GCC since 4.7 declares __cxa_get_globals() in cxxabi.h. Older versions of GCC do not expose this function but it's there.
|
||||
// On OpenBSD, it seems, the declaration is also missing.
|
||||
// Note that at least on FreeBSD 11, cxxabi.h declares __cxa_get_globals with a different exception specification, so we can't declare the function unconditionally.
|
||||
// On Linux with clang and libc++ and on OS X, there is a version of cxxabi.h from libc++abi that doesn't declare __cxa_get_globals, but provides __cxa_uncaught_exceptions.
|
||||
// The function only appeared in version _LIBCPPABI_VERSION >= 1002 of the library. Unfortunately, there are linking errors about undefined reference to __cxa_uncaught_exceptions
|
||||
// on Ubuntu Trusty and OS X, so we avoid using it and forward-declare __cxa_get_globals instead.
|
||||
#if !defined(__FreeBSD__) && \
|
||||
( \
|
||||
(defined(__GNUC__) && (__GNUC__ * 100 + __GNUC_MINOR__) < 407) || \
|
||||
defined(__OpenBSD__) || \
|
||||
defined(_LIBCPPABI_VERSION) \
|
||||
)
|
||||
namespace __cxxabiv1 {
|
||||
struct __cxa_eh_globals;
|
||||
#if defined(__OpenBSD__)
|
||||
extern "C" __cxa_eh_globals* __cxa_get_globals();
|
||||
#else
|
||||
extern "C" __cxa_eh_globals* __cxa_get_globals() BOOST_NOEXCEPT_OR_NOTHROW __attribute__((__const__));
|
||||
#endif
|
||||
} // namespace __cxxabiv1
|
||||
#endif
|
||||
#endif // !(defined(__MINGW32__) && (defined(__GNUC__) && (__GNUC__ * 100 + __GNUC_MINOR__) < 405))
|
||||
#endif // defined(BOOST_CORE_HAS_CXXABI_H)
|
||||
|
||||
#if defined(_MSC_VER) && _MSC_VER >= 1400
|
||||
#include <cstring>
|
||||
#define BOOST_CORE_HAS_GETPTD
|
||||
namespace boost {
|
||||
namespace core {
|
||||
namespace detail {
|
||||
extern "C" void* _getptd();
|
||||
} // namespace detail
|
||||
} // namespace core
|
||||
} // namespace boost
|
||||
#endif // defined(_MSC_VER) && _MSC_VER >= 1400
|
||||
|
||||
#endif // !defined(BOOST_CORE_HAS_UNCAUGHT_EXCEPTIONS)
|
||||
|
||||
#if !defined(BOOST_CORE_HAS_UNCAUGHT_EXCEPTIONS) && !defined(BOOST_CORE_HAS_CXA_GET_GLOBALS) && !defined(BOOST_CORE_HAS_GETPTD)
|
||||
//! This macro is defined when `uncaught_exceptions` is not guaranteed to return values greater than 1 if multiple exceptions are pending
|
||||
#define BOOST_CORE_UNCAUGHT_EXCEPTIONS_EMULATED
|
||||
#endif
|
||||
|
||||
namespace boost {
|
||||
|
||||
namespace core {
|
||||
|
||||
//! Returns the number of currently pending exceptions
|
||||
inline unsigned int uncaught_exceptions() BOOST_NOEXCEPT
|
||||
{
|
||||
#if defined(BOOST_CORE_HAS_UNCAUGHT_EXCEPTIONS)
|
||||
// C++17 implementation
|
||||
return static_cast< unsigned int >(std::uncaught_exceptions());
|
||||
#elif defined(BOOST_CORE_HAS_CXA_GET_GLOBALS)
|
||||
// Tested on {clang 3.2,GCC 3.5.6,GCC 4.1.2,GCC 4.4.6,GCC 4.4.7}x{x32,x64}
|
||||
unsigned int count;
|
||||
std::memcpy(&count, reinterpret_cast< const unsigned char* >(::abi::__cxa_get_globals()) + sizeof(void*), sizeof(count)); // __cxa_eh_globals::uncaughtExceptions, x32 offset - 0x4, x64 - 0x8
|
||||
return count;
|
||||
#elif defined(BOOST_CORE_HAS_GETPTD)
|
||||
// MSVC specific. Tested on {MSVC2005SP1,MSVC2008SP1,MSVC2010SP1,MSVC2012}x{x32,x64}.
|
||||
unsigned int count;
|
||||
std::memcpy(&count, static_cast< const unsigned char* >(boost::core::detail::_getptd()) + (sizeof(void*) == 8u ? 0x100 : 0x90), sizeof(count)); // _tiddata::_ProcessingThrow, x32 offset - 0x90, x64 - 0x100
|
||||
return count;
|
||||
#else
|
||||
// Portable C++03 implementation. Does not allow to detect multiple nested exceptions.
|
||||
return static_cast< unsigned int >(std::uncaught_exception());
|
||||
#endif
|
||||
}
|
||||
|
||||
} // namespace core
|
||||
|
||||
} // namespace boost
|
||||
|
||||
#undef BOOST_CORE_HAS_CXXABI_H
|
||||
#undef BOOST_CORE_HAS_CXA_GET_GLOBALS
|
||||
#undef BOOST_CORE_HAS_UNCAUGHT_EXCEPTIONS
|
||||
#undef BOOST_CORE_HAS_GETPTD
|
||||
|
||||
#endif // BOOST_CORE_UNCAUGHT_EXCEPTIONS_HPP_INCLUDED_
|
||||
@@ -1,43 +0,0 @@
|
||||
/*
|
||||
* Copyright Andrey Semashev 2007 - 2013.
|
||||
* Distributed under the Boost Software License, Version 1.0.
|
||||
* (See accompanying file LICENSE_1_0.txt or copy at
|
||||
* http://www.boost.org/LICENSE_1_0.txt)
|
||||
*/
|
||||
|
||||
/*!
|
||||
* \file empty_deleter.hpp
|
||||
* \author Andrey Semashev
|
||||
* \date 22.04.2007
|
||||
*
|
||||
* This header contains an \c empty_deleter implementation. This is an empty
|
||||
* function object that receives a pointer and does nothing with it.
|
||||
* Such empty deletion strategy may be convenient, for example, when
|
||||
* constructing <tt>shared_ptr</tt>s that point to some object that should not be
|
||||
* deleted (i.e. a variable on the stack or some global singleton, like <tt>std::cout</tt>).
|
||||
*/
|
||||
|
||||
#ifndef BOOST_UTILITY_EMPTY_DELETER_HPP
|
||||
#define BOOST_UTILITY_EMPTY_DELETER_HPP
|
||||
|
||||
#include <boost/config.hpp>
|
||||
#include <boost/core/null_deleter.hpp>
|
||||
|
||||
#ifdef BOOST_HAS_PRAGMA_ONCE
|
||||
#pragma once
|
||||
#endif
|
||||
|
||||
#if defined(__GNUC__)
|
||||
#pragma message "This header is deprecated, use boost/core/null_deleter.hpp instead."
|
||||
#elif defined(_MSC_VER)
|
||||
#pragma message("This header is deprecated, use boost/core/null_deleter.hpp instead.")
|
||||
#endif
|
||||
|
||||
namespace boost {
|
||||
|
||||
//! A deprecated name for \c null_deleter
|
||||
typedef null_deleter empty_deleter;
|
||||
|
||||
} // namespace boost
|
||||
|
||||
#endif // BOOST_UTILITY_EMPTY_DELETER_HPP
|
||||
@@ -9,7 +9,7 @@
|
||||
],
|
||||
"maintainers": [
|
||||
"Peter Dimov <pdimov -at- pdimov.com>",
|
||||
"Glen Fernandes <glenfe -at- live.com>",
|
||||
"Glen Fernandes <glenjofe -at- gmail.com>",
|
||||
"Andrey Semashev <andrey.semashev -at- gmail.com>"
|
||||
],
|
||||
"description": "A collection of simple core utilities with minimal dependencies.",
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
# Boost.Core Library test Jamfile
|
||||
#
|
||||
# Copyright (c) 2014 Peter Dimov
|
||||
# Copyright (c) 2014, 2017 Peter Dimov
|
||||
#
|
||||
# Distributed under the Boost Software License, Version 1.0.
|
||||
# See accompanying file LICENSE_1_0.txt or copy at
|
||||
@@ -9,11 +9,16 @@
|
||||
import modules ;
|
||||
import testing ;
|
||||
|
||||
# quick test (for CI)
|
||||
run quick.cpp ;
|
||||
|
||||
# full test suite
|
||||
run addressof_test.cpp ;
|
||||
run addressof_test2.cpp ;
|
||||
run addressof_np_test.cpp ;
|
||||
run addressof_fn_test.cpp ;
|
||||
compile addressof_constexpr_test.cpp ;
|
||||
compile-fail addressof_fail_rvalue.cpp ;
|
||||
|
||||
run checked_delete_test.cpp ;
|
||||
compile-fail checked_delete_fail.cpp ;
|
||||
@@ -63,11 +68,14 @@ run get_pointer_test.cpp ;
|
||||
|
||||
run lightweight_test_test.cpp ;
|
||||
run lightweight_test_test.cpp : : : <exception-handling>off : lightweight_test_test_no_except ;
|
||||
|
||||
run lightweight_test_test2.cpp ;
|
||||
run lightweight_test_all_eq_test.cpp ;
|
||||
run lightweight_test_all_with_test.cpp ;
|
||||
run lightweight_test_all_with_fail.cpp ;
|
||||
run lightweight_test_lt_le_test.cpp ;
|
||||
run lightweight_test_gt_ge_test.cpp ;
|
||||
run lightweight_test_eq_nullptr.cpp ;
|
||||
run lightweight_test_test3.cpp ;
|
||||
|
||||
run-fail lightweight_test_fail.cpp ;
|
||||
run-fail lightweight_test_fail2.cpp ;
|
||||
@@ -81,6 +89,11 @@ run-fail lightweight_test_fail8.cpp ;
|
||||
run-fail lightweight_test_fail8.cpp : : : <rtti>off : lightweight_test_fail8_no_rtti ;
|
||||
run-fail lightweight_test_fail9.cpp ;
|
||||
run-fail lightweight_test_fail10.cpp ;
|
||||
run-fail lightweight_test_fail11.cpp ;
|
||||
run-fail lightweight_test_lt_fail.cpp ;
|
||||
run-fail lightweight_test_le_fail.cpp ;
|
||||
run-fail lightweight_test_gt_fail.cpp ;
|
||||
run-fail lightweight_test_ge_fail.cpp ;
|
||||
|
||||
run is_same_test.cpp ;
|
||||
|
||||
@@ -101,5 +114,32 @@ compile-fail scoped_enum_compile_fail_conv_to_int.cpp ;
|
||||
|
||||
run underlying_type.cpp ;
|
||||
|
||||
run pointer_traits_pointer_test.cpp ;
|
||||
run pointer_traits_element_type_test.cpp ;
|
||||
run pointer_traits_difference_type_test.cpp ;
|
||||
run pointer_traits_rebind_test.cpp ;
|
||||
run pointer_traits_pointer_to_test.cpp ;
|
||||
run to_address_test.cpp ;
|
||||
|
||||
run exchange_test.cpp ;
|
||||
run exchange_move_test.cpp ;
|
||||
|
||||
run empty_value_test.cpp ;
|
||||
run empty_value_size_test.cpp ;
|
||||
|
||||
run quick_exit_test.cpp ;
|
||||
run-fail quick_exit_fail.cpp ;
|
||||
|
||||
lib lib_typeid : lib_typeid.cpp : <link>shared:<define>LIB_TYPEID_DYN_LINK=1 ;
|
||||
|
||||
run test_lib_typeid.cpp lib_typeid : : : <link>shared : test_lib_typeid_shared ;
|
||||
run test_lib_typeid.cpp lib_typeid : : : <link>static : test_lib_typeid_static ;
|
||||
|
||||
run test_lib_typeid.cpp lib_typeid : : : <link>shared <rtti>off : test_lib_typeid_shared_no_rtti ;
|
||||
run test_lib_typeid.cpp lib_typeid : : : <link>static <rtti>off : test_lib_typeid_static_no_rtti ;
|
||||
|
||||
run uncaught_exceptions.cpp : : : <exception-handling>on ;
|
||||
run uncaught_exceptions_np.cpp : : : <exception-handling>on ;
|
||||
|
||||
use-project /boost/core/swap : ./swap ;
|
||||
build-project ./swap ;
|
||||
|
||||
@@ -1,10 +1,9 @@
|
||||
/*
|
||||
Copyright 2017 Glen Joseph Fernandes
|
||||
<glenjofe -at- gmail.com>
|
||||
(glenjofe@gmail.com)
|
||||
|
||||
Distributed under the Boost Software
|
||||
License, Version 1.0.
|
||||
http://boost.org/LICENSE_1_0.txt
|
||||
Distributed under the Boost Software License, Version 1.0.
|
||||
(http://www.boost.org/LICENSE_1_0.txt)
|
||||
*/
|
||||
|
||||
#include <boost/core/addressof.hpp>
|
||||
|
||||
26
test/addressof_fail_rvalue.cpp
Normal file
26
test/addressof_fail_rvalue.cpp
Normal file
@@ -0,0 +1,26 @@
|
||||
/*
|
||||
Copyright 2017 Glen Joseph Fernandes
|
||||
(glenjofe@gmail.com)
|
||||
|
||||
Distributed under the Boost Software License, Version 1.0.
|
||||
(http://www.boost.org/LICENSE_1_0.txt)
|
||||
*/
|
||||
|
||||
#include <boost/core/addressof.hpp>
|
||||
|
||||
#if !defined(BOOST_NO_CXX11_RVALUE_REFERENCES) && \
|
||||
!defined(BOOST_NO_CXX11_DELETED_FUNCTIONS)
|
||||
struct type { };
|
||||
|
||||
inline const type function()
|
||||
{
|
||||
return type();
|
||||
}
|
||||
|
||||
int main()
|
||||
{
|
||||
(void)boost::addressof(function());
|
||||
}
|
||||
#else
|
||||
#error Requires rvalue references and deleted functions
|
||||
#endif
|
||||
19
test/cmake_subdir_test/CMakeLists.txt
Normal file
19
test/cmake_subdir_test/CMakeLists.txt
Normal file
@@ -0,0 +1,19 @@
|
||||
# Copyright 2018, 2019 Peter Dimov
|
||||
# Distributed under the Boost Software License, Version 1.0.
|
||||
# See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt
|
||||
|
||||
cmake_minimum_required(VERSION 3.5)
|
||||
|
||||
project(cmake_subdir_test LANGUAGES CXX)
|
||||
|
||||
add_subdirectory(../.. boostorg/core)
|
||||
add_subdirectory(../../../assert boostorg/assert)
|
||||
add_subdirectory(../../../config boostorg/config)
|
||||
|
||||
add_executable(quick ../quick.cpp)
|
||||
target_link_libraries(quick Boost::core)
|
||||
|
||||
enable_testing()
|
||||
add_test(quick quick)
|
||||
|
||||
add_custom_target(check COMMAND ${CMAKE_CTEST_COMMAND} --output-on-failure -C $<CONFIG>)
|
||||
60
test/empty_value_size_test.cpp
Normal file
60
test/empty_value_size_test.cpp
Normal file
@@ -0,0 +1,60 @@
|
||||
/*
|
||||
Copyright 2018 Glen Joseph Fernandes
|
||||
(glenjofe@gmail.com)
|
||||
|
||||
Distributed under the Boost Software License, Version 1.0.
|
||||
(http://www.boost.org/LICENSE_1_0.txt)
|
||||
*/
|
||||
#include <boost/config.hpp>
|
||||
#if !defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION)
|
||||
#include <boost/core/empty_value.hpp>
|
||||
#include <boost/core/lightweight_test.hpp>
|
||||
|
||||
struct T1 { };
|
||||
|
||||
struct S1
|
||||
: boost::empty_value<T1, 0, true> { };
|
||||
|
||||
struct T2 {
|
||||
int value;
|
||||
};
|
||||
|
||||
struct S2
|
||||
: boost::empty_value<T1, 0, true>
|
||||
, boost::empty_value<T2, 1, true> { };
|
||||
|
||||
struct S3
|
||||
: boost::empty_value<T1, 0, false>
|
||||
, boost::empty_value<T2, 1, true> { };
|
||||
|
||||
struct T3 { };
|
||||
|
||||
struct S4
|
||||
: boost::empty_value<T1, 0, true>
|
||||
, boost::empty_value<T3, 1, true> { };
|
||||
|
||||
struct S5
|
||||
: boost::empty_value<T1, 0, false>
|
||||
, boost::empty_value<T3, 1, false> { };
|
||||
|
||||
struct S6
|
||||
: boost::empty_value<T1, 0, true>
|
||||
, boost::empty_value<T2, 1, true>
|
||||
, boost::empty_value<T3, 2, true> { };
|
||||
|
||||
int main()
|
||||
{
|
||||
BOOST_TEST(sizeof(S1) == sizeof(T1));
|
||||
BOOST_TEST(sizeof(S2) == sizeof(T2));
|
||||
BOOST_TEST(sizeof(S3) > sizeof(T2));
|
||||
BOOST_TEST(sizeof(S4) == sizeof(T1));
|
||||
BOOST_TEST(sizeof(S5) > sizeof(T1));
|
||||
BOOST_TEST(sizeof(S6) == sizeof(T2));
|
||||
return boost::report_errors();
|
||||
}
|
||||
#else
|
||||
int main()
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
76
test/empty_value_test.cpp
Normal file
76
test/empty_value_test.cpp
Normal file
@@ -0,0 +1,76 @@
|
||||
/*
|
||||
Copyright 2018 Glen Joseph Fernandes
|
||||
(glenjofe@gmail.com)
|
||||
|
||||
Distributed under the Boost Software License, Version 1.0.
|
||||
(http://www.boost.org/LICENSE_1_0.txt)
|
||||
*/
|
||||
#include <boost/core/empty_value.hpp>
|
||||
#include <boost/core/lightweight_test.hpp>
|
||||
|
||||
struct empty {
|
||||
operator bool() const {
|
||||
return false;
|
||||
}
|
||||
operator bool() {
|
||||
return true;
|
||||
}
|
||||
};
|
||||
|
||||
class type {
|
||||
public:
|
||||
type()
|
||||
: value_(false) { }
|
||||
explicit type(bool value)
|
||||
: value_(value) { }
|
||||
operator bool() const {
|
||||
return value_;
|
||||
}
|
||||
private:
|
||||
bool value_;
|
||||
};
|
||||
|
||||
void test_bool()
|
||||
{
|
||||
const boost::empty_value<bool> v1(boost::empty_init_t(), true);
|
||||
BOOST_TEST(v1.get());
|
||||
boost::empty_value<bool> v2 = boost::empty_init_t();
|
||||
BOOST_TEST(!v2.get());
|
||||
v2 = v1;
|
||||
BOOST_TEST(v2.get());
|
||||
v2.get() = false;
|
||||
BOOST_TEST(!v2.get());
|
||||
}
|
||||
|
||||
void test_empty()
|
||||
{
|
||||
empty e;
|
||||
const boost::empty_value<empty> v1(boost::empty_init_t(), e);
|
||||
BOOST_TEST(!v1.get());
|
||||
boost::empty_value<empty> v2;
|
||||
BOOST_TEST(v2.get());
|
||||
v2 = v1;
|
||||
BOOST_TEST(v2.get());
|
||||
v2.get() = empty();
|
||||
BOOST_TEST(v2.get());
|
||||
}
|
||||
|
||||
void test_type()
|
||||
{
|
||||
const boost::empty_value<type> v1(boost::empty_init_t(), true);
|
||||
BOOST_TEST(v1.get());
|
||||
boost::empty_value<type> v2;
|
||||
BOOST_TEST(!v2.get());
|
||||
v2 = v1;
|
||||
BOOST_TEST(v2.get());
|
||||
v2.get() = type();
|
||||
BOOST_TEST(!v2.get());
|
||||
}
|
||||
|
||||
int main()
|
||||
{
|
||||
test_bool();
|
||||
test_empty();
|
||||
test_type();
|
||||
return boost::report_errors();
|
||||
}
|
||||
100
test/exchange_move_test.cpp
Normal file
100
test/exchange_move_test.cpp
Normal file
@@ -0,0 +1,100 @@
|
||||
/*
|
||||
Copyright 2018 Glen Joseph Fernandes
|
||||
(glenjofe@gmail.com)
|
||||
|
||||
Distributed under the Boost Software License, Version 1.0.
|
||||
(http://www.boost.org/LICENSE_1_0.txt)
|
||||
*/
|
||||
#include <boost/config.hpp>
|
||||
#if !defined(BOOST_NO_CXX11_RVALUE_REFERENCES)
|
||||
#include <boost/core/exchange.hpp>
|
||||
#include <boost/core/lightweight_test.hpp>
|
||||
|
||||
class C1 {
|
||||
public:
|
||||
explicit C1(int i)
|
||||
: i_(i) { }
|
||||
C1(C1&& c)
|
||||
: i_(c.i_) { }
|
||||
C1& operator=(C1&& c) {
|
||||
i_ = c.i_;
|
||||
return *this;
|
||||
}
|
||||
int i() const {
|
||||
return i_;
|
||||
}
|
||||
private:
|
||||
C1(const C1&);
|
||||
C1& operator=(const C1&);
|
||||
int i_;
|
||||
};
|
||||
|
||||
void test1()
|
||||
{
|
||||
C1 x(1);
|
||||
BOOST_TEST(boost::exchange(x, C1(2)).i() == 1);
|
||||
BOOST_TEST(x.i() == 2);
|
||||
}
|
||||
|
||||
class C2 {
|
||||
public:
|
||||
explicit C2(int i)
|
||||
: i_(i) { }
|
||||
operator C1() const {
|
||||
return C1(i_);
|
||||
}
|
||||
int i() const {
|
||||
return i_;
|
||||
}
|
||||
private:
|
||||
C2(const C2&);
|
||||
C2& operator=(const C2&);
|
||||
int i_;
|
||||
};
|
||||
|
||||
void test2()
|
||||
{
|
||||
C1 x(1);
|
||||
BOOST_TEST(boost::exchange(x, C2(2)).i() == 1);
|
||||
BOOST_TEST(x.i() == 2);
|
||||
}
|
||||
|
||||
class C3 {
|
||||
public:
|
||||
explicit C3(int i)
|
||||
: i_(i) { }
|
||||
C3(C3&& c)
|
||||
: i_(c.i_) { }
|
||||
C3& operator=(C1&& c) {
|
||||
i_ = c.i();
|
||||
return *this;
|
||||
}
|
||||
int i() const {
|
||||
return i_;
|
||||
}
|
||||
private:
|
||||
C3(const C3&);
|
||||
C3& operator=(const C3&);
|
||||
int i_;
|
||||
};
|
||||
|
||||
void test3()
|
||||
{
|
||||
C3 x(1);
|
||||
BOOST_TEST(boost::exchange(x, C1(2)).i() == 1);
|
||||
BOOST_TEST(x.i() == 2);
|
||||
}
|
||||
|
||||
int main()
|
||||
{
|
||||
test1();
|
||||
test2();
|
||||
test3();
|
||||
return boost::report_errors();
|
||||
}
|
||||
#else
|
||||
int main()
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
89
test/exchange_test.cpp
Normal file
89
test/exchange_test.cpp
Normal file
@@ -0,0 +1,89 @@
|
||||
/*
|
||||
Copyright 2018 Glen Joseph Fernandes
|
||||
(glenjofe@gmail.com)
|
||||
|
||||
Distributed under the Boost Software License, Version 1.0.
|
||||
(http://www.boost.org/LICENSE_1_0.txt)
|
||||
*/
|
||||
#include <boost/core/exchange.hpp>
|
||||
#include <boost/core/lightweight_test.hpp>
|
||||
|
||||
void test1()
|
||||
{
|
||||
int i = 1;
|
||||
BOOST_TEST(boost::exchange(i, 2) == 1);
|
||||
BOOST_TEST(i == 2);
|
||||
}
|
||||
|
||||
class C1 {
|
||||
public:
|
||||
explicit C1(int i)
|
||||
: i_(i) { }
|
||||
int i() const {
|
||||
return i_;
|
||||
}
|
||||
private:
|
||||
int i_;
|
||||
};
|
||||
|
||||
void test2()
|
||||
{
|
||||
C1 x(1);
|
||||
BOOST_TEST(boost::exchange(x, C1(2)).i() == 1);
|
||||
BOOST_TEST(x.i() == 2);
|
||||
}
|
||||
|
||||
class C2 {
|
||||
public:
|
||||
explicit C2(int i)
|
||||
: i_(i) { }
|
||||
operator C1() const {
|
||||
return C1(i_);
|
||||
}
|
||||
int i() const {
|
||||
return i_;
|
||||
}
|
||||
private:
|
||||
int i_;
|
||||
};
|
||||
|
||||
void test3()
|
||||
{
|
||||
C1 x(1);
|
||||
BOOST_TEST(boost::exchange(x, C2(2)).i() == 1);
|
||||
BOOST_TEST(x.i() == 2);
|
||||
}
|
||||
|
||||
class C3 {
|
||||
public:
|
||||
explicit C3(int i)
|
||||
: i_(i) { }
|
||||
C3(const C3& c)
|
||||
: i_(c.i_) { }
|
||||
C3& operator=(const C1& c) {
|
||||
i_ = c.i();
|
||||
return *this;
|
||||
}
|
||||
int i() const {
|
||||
return i_;
|
||||
}
|
||||
private:
|
||||
C3& operator=(const C3&);
|
||||
int i_;
|
||||
};
|
||||
|
||||
void test4()
|
||||
{
|
||||
C3 x(1);
|
||||
BOOST_TEST(boost::exchange(x, C1(2)).i() == 1);
|
||||
BOOST_TEST(x.i() == 2);
|
||||
}
|
||||
|
||||
int main()
|
||||
{
|
||||
test1();
|
||||
test2();
|
||||
test3();
|
||||
test4();
|
||||
return boost::report_errors();
|
||||
}
|
||||
@@ -1,7 +1,7 @@
|
||||
//
|
||||
// get_pointer_test.cpp
|
||||
//
|
||||
// Copyright 2014 Peter Dimov
|
||||
// Copyright 2014, 2017 Peter Dimov
|
||||
//
|
||||
// Distributed under the Boost Software License, Version 1.0.
|
||||
// See accompanying file LICENSE_1_0.txt or copy at
|
||||
@@ -27,11 +27,23 @@ int main()
|
||||
delete p;
|
||||
}
|
||||
|
||||
{
|
||||
X * p = 0;
|
||||
BOOST_TEST( get_pointer( p ) == 0 );
|
||||
}
|
||||
|
||||
#if !defined( BOOST_NO_AUTO_PTR )
|
||||
|
||||
{
|
||||
std::auto_ptr< X > p( new X );
|
||||
BOOST_TEST( get_pointer( p ) == p.get() );
|
||||
}
|
||||
|
||||
{
|
||||
std::auto_ptr< X > p;
|
||||
BOOST_TEST( get_pointer( p ) == 0 );
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
#if !defined( BOOST_NO_CXX11_SMART_PTR )
|
||||
@@ -41,11 +53,21 @@ int main()
|
||||
BOOST_TEST( get_pointer( p ) == p.get() );
|
||||
}
|
||||
|
||||
{
|
||||
std::unique_ptr< X > p;
|
||||
BOOST_TEST( get_pointer( p ) == 0 );
|
||||
}
|
||||
|
||||
{
|
||||
std::shared_ptr< X > p( new X );
|
||||
BOOST_TEST( get_pointer( p ) == p.get() );
|
||||
}
|
||||
|
||||
{
|
||||
std::shared_ptr< X > p;
|
||||
BOOST_TEST( get_pointer( p ) == 0 );
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
return boost::report_errors();
|
||||
|
||||
17
test/lib_typeid.cpp
Normal file
17
test/lib_typeid.cpp
Normal file
@@ -0,0 +1,17 @@
|
||||
|
||||
// Copyright 2018 Peter Dimov.
|
||||
// Distributed under the Boost Software License, Version 1.0.
|
||||
|
||||
#include <boost/core/typeinfo.hpp>
|
||||
#include <boost/config.hpp>
|
||||
|
||||
#if defined(LIB_TYPEID_DYN_LINK)
|
||||
# define EXPORT BOOST_SYMBOL_EXPORT
|
||||
#else
|
||||
# define EXPORT
|
||||
#endif
|
||||
|
||||
EXPORT boost::core::typeinfo const & get_typeid_int()
|
||||
{
|
||||
return BOOST_CORE_TYPEID( int );
|
||||
}
|
||||
@@ -120,7 +120,5 @@ int main()
|
||||
++test_cases;
|
||||
}
|
||||
|
||||
boost::report_errors();
|
||||
|
||||
return boost::detail::test_errors() != test_cases;
|
||||
return !boost::report_errors();
|
||||
}
|
||||
|
||||
@@ -101,7 +101,5 @@ int main()
|
||||
test_cases += fail_vector();
|
||||
test_cases += fail_tolerance_predicate();
|
||||
|
||||
boost::report_errors();
|
||||
|
||||
return boost::detail::test_errors() != test_cases;
|
||||
return !boost::report_errors();
|
||||
}
|
||||
|
||||
31
test/lightweight_test_eq_nullptr.cpp
Normal file
31
test/lightweight_test_eq_nullptr.cpp
Normal file
@@ -0,0 +1,31 @@
|
||||
//
|
||||
// Test BOOST_TEST_EQ( p, nullptr )
|
||||
//
|
||||
// Copyright 2017 Peter Dimov
|
||||
//
|
||||
// Distributed under the Boost Software License, Version 1.0.
|
||||
// See accompanying file LICENSE_1_0.txt or copy at
|
||||
// http://www.boost.org/LICENSE_1_0.txt
|
||||
//
|
||||
|
||||
#include <boost/config.hpp>
|
||||
#include <boost/core/lightweight_test.hpp>
|
||||
|
||||
int main()
|
||||
{
|
||||
#if !defined( BOOST_NO_CXX11_NULLPTR )
|
||||
|
||||
int x = 0;
|
||||
int* p1 = 0;
|
||||
int* p2 = &x;
|
||||
|
||||
BOOST_TEST_EQ( p1, nullptr );
|
||||
BOOST_TEST_NE( p2, nullptr );
|
||||
|
||||
BOOST_TEST_EQ( nullptr, p1 );
|
||||
BOOST_TEST_NE( nullptr, p2 );
|
||||
|
||||
#endif
|
||||
|
||||
return boost::report_errors();
|
||||
}
|
||||
14
test/lightweight_test_fail11.cpp
Normal file
14
test/lightweight_test_fail11.cpp
Normal file
@@ -0,0 +1,14 @@
|
||||
/*
|
||||
Copyright 2018 Glen Joseph Fernandes
|
||||
(glenjofe@gmail.com)
|
||||
|
||||
Distributed under the Boost Software License, Version 1.0.
|
||||
(http://www.boost.org/LICENSE_1_0.txt)
|
||||
*/
|
||||
#include <boost/core/lightweight_test.hpp>
|
||||
|
||||
int main()
|
||||
{
|
||||
BOOST_TEST(true);
|
||||
return 0;
|
||||
}
|
||||
20
test/lightweight_test_ge_fail.cpp
Normal file
20
test/lightweight_test_ge_fail.cpp
Normal file
@@ -0,0 +1,20 @@
|
||||
//
|
||||
// Negative test for BOOST_TEST_GE
|
||||
//
|
||||
// Copyright 2017 Kohei Takahashi
|
||||
//
|
||||
// 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/core/lightweight_test.hpp>
|
||||
|
||||
int main()
|
||||
{
|
||||
int x = 0;
|
||||
|
||||
BOOST_TEST_GE( x, 1 );
|
||||
|
||||
return boost::report_errors();
|
||||
}
|
||||
20
test/lightweight_test_gt_fail.cpp
Normal file
20
test/lightweight_test_gt_fail.cpp
Normal file
@@ -0,0 +1,20 @@
|
||||
//
|
||||
// Negative test for BOOST_TEST_GT
|
||||
//
|
||||
// Copyright 2017 Kohei Takahashi
|
||||
//
|
||||
// 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/core/lightweight_test.hpp>
|
||||
|
||||
int main()
|
||||
{
|
||||
int x = 0;
|
||||
|
||||
BOOST_TEST_GT( x, 0 );
|
||||
|
||||
return boost::report_errors();
|
||||
}
|
||||
34
test/lightweight_test_gt_ge_test.cpp
Normal file
34
test/lightweight_test_gt_ge_test.cpp
Normal file
@@ -0,0 +1,34 @@
|
||||
//
|
||||
// Test for BOOST_TEST_GT, BOOST_TEST_GE
|
||||
//
|
||||
// Copyright 2017 Kohei Takahashi
|
||||
//
|
||||
// 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/core/lightweight_test.hpp>
|
||||
|
||||
int main()
|
||||
{
|
||||
int x = 0;
|
||||
|
||||
BOOST_TEST_GT( x, -1 );
|
||||
BOOST_TEST_GT( ++x, 0 );
|
||||
BOOST_TEST_GT( x++, 0 );
|
||||
|
||||
BOOST_TEST_GE( x, 2 );
|
||||
BOOST_TEST_GE( ++x, 3 );
|
||||
BOOST_TEST_GE( x++, 3 );
|
||||
|
||||
int y = 5;
|
||||
|
||||
BOOST_TEST_GT( ++y, ++x );
|
||||
BOOST_TEST_GT( y++, x++ );
|
||||
|
||||
BOOST_TEST_GE( ++y, x );
|
||||
BOOST_TEST_GE( y++, x++ );
|
||||
|
||||
return boost::report_errors();
|
||||
}
|
||||
20
test/lightweight_test_le_fail.cpp
Normal file
20
test/lightweight_test_le_fail.cpp
Normal file
@@ -0,0 +1,20 @@
|
||||
//
|
||||
// Negative test for BOOST_TEST_LE
|
||||
//
|
||||
// Copyright 2017 Peter Dimov
|
||||
//
|
||||
// Distributed under the Boost Software License, Version 1.0.
|
||||
// See accompanying file LICENSE_1_0.txt or copy at
|
||||
// http://www.boost.org/LICENSE_1_0.txt
|
||||
//
|
||||
|
||||
#include <boost/core/lightweight_test.hpp>
|
||||
|
||||
int main()
|
||||
{
|
||||
int x = 1;
|
||||
|
||||
BOOST_TEST_LE( x, 0 );
|
||||
|
||||
return boost::report_errors();
|
||||
}
|
||||
20
test/lightweight_test_lt_fail.cpp
Normal file
20
test/lightweight_test_lt_fail.cpp
Normal file
@@ -0,0 +1,20 @@
|
||||
//
|
||||
// Negative test for BOOST_TEST_LT
|
||||
//
|
||||
// Copyright 2014, 2017 Peter Dimov
|
||||
//
|
||||
// Distributed under the Boost Software License, Version 1.0.
|
||||
// See accompanying file LICENSE_1_0.txt or copy at
|
||||
// http://www.boost.org/LICENSE_1_0.txt
|
||||
//
|
||||
|
||||
#include <boost/core/lightweight_test.hpp>
|
||||
|
||||
int main()
|
||||
{
|
||||
int x = 0;
|
||||
|
||||
BOOST_TEST_LT( x, 0 );
|
||||
|
||||
return boost::report_errors();
|
||||
}
|
||||
34
test/lightweight_test_lt_le_test.cpp
Normal file
34
test/lightweight_test_lt_le_test.cpp
Normal file
@@ -0,0 +1,34 @@
|
||||
//
|
||||
// Test for BOOST_TEST_LT, BOOST_TEST_LE
|
||||
//
|
||||
// Copyright 2014, 2017 Peter Dimov
|
||||
//
|
||||
// Distributed under the Boost Software License, Version 1.0.
|
||||
// See accompanying file LICENSE_1_0.txt or copy at
|
||||
// http://www.boost.org/LICENSE_1_0.txt
|
||||
//
|
||||
|
||||
#include <boost/core/lightweight_test.hpp>
|
||||
|
||||
int main()
|
||||
{
|
||||
int x = 0;
|
||||
|
||||
BOOST_TEST_LT( x, 1 );
|
||||
BOOST_TEST_LT( ++x, 2 );
|
||||
BOOST_TEST_LT( x++, 3 );
|
||||
|
||||
BOOST_TEST_LE( x, 2 );
|
||||
BOOST_TEST_LE( ++x, 3 );
|
||||
BOOST_TEST_LE( x++, 4 );
|
||||
|
||||
int y = 3;
|
||||
|
||||
BOOST_TEST_LT( ++y, ++x );
|
||||
BOOST_TEST_LT( y++, x++ );
|
||||
|
||||
BOOST_TEST_LE( ++y, x );
|
||||
BOOST_TEST_LE( y++, x++ );
|
||||
|
||||
return boost::report_errors();
|
||||
}
|
||||
147
test/lightweight_test_test3.cpp
Normal file
147
test/lightweight_test_test3.cpp
Normal file
@@ -0,0 +1,147 @@
|
||||
//
|
||||
// Test for lightweight_test.hpp
|
||||
//
|
||||
// Copyright (c) 2014, 2018 Peter Dimov
|
||||
//
|
||||
// Distributed under the Boost Software License, Version 1.0.
|
||||
// See accompanying file LICENSE_1_0.txt or copy at
|
||||
// http://www.boost.org/LICENSE_1_0.txt
|
||||
//
|
||||
|
||||
#include <boost/core/lightweight_test.hpp>
|
||||
#include <boost/core/noncopyable.hpp>
|
||||
#include <ostream>
|
||||
|
||||
// EQ
|
||||
|
||||
struct eq1: private boost::noncopyable {};
|
||||
struct eq2: private boost::noncopyable {};
|
||||
|
||||
std::ostream& operator<<( std::ostream& os, eq1 const& )
|
||||
{
|
||||
return os << "eq1()";
|
||||
}
|
||||
|
||||
std::ostream& operator<<( std::ostream& os, eq2 const& )
|
||||
{
|
||||
return os << "eq2()";
|
||||
}
|
||||
|
||||
bool operator==( eq1 const&, eq2 const& )
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
// NE
|
||||
|
||||
struct ne1: private boost::noncopyable {};
|
||||
struct ne2: private boost::noncopyable {};
|
||||
|
||||
std::ostream& operator<<( std::ostream& os, ne1 const& )
|
||||
{
|
||||
return os << "ne1()";
|
||||
}
|
||||
|
||||
std::ostream& operator<<( std::ostream& os, ne2 const& )
|
||||
{
|
||||
return os << "ne2()";
|
||||
}
|
||||
|
||||
bool operator!=( ne1 const&, ne2 const& )
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
// LT
|
||||
|
||||
struct lt1: private boost::noncopyable {};
|
||||
struct lt2: private boost::noncopyable {};
|
||||
|
||||
std::ostream& operator<<( std::ostream& os, lt1 const& )
|
||||
{
|
||||
return os << "lt1()";
|
||||
}
|
||||
|
||||
std::ostream& operator<<( std::ostream& os, lt2 const& )
|
||||
{
|
||||
return os << "lt2()";
|
||||
}
|
||||
|
||||
bool operator<( lt1 const&, lt2 const& )
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
// LE
|
||||
|
||||
struct le1: private boost::noncopyable {};
|
||||
struct le2: private boost::noncopyable {};
|
||||
|
||||
std::ostream& operator<<( std::ostream& os, le1 const& )
|
||||
{
|
||||
return os << "le1()";
|
||||
}
|
||||
|
||||
std::ostream& operator<<( std::ostream& os, le2 const& )
|
||||
{
|
||||
return os << "le2()";
|
||||
}
|
||||
|
||||
bool operator<=( le1 const&, le2 const& )
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
// GT
|
||||
|
||||
struct gt1: private boost::noncopyable {};
|
||||
struct gt2: private boost::noncopyable {};
|
||||
|
||||
std::ostream& operator<<( std::ostream& os, gt1 const& )
|
||||
{
|
||||
return os << "gt1()";
|
||||
}
|
||||
|
||||
std::ostream& operator<<( std::ostream& os, gt2 const& )
|
||||
{
|
||||
return os << "gt2()";
|
||||
}
|
||||
|
||||
bool operator>( gt1 const&, gt2 const& )
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
// GE
|
||||
|
||||
struct ge1: private boost::noncopyable {};
|
||||
struct ge2: private boost::noncopyable {};
|
||||
|
||||
std::ostream& operator<<( std::ostream& os, ge1 const& )
|
||||
{
|
||||
return os << "ge1()";
|
||||
}
|
||||
|
||||
std::ostream& operator<<( std::ostream& os, ge2 const& )
|
||||
{
|
||||
return os << "ge2()";
|
||||
}
|
||||
|
||||
bool operator>=( ge1 const&, ge2 const& )
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
//
|
||||
|
||||
int main()
|
||||
{
|
||||
BOOST_TEST_EQ( eq1(), eq2() );
|
||||
BOOST_TEST_NE( ne1(), ne2() );
|
||||
BOOST_TEST_LT( lt1(), lt2() );
|
||||
BOOST_TEST_LE( le1(), le2() );
|
||||
BOOST_TEST_GT( gt1(), gt2() );
|
||||
BOOST_TEST_GE( ge1(), ge2() );
|
||||
|
||||
return boost::report_errors();
|
||||
}
|
||||
41
test/pointer_traits_difference_type_test.cpp
Normal file
41
test/pointer_traits_difference_type_test.cpp
Normal file
@@ -0,0 +1,41 @@
|
||||
/*
|
||||
Copyright 2017 Glen Joseph Fernandes
|
||||
(glenjofe@gmail.com)
|
||||
|
||||
Distributed under the Boost Software License, Version 1.0.
|
||||
(http://www.boost.org/LICENSE_1_0.txt)
|
||||
*/
|
||||
#include <boost/core/pointer_traits.hpp>
|
||||
#include <boost/core/is_same.hpp>
|
||||
#include <boost/core/lightweight_test_trait.hpp>
|
||||
|
||||
template<class T>
|
||||
struct P { };
|
||||
|
||||
template<class T>
|
||||
struct E {
|
||||
typedef long difference_type;
|
||||
};
|
||||
|
||||
int main()
|
||||
{
|
||||
BOOST_TEST_TRAIT_TRUE((boost::core::is_same<std::ptrdiff_t,
|
||||
boost::pointer_traits<int*>::difference_type>));
|
||||
BOOST_TEST_TRAIT_TRUE((boost::core::is_same<std::ptrdiff_t,
|
||||
boost::pointer_traits<P<int> >::difference_type>));
|
||||
BOOST_TEST_TRAIT_TRUE((boost::core::is_same<long,
|
||||
boost::pointer_traits<E<int> >::difference_type>));
|
||||
BOOST_TEST_TRAIT_TRUE((boost::core::is_same<std::ptrdiff_t,
|
||||
boost::pointer_traits<void*>::difference_type>));
|
||||
BOOST_TEST_TRAIT_TRUE((boost::core::is_same<std::ptrdiff_t,
|
||||
boost::pointer_traits<P<void> >::difference_type>));
|
||||
BOOST_TEST_TRAIT_TRUE((boost::core::is_same<long,
|
||||
boost::pointer_traits<E<void> >::difference_type>));
|
||||
BOOST_TEST_TRAIT_TRUE((boost::core::is_same<std::ptrdiff_t,
|
||||
boost::pointer_traits<const int*>::difference_type>));
|
||||
BOOST_TEST_TRAIT_TRUE((boost::core::is_same<std::ptrdiff_t,
|
||||
boost::pointer_traits<P<const int> >::difference_type>));
|
||||
BOOST_TEST_TRAIT_TRUE((boost::core::is_same<long,
|
||||
boost::pointer_traits<E<const int> >::difference_type>));
|
||||
return boost::report_errors();
|
||||
}
|
||||
83
test/pointer_traits_element_type_test.cpp
Normal file
83
test/pointer_traits_element_type_test.cpp
Normal file
@@ -0,0 +1,83 @@
|
||||
/*
|
||||
Copyright 2017 Glen Joseph Fernandes
|
||||
(glenjofe@gmail.com)
|
||||
|
||||
Distributed under the Boost Software License, Version 1.0.
|
||||
(http://www.boost.org/LICENSE_1_0.txt)
|
||||
*/
|
||||
#include <boost/core/pointer_traits.hpp>
|
||||
#include <boost/core/is_same.hpp>
|
||||
#include <boost/core/lightweight_test_trait.hpp>
|
||||
|
||||
template<class T>
|
||||
struct P1 { };
|
||||
|
||||
template<class T1, class T2>
|
||||
struct P2 { };
|
||||
|
||||
template<class T1, class T2, class T3>
|
||||
struct P3 { };
|
||||
|
||||
template<class T>
|
||||
struct E1 {
|
||||
typedef bool element_type;
|
||||
};
|
||||
|
||||
template<class T1, class T2>
|
||||
struct E2 {
|
||||
typedef bool element_type;
|
||||
};
|
||||
|
||||
template<class T1, class T2, class T3>
|
||||
struct E3 {
|
||||
typedef bool element_type;
|
||||
};
|
||||
|
||||
#if !defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES)
|
||||
template<class T, class... U>
|
||||
struct P { };
|
||||
|
||||
template<class T, class... U>
|
||||
struct E {
|
||||
typedef bool element_type;
|
||||
};
|
||||
#endif
|
||||
|
||||
int main()
|
||||
{
|
||||
BOOST_TEST_TRAIT_TRUE((boost::core::is_same<int,
|
||||
boost::pointer_traits<int*>::element_type>));
|
||||
BOOST_TEST_TRAIT_TRUE((boost::core::is_same<int,
|
||||
boost::pointer_traits<P1<int> >::element_type>));
|
||||
BOOST_TEST_TRAIT_TRUE((boost::core::is_same<int,
|
||||
boost::pointer_traits<P2<int, char> >::element_type>));
|
||||
BOOST_TEST_TRAIT_TRUE((boost::core::is_same<int,
|
||||
boost::pointer_traits<P3<int, char, char> >::element_type>));
|
||||
#if !defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES)
|
||||
BOOST_TEST_TRAIT_TRUE((boost::core::is_same<int,
|
||||
boost::pointer_traits<P<int, char, char, char> >::element_type>));
|
||||
#endif
|
||||
BOOST_TEST_TRAIT_TRUE((boost::core::is_same<bool,
|
||||
boost::pointer_traits<E1<int> >::element_type>));
|
||||
BOOST_TEST_TRAIT_TRUE((boost::core::is_same<bool,
|
||||
boost::pointer_traits<E2<int, int> >::element_type>));
|
||||
BOOST_TEST_TRAIT_TRUE((boost::core::is_same<bool,
|
||||
boost::pointer_traits<E3<int, int, int> >::element_type>));
|
||||
#if !defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES)
|
||||
BOOST_TEST_TRAIT_TRUE((boost::core::is_same<bool,
|
||||
boost::pointer_traits<E<int, int, int, int> >::element_type>));
|
||||
#endif
|
||||
BOOST_TEST_TRAIT_TRUE((boost::core::is_same<void,
|
||||
boost::pointer_traits<void*>::element_type>));
|
||||
BOOST_TEST_TRAIT_TRUE((boost::core::is_same<void,
|
||||
boost::pointer_traits<P1<void> >::element_type>));
|
||||
BOOST_TEST_TRAIT_TRUE((boost::core::is_same<bool,
|
||||
boost::pointer_traits<E1<void> >::element_type>));
|
||||
BOOST_TEST_TRAIT_TRUE((boost::core::is_same<const int,
|
||||
boost::pointer_traits<const int*>::element_type>));
|
||||
BOOST_TEST_TRAIT_TRUE((boost::core::is_same<const int,
|
||||
boost::pointer_traits<P1<const int> >::element_type>));
|
||||
BOOST_TEST_TRAIT_TRUE((boost::core::is_same<bool,
|
||||
boost::pointer_traits<E1<const int> >::element_type>));
|
||||
return boost::report_errors();
|
||||
}
|
||||
30
test/pointer_traits_pointer_test.cpp
Normal file
30
test/pointer_traits_pointer_test.cpp
Normal file
@@ -0,0 +1,30 @@
|
||||
/*
|
||||
Copyright 2017 Glen Joseph Fernandes
|
||||
(glenjofe@gmail.com)
|
||||
|
||||
Distributed under the Boost Software License, Version 1.0.
|
||||
(http://www.boost.org/LICENSE_1_0.txt)
|
||||
*/
|
||||
#include <boost/core/pointer_traits.hpp>
|
||||
#include <boost/core/is_same.hpp>
|
||||
#include <boost/core/lightweight_test_trait.hpp>
|
||||
|
||||
template<class T>
|
||||
struct P { };
|
||||
|
||||
int main()
|
||||
{
|
||||
BOOST_TEST_TRAIT_TRUE((boost::core::is_same<int*,
|
||||
boost::pointer_traits<int*>::pointer>));
|
||||
BOOST_TEST_TRAIT_TRUE((boost::core::is_same<P<int>,
|
||||
boost::pointer_traits<P<int> >::pointer>));
|
||||
BOOST_TEST_TRAIT_TRUE((boost::core::is_same<void*,
|
||||
boost::pointer_traits<void*>::pointer>));
|
||||
BOOST_TEST_TRAIT_TRUE((boost::core::is_same<P<void>,
|
||||
boost::pointer_traits<P<void> >::pointer>));
|
||||
BOOST_TEST_TRAIT_TRUE((boost::core::is_same<const int*,
|
||||
boost::pointer_traits<const int*>::pointer>));
|
||||
BOOST_TEST_TRAIT_TRUE((boost::core::is_same<P<const int>,
|
||||
boost::pointer_traits<P<const int> >::pointer>));
|
||||
return boost::report_errors();
|
||||
}
|
||||
63
test/pointer_traits_pointer_to_test.cpp
Normal file
63
test/pointer_traits_pointer_to_test.cpp
Normal file
@@ -0,0 +1,63 @@
|
||||
/*
|
||||
Copyright 2017 Glen Joseph Fernandes
|
||||
(glenjofe@gmail.com)
|
||||
|
||||
Distributed under the Boost Software License, Version 1.0.
|
||||
(http://www.boost.org/LICENSE_1_0.txt)
|
||||
*/
|
||||
#include <boost/core/pointer_traits.hpp>
|
||||
#include <boost/core/lightweight_test.hpp>
|
||||
|
||||
template<class T>
|
||||
class pointer {
|
||||
public:
|
||||
typedef typename boost::pointer_traits<T>::element_type element_type;
|
||||
pointer(T value)
|
||||
: value_(value) { }
|
||||
T get() const BOOST_NOEXCEPT {
|
||||
return value_;
|
||||
}
|
||||
static pointer<T> pointer_to(element_type& value) {
|
||||
return pointer<T>(&value);
|
||||
}
|
||||
private:
|
||||
T value_;
|
||||
};
|
||||
|
||||
template<class T>
|
||||
inline bool
|
||||
operator==(const pointer<T>& lhs, const pointer<T>& rhs) BOOST_NOEXCEPT
|
||||
{
|
||||
return lhs.get() == rhs.get();
|
||||
}
|
||||
|
||||
int main()
|
||||
{
|
||||
int i = 0;
|
||||
{
|
||||
typedef int* type;
|
||||
type p = &i;
|
||||
BOOST_TEST(boost::pointer_traits<type>::pointer_to(i) == p);
|
||||
}
|
||||
{
|
||||
typedef pointer<int*> type;
|
||||
type p(&i);
|
||||
BOOST_TEST(boost::pointer_traits<type>::pointer_to(i) == p);
|
||||
}
|
||||
{
|
||||
typedef pointer<pointer<int*> > type;
|
||||
type p(&i);
|
||||
BOOST_TEST(boost::pointer_traits<type>::pointer_to(i) == p);
|
||||
}
|
||||
{
|
||||
typedef const int* type;
|
||||
type p = &i;
|
||||
BOOST_TEST(boost::pointer_traits<type>::pointer_to(i) == p);
|
||||
}
|
||||
{
|
||||
typedef pointer<const int*> type;
|
||||
type p(&i);
|
||||
BOOST_TEST(boost::pointer_traits<type>::pointer_to(i) == p);
|
||||
}
|
||||
return boost::report_errors();
|
||||
}
|
||||
107
test/pointer_traits_rebind_test.cpp
Normal file
107
test/pointer_traits_rebind_test.cpp
Normal file
@@ -0,0 +1,107 @@
|
||||
/*
|
||||
Copyright 2017 Glen Joseph Fernandes
|
||||
(glenjofe@gmail.com)
|
||||
|
||||
Distributed under the Boost Software License, Version 1.0.
|
||||
(http://www.boost.org/LICENSE_1_0.txt)
|
||||
*/
|
||||
#include <boost/core/pointer_traits.hpp>
|
||||
#include <boost/core/is_same.hpp>
|
||||
#include <boost/core/lightweight_test_trait.hpp>
|
||||
|
||||
template<class T>
|
||||
struct P1 { };
|
||||
|
||||
template<class T1, class T2>
|
||||
struct P2 { };
|
||||
|
||||
template<class T1, class T2, class T3>
|
||||
struct P3 { };
|
||||
|
||||
#if !defined(BOOST_NO_CXX11_TEMPLATE_ALIASES)
|
||||
template<class T>
|
||||
struct E1 {
|
||||
template<class U>
|
||||
using rebind = E1<bool>;
|
||||
};
|
||||
|
||||
template<class T1, class T2>
|
||||
struct E2 {
|
||||
template<class U>
|
||||
using rebind = E2<bool, T2>;
|
||||
};
|
||||
|
||||
template<class T1, class T2, class T3>
|
||||
struct E3 {
|
||||
template<class U>
|
||||
using rebind = E3<bool, T2, T3>;
|
||||
};
|
||||
#endif
|
||||
|
||||
#if !defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES)
|
||||
template<class T, class... U>
|
||||
struct P { };
|
||||
|
||||
#if !defined(BOOST_NO_CXX11_TEMPLATE_ALIASES)
|
||||
template<class T, class... U>
|
||||
struct E {
|
||||
template<class V>
|
||||
using rebind = E<bool, U...>;
|
||||
};
|
||||
#endif
|
||||
#endif
|
||||
|
||||
struct R { };
|
||||
|
||||
int main()
|
||||
{
|
||||
BOOST_TEST_TRAIT_TRUE((boost::core::is_same<char*,
|
||||
boost::pointer_traits<R*>::rebind_to<char>::type>));
|
||||
BOOST_TEST_TRAIT_TRUE((boost::core::is_same<P1<char>,
|
||||
boost::pointer_traits<P1<R> >::rebind_to<char>::type>));
|
||||
BOOST_TEST_TRAIT_TRUE((boost::core::is_same<P2<char, R>,
|
||||
boost::pointer_traits<P2<R, R> >::rebind_to<char>::type>));
|
||||
BOOST_TEST_TRAIT_TRUE((boost::core::is_same<P3<char, R, R>,
|
||||
boost::pointer_traits<P3<R, R, R> >::rebind_to<char>::type>));
|
||||
#if !defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES)
|
||||
BOOST_TEST_TRAIT_TRUE((boost::core::is_same<P<char, R, R, R>,
|
||||
boost::pointer_traits<P<R, R, R, R> >::rebind_to<char>::type>));
|
||||
#endif
|
||||
BOOST_TEST_TRAIT_TRUE((boost::core::is_same<void*,
|
||||
boost::pointer_traits<R*>::rebind_to<void>::type>));
|
||||
BOOST_TEST_TRAIT_TRUE((boost::core::is_same<P1<void>,
|
||||
boost::pointer_traits<P1<R> >::rebind_to<void>::type>));
|
||||
BOOST_TEST_TRAIT_TRUE((boost::core::is_same<R*,
|
||||
boost::pointer_traits<void*>::rebind_to<R>::type>));
|
||||
BOOST_TEST_TRAIT_TRUE((boost::core::is_same<P1<R>,
|
||||
boost::pointer_traits<P1<void> >::rebind_to<R>::type>));
|
||||
BOOST_TEST_TRAIT_TRUE((boost::core::is_same<const int*,
|
||||
boost::pointer_traits<R*>::rebind_to<const int>::type>));
|
||||
BOOST_TEST_TRAIT_TRUE((boost::core::is_same<P1<const int>,
|
||||
boost::pointer_traits<P1<R> >::rebind_to<const int>::type>));
|
||||
BOOST_TEST_TRAIT_TRUE((boost::core::is_same<int*,
|
||||
boost::pointer_traits<const R*>::rebind_to<int>::type>));
|
||||
BOOST_TEST_TRAIT_TRUE((boost::core::is_same<P1<int>,
|
||||
boost::pointer_traits<P1<const R> >::rebind_to<int>::type>));
|
||||
#if !defined(BOOST_NO_CXX11_TEMPLATE_ALIASES)
|
||||
BOOST_TEST_TRAIT_TRUE((boost::core::is_same<E1<bool>,
|
||||
boost::pointer_traits<E1<R> >::rebind_to<char>::type>));
|
||||
BOOST_TEST_TRAIT_TRUE((boost::core::is_same<E2<bool, R>,
|
||||
boost::pointer_traits<E2<R, R> >::rebind_to<char>::type>));
|
||||
BOOST_TEST_TRAIT_TRUE((boost::core::is_same<E3<bool, R, R>,
|
||||
boost::pointer_traits<E3<R, R, R> >::rebind_to<char>::type>));
|
||||
#if !defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES)
|
||||
BOOST_TEST_TRAIT_TRUE((boost::core::is_same<E<bool, R, R, R>,
|
||||
boost::pointer_traits<E<R, R, R, R> >::rebind_to<char>::type>));
|
||||
#endif
|
||||
BOOST_TEST_TRAIT_TRUE((boost::core::is_same<E1<bool>,
|
||||
boost::pointer_traits<E1<R> >::rebind_to<void>::type>));
|
||||
BOOST_TEST_TRAIT_TRUE((boost::core::is_same<E1<bool>,
|
||||
boost::pointer_traits<E1<void> >::rebind_to<R>::type>));
|
||||
BOOST_TEST_TRAIT_TRUE((boost::core::is_same<E1<bool>,
|
||||
boost::pointer_traits<E1<R> >::rebind_to<const int>::type>));
|
||||
BOOST_TEST_TRAIT_TRUE((boost::core::is_same<E1<bool>,
|
||||
boost::pointer_traits<E1<const R> >::rebind_to<int>::type>));
|
||||
#endif
|
||||
return boost::report_errors();
|
||||
}
|
||||
34
test/quick.cpp
Normal file
34
test/quick.cpp
Normal file
@@ -0,0 +1,34 @@
|
||||
//
|
||||
// quick.cpp - a quick (CI) test for Boost.Core
|
||||
//
|
||||
// Copyright 2017 Peter Dimov
|
||||
//
|
||||
// Distributed under the Boost Software License, Version 1.0.
|
||||
//
|
||||
// See accompanying file LICENSE_1_0.txt or copy at
|
||||
// http://www.boost.org/LICENSE_1_0.txt
|
||||
//
|
||||
|
||||
#include <boost/core/addressof.hpp>
|
||||
#include <boost/core/checked_delete.hpp>
|
||||
#include <boost/core/demangle.hpp>
|
||||
#include <boost/detail/iterator.hpp>
|
||||
#include <boost/core/enable_if.hpp>
|
||||
#include <boost/core/explicit_operator_bool.hpp>
|
||||
#include <boost/get_pointer.hpp>
|
||||
#include <boost/core/ignore_unused.hpp>
|
||||
#include <boost/core/is_same.hpp>
|
||||
#include <boost/core/lightweight_test.hpp>
|
||||
#include <boost/noncopyable.hpp>
|
||||
#include <boost/core/null_deleter.hpp>
|
||||
#include <boost/core/pointer_traits.hpp>
|
||||
#include <boost/ref.hpp>
|
||||
#include <boost/core/scoped_enum.hpp>
|
||||
#include <boost/detail/sp_typeinfo.hpp>
|
||||
#include <boost/core/typeinfo.hpp>
|
||||
#include <boost/core/underlying_type.hpp>
|
||||
#include <boost/visit_each.hpp>
|
||||
|
||||
int main()
|
||||
{
|
||||
}
|
||||
17
test/quick_exit_fail.cpp
Normal file
17
test/quick_exit_fail.cpp
Normal file
@@ -0,0 +1,17 @@
|
||||
|
||||
// Test for quick_exit.hpp
|
||||
//
|
||||
// Copyright 2018 Peter Dimov
|
||||
//
|
||||
// Distributed under the Boost Software License, Version 1.0.
|
||||
// See accompanying file LICENSE_1_0.txt or copy at
|
||||
// http://www.boost.org/LICENSE_1_0.txt
|
||||
|
||||
|
||||
#include <boost/core/quick_exit.hpp>
|
||||
|
||||
int main()
|
||||
{
|
||||
boost::quick_exit( 1 );
|
||||
return 0;
|
||||
}
|
||||
17
test/quick_exit_test.cpp
Normal file
17
test/quick_exit_test.cpp
Normal file
@@ -0,0 +1,17 @@
|
||||
|
||||
// Test for quick_exit.hpp
|
||||
//
|
||||
// Copyright 2018 Peter Dimov
|
||||
//
|
||||
// Distributed under the Boost Software License, Version 1.0.
|
||||
// See accompanying file LICENSE_1_0.txt or copy at
|
||||
// http://www.boost.org/LICENSE_1_0.txt
|
||||
|
||||
|
||||
#include <boost/core/quick_exit.hpp>
|
||||
|
||||
int main()
|
||||
{
|
||||
boost::quick_exit( 0 );
|
||||
return 1;
|
||||
}
|
||||
@@ -16,6 +16,9 @@ local compile_tests =
|
||||
mixed_headers_2.cpp
|
||||
;
|
||||
|
||||
local compile_fail_tests =
|
||||
const_wrapper_fail.cpp ;
|
||||
|
||||
local run_tests =
|
||||
primitive.cpp
|
||||
specialized_in_boost.cpp
|
||||
@@ -49,6 +52,12 @@ rule test_all
|
||||
all_rules += [ compile $(file) : : "swap-$(test_name)" ] ;
|
||||
}
|
||||
|
||||
for file in $(compile_fail_tests)
|
||||
{
|
||||
local test_name = [ MATCH "([^.]*).cpp$" : $(file) ] ;
|
||||
all_rules += [ compile-fail $(file) : : "swap-$(test_name)" ] ;
|
||||
}
|
||||
|
||||
for file in $(run_tests)
|
||||
{
|
||||
local test_name = [ MATCH "([^.]*).cpp$" : $(file) ] ;
|
||||
|
||||
28
test/swap/const_wrapper_fail.cpp
Normal file
28
test/swap/const_wrapper_fail.cpp
Normal file
@@ -0,0 +1,28 @@
|
||||
// Copyright 2018 Andrzej Krzemieński
|
||||
// Copyright 2018 Peter Dimov
|
||||
// Distributed under the Boost Software License, Version 1.0.
|
||||
|
||||
#include <boost/core/swap.hpp>
|
||||
|
||||
namespace boost
|
||||
{
|
||||
|
||||
template<class T> struct Wrapper
|
||||
{
|
||||
T value;
|
||||
};
|
||||
|
||||
template<class T> inline void swap( Wrapper<T> & w, Wrapper<T> & v )
|
||||
{
|
||||
boost::swap( w, v );
|
||||
}
|
||||
|
||||
} // namespace boost
|
||||
|
||||
int main()
|
||||
{
|
||||
boost::Wrapper<int> const w = { 2 };
|
||||
boost::Wrapper<int> const v = { 3 };
|
||||
|
||||
swap( w, v );
|
||||
}
|
||||
26
test/test_lib_typeid.cpp
Normal file
26
test/test_lib_typeid.cpp
Normal file
@@ -0,0 +1,26 @@
|
||||
|
||||
// Copyright 2018 Peter Dimov.
|
||||
// Distributed under the Boost Software License, Version 1.0.
|
||||
|
||||
#include <boost/core/typeinfo.hpp>
|
||||
#include <boost/core/lightweight_test.hpp>
|
||||
|
||||
boost::core::typeinfo const & get_typeid_int();
|
||||
|
||||
int main()
|
||||
{
|
||||
boost::core::typeinfo const & ti = BOOST_CORE_TYPEID( int );
|
||||
boost::core::typeinfo const & tf = BOOST_CORE_TYPEID( float );
|
||||
|
||||
boost::core::typeinfo const & ti2 = get_typeid_int();
|
||||
|
||||
BOOST_TEST( ti2 == ti );
|
||||
BOOST_TEST( ti2 != tf );
|
||||
|
||||
BOOST_TEST( !ti2.before( ti ) );
|
||||
BOOST_TEST( !ti.before( ti2 ) );
|
||||
|
||||
BOOST_TEST( ti2.before( tf ) != tf.before( ti2 ) );
|
||||
|
||||
return boost::report_errors();
|
||||
}
|
||||
158
test/to_address_test.cpp
Normal file
158
test/to_address_test.cpp
Normal file
@@ -0,0 +1,158 @@
|
||||
/*
|
||||
Copyright 2017-2018 Glen Joseph Fernandes
|
||||
(glenjofe@gmail.com)
|
||||
|
||||
Distributed under the Boost Software License, Version 1.0.
|
||||
(http://www.boost.org/LICENSE_1_0.txt)
|
||||
*/
|
||||
#include <boost/core/pointer_traits.hpp>
|
||||
#include <boost/core/lightweight_test.hpp>
|
||||
|
||||
template<class T>
|
||||
class P1 {
|
||||
public:
|
||||
explicit P1(T* p)
|
||||
: p_(p) { }
|
||||
T* operator->() const BOOST_NOEXCEPT {
|
||||
return p_;
|
||||
}
|
||||
private:
|
||||
T* p_;
|
||||
};
|
||||
|
||||
template<class T>
|
||||
class P2 {
|
||||
public:
|
||||
explicit P2(T* p)
|
||||
: p_(p) { }
|
||||
P1<T> operator->() const BOOST_NOEXCEPT {
|
||||
return p_;
|
||||
}
|
||||
private:
|
||||
P1<T> p_;
|
||||
};
|
||||
|
||||
#if !defined(BOOST_NO_CXX14_RETURN_TYPE_DEDUCTION)
|
||||
template<class T>
|
||||
class P3 {
|
||||
public:
|
||||
explicit P3(T* p)
|
||||
: p_(p) { }
|
||||
T* get() const BOOST_NOEXCEPT {
|
||||
return p_;
|
||||
}
|
||||
private:
|
||||
T* p_;
|
||||
};
|
||||
|
||||
namespace boost {
|
||||
template<class T>
|
||||
struct pointer_traits<P3<T> > {
|
||||
static T* to_address(const P3<T>& p) BOOST_NOEXCEPT {
|
||||
return p.get();
|
||||
}
|
||||
};
|
||||
} /* boost */
|
||||
|
||||
template<class T>
|
||||
class P4 {
|
||||
public:
|
||||
explicit P4(T* p)
|
||||
: p_(p) { }
|
||||
T* operator->() const BOOST_NOEXCEPT {
|
||||
return 0;
|
||||
}
|
||||
T* get() const BOOST_NOEXCEPT {
|
||||
return p_;
|
||||
}
|
||||
private:
|
||||
int* p_;
|
||||
};
|
||||
|
||||
namespace boost {
|
||||
template<class T>
|
||||
struct pointer_traits<P4<T> > {
|
||||
static T* to_address(const P4<T>& p) BOOST_NOEXCEPT {
|
||||
return p.get();
|
||||
}
|
||||
};
|
||||
} /* boost */
|
||||
|
||||
#if !defined(BOOST_NO_CXX11_POINTER_TRAITS)
|
||||
template<class T>
|
||||
class P5 {
|
||||
public:
|
||||
explicit P5(T* p)
|
||||
: p_(p) { }
|
||||
T* get() const BOOST_NOEXCEPT {
|
||||
return p_;
|
||||
}
|
||||
private:
|
||||
T* p_;
|
||||
};
|
||||
|
||||
namespace std {
|
||||
template<class T>
|
||||
struct pointer_traits<P5<T> > {
|
||||
static T* to_address(const P5<T>& p) BOOST_NOEXCEPT {
|
||||
return p.get();
|
||||
}
|
||||
};
|
||||
} /* std */
|
||||
|
||||
template<class T>
|
||||
class P6 {
|
||||
public:
|
||||
explicit P6(T* p)
|
||||
: p_(p) { }
|
||||
T* get() const BOOST_NOEXCEPT {
|
||||
return p_;
|
||||
}
|
||||
private:
|
||||
T* p_;
|
||||
};
|
||||
|
||||
namespace boost {
|
||||
template<class T>
|
||||
struct pointer_traits<P6<T> > {
|
||||
static T* to_address(const P6<T>& p) BOOST_NOEXCEPT {
|
||||
return p.get();
|
||||
}
|
||||
};
|
||||
} /* boost */
|
||||
|
||||
namespace std {
|
||||
template<class T>
|
||||
struct pointer_traits<P6<T> > {
|
||||
static T* to_address(const P6<T>& p) BOOST_NOEXCEPT {
|
||||
return 0;
|
||||
}
|
||||
};
|
||||
} /* std */
|
||||
#endif
|
||||
#endif
|
||||
|
||||
int main()
|
||||
{
|
||||
int i = 0;
|
||||
BOOST_TEST(boost::to_address(&i) == &i);
|
||||
int* p = &i;
|
||||
BOOST_TEST(boost::to_address(p) == &i);
|
||||
P1<int> p1(&i);
|
||||
BOOST_TEST(boost::to_address(p1) == &i);
|
||||
P2<int> p2(&i);
|
||||
BOOST_TEST(boost::to_address(p2) == &i);
|
||||
#if !defined(BOOST_NO_CXX14_RETURN_TYPE_DEDUCTION)
|
||||
P3<int> p3(&i);
|
||||
BOOST_TEST(boost::to_address(p3) == &i);
|
||||
P4<int> p4(&i);
|
||||
BOOST_TEST(boost::to_address(p4) == &i);
|
||||
#if !defined(BOOST_NO_CXX11_POINTER_TRAITS)
|
||||
P5<int> p5(&i);
|
||||
BOOST_TEST(boost::to_address(p5) == &i);
|
||||
P6<int> p6(&i);
|
||||
BOOST_TEST(boost::to_address(p6) == &i);
|
||||
#endif
|
||||
#endif
|
||||
return boost::report_errors();
|
||||
}
|
||||
55
test/uncaught_exceptions.cpp
Normal file
55
test/uncaught_exceptions.cpp
Normal file
@@ -0,0 +1,55 @@
|
||||
/*
|
||||
* Copyright Andrey Semashev 2018.
|
||||
* 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)
|
||||
*/
|
||||
/*!
|
||||
* \file uncaught_exceptions.cpp
|
||||
* \author Andrey Semashev
|
||||
* \date 2018-11-10
|
||||
*
|
||||
* \brief This file contains tests for the uncaught_exceptions function.
|
||||
*
|
||||
* This file only contains the very basic checks of functionality that can be portably achieved
|
||||
* through C++03 std::uncaught_exception.
|
||||
*/
|
||||
|
||||
#include <boost/core/uncaught_exceptions.hpp>
|
||||
#include <boost/core/lightweight_test.hpp>
|
||||
|
||||
struct my_exception {};
|
||||
|
||||
class exception_watcher
|
||||
{
|
||||
unsigned int& m_count;
|
||||
|
||||
public:
|
||||
explicit exception_watcher(unsigned int& count) : m_count(count) {}
|
||||
~exception_watcher() { m_count = boost::core::uncaught_exceptions(); }
|
||||
};
|
||||
|
||||
// Tests for uncaught_exceptions when used in a destructor while an exception propagates
|
||||
void test_in_destructor()
|
||||
{
|
||||
const unsigned int root_count = boost::core::uncaught_exceptions();
|
||||
|
||||
unsigned int level1_count = root_count;
|
||||
try
|
||||
{
|
||||
exception_watcher watcher(level1_count);
|
||||
throw my_exception();
|
||||
}
|
||||
catch (...)
|
||||
{
|
||||
}
|
||||
|
||||
BOOST_TEST_NE(root_count, level1_count);
|
||||
}
|
||||
|
||||
int main()
|
||||
{
|
||||
test_in_destructor();
|
||||
|
||||
return boost::report_errors();
|
||||
}
|
||||
90
test/uncaught_exceptions_np.cpp
Normal file
90
test/uncaught_exceptions_np.cpp
Normal file
@@ -0,0 +1,90 @@
|
||||
/*
|
||||
* Copyright Andrey Semashev 2018.
|
||||
* 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)
|
||||
*/
|
||||
/*!
|
||||
* \file uncaught_exceptions_np.cpp
|
||||
* \author Andrey Semashev
|
||||
* \date 2018-11-10
|
||||
*
|
||||
* \brief This file contains tests for the uncaught_exceptions function.
|
||||
*
|
||||
* This file contains checks that are compiler specific and not quite portable or require C++17.
|
||||
*/
|
||||
|
||||
#include <boost/core/uncaught_exceptions.hpp>
|
||||
|
||||
#if !defined(BOOST_CORE_UNCAUGHT_EXCEPTIONS_EMULATED)
|
||||
|
||||
#include <boost/core/lightweight_test.hpp>
|
||||
|
||||
struct my_exception1 {};
|
||||
struct my_exception2 {};
|
||||
|
||||
class exception_watcher2
|
||||
{
|
||||
unsigned int& m_count;
|
||||
|
||||
public:
|
||||
explicit exception_watcher2(unsigned int& count) : m_count(count) {}
|
||||
~exception_watcher2() { m_count = boost::core::uncaught_exceptions(); }
|
||||
};
|
||||
|
||||
class exception_watcher1
|
||||
{
|
||||
unsigned int& m_count1;
|
||||
unsigned int& m_count2;
|
||||
|
||||
public:
|
||||
exception_watcher1(unsigned int& count1, unsigned int& count2) : m_count1(count1), m_count2(count2) {}
|
||||
~exception_watcher1()
|
||||
{
|
||||
m_count1 = boost::core::uncaught_exceptions();
|
||||
try
|
||||
{
|
||||
exception_watcher2 watcher2(m_count2);
|
||||
throw my_exception2();
|
||||
}
|
||||
catch (...)
|
||||
{
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
// Tests for uncaught_exceptions when used in nested destructors while an exception propagates
|
||||
void test_in_nested_destructors()
|
||||
{
|
||||
const unsigned int root_count = boost::core::uncaught_exceptions();
|
||||
|
||||
unsigned int level1_count = root_count, level2_count = root_count;
|
||||
try
|
||||
{
|
||||
exception_watcher1 watcher1(level1_count, level2_count);
|
||||
throw my_exception1();
|
||||
}
|
||||
catch (...)
|
||||
{
|
||||
}
|
||||
|
||||
BOOST_TEST_NE(root_count, level1_count);
|
||||
BOOST_TEST_NE(root_count, level2_count);
|
||||
BOOST_TEST_NE(level1_count, level2_count);
|
||||
}
|
||||
|
||||
int main()
|
||||
{
|
||||
test_in_nested_destructors();
|
||||
|
||||
return boost::report_errors();
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
int main()
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
#endif
|
||||
Reference in New Issue
Block a user