1
0
forked from boostorg/core

Compare commits

...

37 Commits

Author SHA1 Message Date
Glen Fernandes
31117ef800 Implement pointer_in_range 2024-04-08 09:56:16 -04:00
Andrey Semashev
083b41c17e Merge pull request #169 from k3DW/feature/168
Fix deprecated warning ignores in allocator_access.hpp
2024-03-19 18:10:04 +03:00
Braden Ganetsky
a973490f53 Fix deprecated warning ignores in allocator_access.hpp, and add compile test for pmr allocator 2024-03-17 20:12:06 -05:00
Andrey Semashev
8cc2fdad76 Updated comments. 2024-02-08 18:39:47 +03:00
Andrey Semashev
0fb4d92d83 Moved checked deleters into internal namespace to block unintended ADL.
This prevents adding namespace boost to ADL when the deleters are used
in template parameters, e.g. in std::unique_ptr.
2024-02-07 15:12:36 +03:00
Peter Dimov
76401063a6 Remove constexpr test from sv_construct_test 2024-02-07 06:34:06 +02:00
Peter Dimov
c4bb59617c Disable sv_construct_test_cx2 for libstdc++ 7.2 and earlier 2024-02-07 04:55:07 +02:00
Peter Dimov
2d7e036416 Add sv_construct_test_cx, _cx2 2024-02-07 03:28:41 +02:00
Peter Dimov
4a0df827c1 Merge pull request #164 from anarthal/develop
Constructor from std::string_view is now constexpr
2024-02-07 03:03:42 +02:00
Ruben Perez
59c0fb69f0 Constructor from std::string_view is now constexpr
close #163
2024-02-06 23:15:26 +01:00
Peter Dimov
2f092c62fe Disable std::pmr use under AppleClang. Refs #162. 2024-02-06 19:12:11 +02:00
Andrey Semashev
ccfee3f638 Switch posix-cmake-test to use Ninja instead of Makefiles.
This is yet another workaround for hanging posix-cmake-test on Mac OS.
This enables parallel builds again, but uses Ninja build system instead
of Makefiles. Enabling parallel builds speeds up the build process and
releases Mac OS builders for other jobs sooner.

Additionally, fix incorrect apt invocations in CMake-related jobs. apt
is supposed to be used in interactive shells, and in scripts apt-get is
recommended. Also, apt-get update is needed before apt install, and
matrix.install must be transformed to a space-separated list. Also added
retries on network errors.
2024-02-06 14:16:34 +03:00
Andrey Semashev
45e7e1a91a Reduced CMake-related job timeouts. 2024-02-06 06:07:30 +03:00
Andrey Semashev
ce20d15048 Fix posix-cmake-test failures on Mac OS.
Properly set BUILD_JOBS environment variable in CMake-related jobs as
it is used in build and run steps. Without the variable being set, -j
without a number means "no limit on the number of jobs", which may
hit system resource limits and cause the job to fail.

Also, Mac OS seem to sometimes hang on too many parallel build jobs,
even if BUILD_JOBS is specified correctly. So disable parallel builds
for now.

Additionally, use GIT_FETCH_JOBS universally.
2024-02-06 06:06:49 +03:00
Andrey Semashev
b077925d77 Reduced CI job timeouts. 2024-02-06 01:55:42 +03:00
Andrey Semashev
61191fc0a1 Replaced actions/checkout usage with manual download commands.
This fixes the deprecation warnings for actions/checkout@v3. actions/checkout@v4
is not functional because of the upstream bug:

https://github.com/actions/checkout/issues/1590
2024-02-05 23:34:59 +03:00
Andrey Semashev
0a35bb6a20 Move functor to its own namespace to block bringing boost::core to ADL. 2024-02-02 05:23:00 +03:00
Andrey Semashev
95f0b35c36 Move fclose_deleter and null_deleter to their own namespaces to block ADL.
This prevents bringing namespace boost into ADL when the deleters are used
in template parameters, e.g. in std::unique_ptr.
2024-02-02 05:17:19 +03:00
Andrey Semashev
7b1d3718c1 Merge pull request #161 from boostorg/feature/functor
Add `functor`
2024-01-27 19:34:21 +03:00
Andrey Semashev
80e12e1116 Added a new boost/core/functor.hpp header.
The feader defines a new functor class template that can be used to wrap
raw functions into a function object class. This is useful, for example,
for integrating std::unique_ptr and unique_resource with custom deleters
implemented as raw functions (e.g. in C libraries).
2024-01-26 20:51:02 +03:00
Peter Dimov
6f70ee87a3 Disable Serialization tests for C++03 2024-01-23 18:25:32 +02:00
Peter Dimov
db20a49e48 Increase GHA timeouts 2024-01-07 01:41:30 +02:00
Peter Dimov
a57c78221b Add timeouts to all jobs 2024-01-04 14:21:44 +02:00
Peter Dimov
e4adc769aa Disable use of std::launder under msvc-14.1. Fixes #160. 2024-01-04 04:07:34 +02:00
Peter Dimov
8af04d101c Update .drone.jsonnet 2024-01-04 02:45:24 +02:00
Peter Dimov
cece8ca5b4 Update .drone.jsonnet 2023-11-30 11:39:42 +02:00
Peter Dimov
6c95750f37 Use BOOST_GCC instead of BOOST_GCC_VERSION 2023-11-30 10:33:08 +02:00
Andrey Semashev
a9f1407d84 Added a sanity check to prevent duplicate definition of BOOST_CORE_HAS_BUILTIN_BIT_CAST. 2023-11-25 16:04:12 +03:00
Andrey Semashev
db0fd77af1 Added support for __builtin_bswap16. 2023-11-25 16:04:12 +03:00
Andrey Semashev
7cbbb08e7b Use libstdc++11 for clang prior to 16.
Clang prior to version 16 does not support libstdc++13 that is installed
by default in GHA image ubuntu 22.04 in C++20 mode.
2023-11-25 16:04:12 +03:00
Peter Dimov
ba6360e8ed Update test/Jamfile 2023-10-06 11:30:51 +03:00
Peter Dimov
2a70a0f239 Update ci.yml 2023-10-06 11:20:05 +03:00
Peter Dimov
31a2f7fb6b Merge pull request #158 from iskunk/feature/fix-intel-build
Fix Intel compiler build
2023-10-06 04:21:16 +03:00
Daniel Richard G
0120dbfe65 Fix Intel compiler build 2023-10-05 20:26:24 -04:00
Andrey Semashev
5f6fe65eb2 Merge pull request #149 from boostorg/feature/invoke_swap
Rename `boost::swap` to `boost::core::invoke_swap`, deprecate `boost::swap`
2023-08-25 14:50:06 +03:00
Peter Dimov
c7134904e2 Android doesn't support pthread_setcancelstate. Fixes #150. 2023-07-25 18:03:51 +03:00
Andrey Semashev
9fc2a2f1ac Renamed boost::swap to boost::core::invoke_swap, deprecated boost::swap.
The rename allows to avoid forming an infinite recursion in compile time
(because of noexcept specification that needs to resolve the unqualified call
to swap) or run time (in case if the boost::swap function is the only one
suitable for the passed arguments).

To avoid the compile-time recursion, removed noexcept specification from
boost::swap. The specification is still present in boost::core::invoke_swap.

Deprecated boost::swap and associated headers. boost::core::invoke_swap
is defined in a new boost/core/invoke_swap.hpp header.

Updated docs and tests. Removed tests that check inclusion of deprecated
headers.

Fixes https://github.com/boostorg/core/issues/148.
2023-07-12 12:17:07 +03:00
66 changed files with 1625 additions and 323 deletions

View File

@@ -97,41 +97,40 @@ local windows_pipeline(name, image, environment, arch = "amd64") =
[
linux_pipeline(
"Linux 14.04 GCC 4.4",
"cppalliance/droneubuntu1404:1",
"Linux 16.04 GCC 4.4",
"cppalliance/droneubuntu1604:1",
{ TOOLSET: 'gcc', COMPILER: 'g++-4.4', CXXSTD: '98,0x' },
"g++-4.4",
[ "ppa:ubuntu-toolchain-r/test" ],
),
linux_pipeline(
"Linux 14.04 GCC 4.6 32/64",
"cppalliance/droneubuntu1404:1",
"Linux 16.04 GCC 4.6 32/64",
"cppalliance/droneubuntu1604:1",
{ TOOLSET: 'gcc', COMPILER: 'g++-4.6', CXXSTD: '98,0x', ADDRMD: '32,64' },
"g++-4.6-multilib",
[ "ppa:ubuntu-toolchain-r/test" ],
),
linux_pipeline(
"Linux 14.04 GCC 4.7 32/64",
"cppalliance/droneubuntu1404:1",
"Linux 16.04 GCC 4.7 32/64",
"cppalliance/droneubuntu1604:1",
{ TOOLSET: 'gcc', COMPILER: 'g++-4.7', CXXSTD: '98,0x', ADDRMD: '32,64' },
"g++-4.7-multilib",
[ "ppa:ubuntu-toolchain-r/test" ],
),
linux_pipeline(
"Linux 14.04 GCC 4.8* 32/64",
"cppalliance/droneubuntu1404:1",
"Linux 16.04 GCC 4.8 32/64",
"cppalliance/droneubuntu1604:1",
{ TOOLSET: 'gcc', COMPILER: 'g++', CXXSTD: '03,11', ADDRMD: '32,64' },
"g++-4.8-multilib",
),
linux_pipeline(
"Linux 14.04 GCC 4.9 32/64",
"cppalliance/droneubuntu1404:1",
"Linux 16.04 GCC 4.9 32/64",
"cppalliance/droneubuntu1604:1",
{ TOOLSET: 'gcc', COMPILER: 'g++-4.9', CXXSTD: '03,11', ADDRMD: '32,64' },
"g++-4.9-multilib",
[ "ppa:ubuntu-toolchain-r/test" ],
),
linux_pipeline(
@@ -194,17 +193,38 @@ local windows_pipeline(name, image, environment, arch = "amd64") =
),
linux_pipeline(
"Linux 22.04 GCC 12 32 ASAN",
"Linux 22.04 GCC 12 32/64",
"cppalliance/droneubuntu2204:1",
{ TOOLSET: 'gcc', COMPILER: 'g++-12', CXXSTD: '03,11,14,17,20,2b', ADDRMD: '32' } + asan,
{ TOOLSET: 'gcc', COMPILER: 'g++-12', CXXSTD: '03,11,14,17,20,2b', ADDRMD: '32,64' },
"g++-12-multilib",
),
linux_pipeline(
"Linux 22.04 GCC 12 64 ASAN",
"cppalliance/droneubuntu2204:1",
{ TOOLSET: 'gcc', COMPILER: 'g++-12', CXXSTD: '03,11,14,17,20,2b', ADDRMD: '64' } + asan,
"g++-12-multilib",
"Linux 23.04 GCC 13 32 ASAN",
"cppalliance/droneubuntu2304:1",
{ TOOLSET: 'gcc', COMPILER: 'g++-13', CXXSTD: '03,11,14,17,20,2b', ADDRMD: '32' } + asan,
"g++-13-multilib",
),
linux_pipeline(
"Linux 23.04 GCC 13 64 ASAN",
"cppalliance/droneubuntu2304:1",
{ TOOLSET: 'gcc', COMPILER: 'g++-13', CXXSTD: '03,11,14,17,20,2b', ADDRMD: '64' } + asan,
"g++-13-multilib",
),
linux_pipeline(
"Linux 23.04 GCC 13 32 UBSAN",
"cppalliance/droneubuntu2304:1",
{ TOOLSET: 'gcc', COMPILER: 'g++-13', CXXSTD: '03,11,14,17,20,2b', ADDRMD: '32' } + ubsan,
"g++-13-multilib",
),
linux_pipeline(
"Linux 23.04 GCC 13 64 UBSAN",
"cppalliance/droneubuntu2304:1",
{ TOOLSET: 'gcc', COMPILER: 'g++-13', CXXSTD: '03,11,14,17,20,2b', ADDRMD: '64' } + ubsan,
"g++-13-multilib",
),
linux_pipeline(
@@ -313,16 +333,9 @@ local windows_pipeline(name, image, environment, arch = "amd64") =
),
linux_pipeline(
"Linux 22.04 Clang 14 UBSAN",
"Linux 22.04 Clang 14",
"cppalliance/droneubuntu2204:1",
{ TOOLSET: 'clang', COMPILER: 'clang++-14', CXXSTD: '03,11,14,17,20,2b' } + ubsan,
"clang-14",
),
linux_pipeline(
"Linux 22.04 Clang 14 ASAN",
"cppalliance/droneubuntu2204:1",
{ TOOLSET: 'clang', COMPILER: 'clang++-14', CXXSTD: '03,11,14,17,20,2b' } + asan,
{ TOOLSET: 'clang', COMPILER: 'clang++-14', CXXSTD: '03,11,14,17,20,2b' },
"clang-14",
),
@@ -331,15 +344,27 @@ local windows_pipeline(name, image, environment, arch = "amd64") =
"cppalliance/droneubuntu2204:1",
{ TOOLSET: 'clang', COMPILER: 'clang++-15', CXXSTD: '03,11,14,17,20,2b' },
"clang-15",
["deb http://apt.llvm.org/jammy/ llvm-toolchain-jammy-15 main"],
),
linux_pipeline(
"Linux 22.04 Clang 16",
"cppalliance/droneubuntu2204:1",
"Linux 23.04 Clang 16",
"cppalliance/droneubuntu2304:1",
{ TOOLSET: 'clang', COMPILER: 'clang++-16', CXXSTD: '03,11,14,17,20,2b' },
"clang-16",
["deb http://apt.llvm.org/jammy/ llvm-toolchain-jammy-16 main"],
),
linux_pipeline(
"Linux 23.10 Clang 17 UBSAN",
"cppalliance/droneubuntu2310:1",
{ TOOLSET: 'clang', COMPILER: 'clang++-17', CXXSTD: '03,11,14,17,20,2b' } + ubsan,
"clang-17",
),
linux_pipeline(
"Linux 23.10 Clang 17 ASAN",
"cppalliance/droneubuntu2310:1",
{ TOOLSET: 'clang', COMPILER: 'clang++-17', CXXSTD: '03,11,14,17,20,2b' } + asan,
"clang-17",
),
macos_pipeline(
@@ -367,7 +392,7 @@ local windows_pipeline(name, image, environment, arch = "amd64") =
windows_pipeline(
"Windows VS2015 msvc-14.0",
"cppalliance/dronevs2015",
{ TOOLSET: 'msvc-14.0', CXXSTD: '14,latest', ADDRMD: '32,64' },
{ TOOLSET: 'msvc-14.0', CXXSTD: '14,latest', B2_DONT_EMBED_MANIFEST: '1' },
),
windows_pipeline(

View File

@@ -1,5 +1,5 @@
# Copyright 2020-2021 Peter Dimov
# Copyright 2021-2022 Andrey Semashev
# Copyright 2021-2024 Andrey Semashev
#
# 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)
@@ -121,6 +121,13 @@ jobs:
os: ubuntu-22.04
install:
- g++-12-multilib
- toolset: gcc-13
cxxstd: "03,11,14,17,20,23"
address-model: 32,64
os: ubuntu-latest
container: ubuntu:23.04
install:
- g++-13-multilib
- name: UBSAN
toolset: gcc-12
cxxstd: "03,11,14,17,20,23"
@@ -221,30 +228,40 @@ jobs:
os: ubuntu-22.04
install:
- clang-11
- g++-11
gcc_toolchain: 11
- toolset: clang
compiler: clang++-12
cxxstd: "03,11,14,17,20,2b"
os: ubuntu-22.04
install:
- clang-12
- g++-11
gcc_toolchain: 11
- toolset: clang
compiler: clang++-13
cxxstd: "03,11,14,17,20,2b"
os: ubuntu-22.04
install:
- clang-13
- g++-11
gcc_toolchain: 11
- toolset: clang
compiler: clang++-14
cxxstd: "03,11,14,17,20,2b"
os: ubuntu-22.04
install:
- clang-14
- g++-11
gcc_toolchain: 11
- toolset: clang
compiler: clang++-15
cxxstd: "03,11,14,17,20,2b"
os: ubuntu-22.04
install:
- clang-15
- g++-11
gcc_toolchain: 11
- toolset: clang
compiler: clang++-15
cxxstd: "03,11,14,17,20,2b"
@@ -258,13 +275,24 @@ jobs:
- toolset: clang
compiler: clang++-16
cxxstd: "03,11,14,17,20,2b"
os: ubuntu-22.04
os: ubuntu-latest
container: ubuntu:23.04
install:
- clang-16
- libc++-16-dev
- libc++abi-16-dev
cxxflags: -stdlib=libc++
linkflags: -stdlib=libc++
- toolset: clang
compiler: clang++-17
cxxstd: "03,11,14,17,20,2b"
os: ubuntu-22.04
install:
- clang-17
- libc++-17-dev
- libc++abi-17-dev
sources:
- "deb http://apt.llvm.org/jammy/ llvm-toolchain-jammy-16 main"
- "deb http://apt.llvm.org/jammy/ llvm-toolchain-jammy-17 main"
source_keys:
- "https://apt.llvm.org/llvm-snapshot.gpg.key"
cxxflags: -stdlib=libc++
@@ -286,10 +314,13 @@ jobs:
cxxstd: "03,11,14,17,2a"
os: macos-11
- toolset: clang
cxxstd: "03,11,14,17,2a"
cxxstd: "03,11,14,17,20,2b"
os: macos-12
- toolset: clang
cxxstd: "03,11,14,17,20,2b"
os: macos-13
timeout-minutes: 120
timeout-minutes: 45
runs-on: ${{matrix.os}}
container: ${{matrix.container}}
@@ -318,8 +349,6 @@ jobs:
fi
git config --global pack.threads 0
- uses: actions/checkout@v3
- name: Install packages
if: matrix.install
run: |
@@ -434,11 +463,25 @@ jobs:
then
DEPINST_ARGS+=("--git_args" "--jobs $GIT_FETCH_JOBS")
fi
mkdir -p snapshot
cd snapshot
echo "Downloading library snapshot: https://github.com/${GITHUB_REPOSITORY}/archive/${GITHUB_SHA}.tar.gz"
curl -L --retry "$NET_RETRY_COUNT" -o "${LIBRARY}-${GITHUB_SHA}.tar.gz" "https://github.com/${GITHUB_REPOSITORY}/archive/${GITHUB_SHA}.tar.gz"
tar -xf "${LIBRARY}-${GITHUB_SHA}.tar.gz"
if [ ! -d "${LIBRARY}-${GITHUB_SHA}" ]
then
echo "Library snapshot does not contain the library directory ${LIBRARY}-${GITHUB_SHA}:"
ls -la
exit 1
fi
rm -f "${LIBRARY}-${GITHUB_SHA}.tar.gz"
cd ..
git clone -b "$BOOST_BRANCH" --depth 1 "https://github.com/boostorg/boost.git" "boost-root"
cd boost-root
mkdir -p libs/$LIBRARY
cp -r $GITHUB_WORKSPACE/* libs/$LIBRARY
mkdir -p libs
rm -rf "libs/$LIBRARY"
mv -f "../snapshot/${LIBRARY}-${GITHUB_SHA}" "libs/$LIBRARY"
rm -rf "../snapshot"
git submodule update --init tools/boostdep
DEPINST_ARGS+=("$LIBRARY")
python tools/boostdep/depinst/depinst.py "${DEPINST_ARGS[@]}"
@@ -457,7 +500,7 @@ jobs:
- name: Run tests
if: matrix.cmake_tests == ''
run: |
cd ../boost-root
cd boost-root
B2_ARGS=("-j" "$BUILD_JOBS" "toolset=${{matrix.toolset}}" "cxxstd=${{matrix.cxxstd}}")
if [ -n "${{matrix.build_variant}}" ]
then
@@ -516,10 +559,9 @@ jobs:
os: windows-2019
runs-on: ${{matrix.os}}
timeout-minutes: 45
steps:
- uses: actions/checkout@v3
- name: Setup Boost
shell: cmd
run: |
@@ -533,10 +575,24 @@ jobs:
set BOOST_BRANCH=develop
for /f %%i in ("%GITHUB_BASE_REF%") do if "%%~nxi" == "master" set BOOST_BRANCH=master
echo BOOST_BRANCH: %BOOST_BRANCH%
mkdir snapshot
cd snapshot
echo Downloading library snapshot: https://github.com/%GITHUB_REPOSITORY%/archive/%GITHUB_SHA%.zip
curl -L --retry %NET_RETRY_COUNT% -o "%LIBRARY%-%GITHUB_SHA%.zip" "https://github.com/%GITHUB_REPOSITORY%/archive/%GITHUB_SHA%.zip"
tar -xf "%LIBRARY%-%GITHUB_SHA%.zip"
if not exist "%LIBRARY%-%GITHUB_SHA%\" (
echo Library snapshot does not contain the library directory %LIBRARY%-%GITHUB_SHA%:
dir
exit /b 1
)
del /f "%LIBRARY%-%GITHUB_SHA%.zip"
cd ..
git clone -b %BOOST_BRANCH% --depth 1 https://github.com/boostorg/boost.git boost-root
cd boost-root
xcopy /s /e /q %GITHUB_WORKSPACE% libs\%LIBRARY%\
if not exist "libs\" mkdir libs
if exist "libs\%LIBRARY%\" rmdir /s /q "libs\%LIBRARY%"
move /Y "..\snapshot\%LIBRARY%-%GITHUB_SHA%" "libs\%LIBRARY%"
rmdir /s /q "..\snapshot"
git submodule update --init tools/boostdep
python tools/boostdep/depinst/depinst.py --git_args "--jobs %GIT_FETCH_JOBS%" %LIBRARY%
cmd /c bootstrap
@@ -545,7 +601,7 @@ jobs:
- name: Run tests
shell: cmd
run: |
cd ../boost-root
cd boost-root
b2 -j %NUMBER_OF_PROCESSORS% libs/%LIBRARY%/test toolset=${{matrix.toolset}} cxxstd=${{matrix.cxxstd}} address-model=${{matrix.addrmd}} variant=debug,release embed-manifest-via=linker
posix-cmake-subdir:
@@ -557,15 +613,17 @@ jobs:
- os: ubuntu-22.04
- os: macos-11
- os: macos-12
- os: macos-13
runs-on: ${{matrix.os}}
timeout-minutes: 10
steps:
- uses: actions/checkout@v3
- name: Install packages
if: matrix.install
run: sudo apt install ${{matrix.install}}
run: |
sudo apt-get -o Acquire::Retries=$NET_RETRY_COUNT update
sudo apt-get -o Acquire::Retries=$NET_RETRY_COUNT -y ${{join(matrix.install, ' ')}}
- name: Setup Boost
run: |
@@ -580,16 +638,34 @@ jobs:
echo REF: $REF
BOOST_BRANCH=develop && [ "$REF" = "master" ] && BOOST_BRANCH=master || true
echo BOOST_BRANCH: $BOOST_BRANCH
BUILD_JOBS=$((nproc || sysctl -n hw.ncpu) 2> /dev/null)
echo "BUILD_JOBS=$BUILD_JOBS" >> $GITHUB_ENV
echo "CMAKE_BUILD_PARALLEL_LEVEL=$BUILD_JOBS" >> $GITHUB_ENV
mkdir -p snapshot
cd snapshot
echo "Downloading library snapshot: https://github.com/${GITHUB_REPOSITORY}/archive/${GITHUB_SHA}.tar.gz"
curl -L --retry "$NET_RETRY_COUNT" -o "${LIBRARY}-${GITHUB_SHA}.tar.gz" "https://github.com/${GITHUB_REPOSITORY}/archive/${GITHUB_SHA}.tar.gz"
tar -xf "${LIBRARY}-${GITHUB_SHA}.tar.gz"
if [ ! -d "${LIBRARY}-${GITHUB_SHA}" ]
then
echo "Library snapshot does not contain the library directory ${LIBRARY}-${GITHUB_SHA}:"
ls -la
exit 1
fi
rm -f "${LIBRARY}-${GITHUB_SHA}.tar.gz"
cd ..
git clone -b $BOOST_BRANCH --depth 1 https://github.com/boostorg/boost.git boost-root
cd boost-root
cp -r $GITHUB_WORKSPACE/* libs/$LIBRARY
mkdir -p libs
rm -rf "libs/$LIBRARY"
mv -f "../snapshot/${LIBRARY}-${GITHUB_SHA}" "libs/$LIBRARY"
rm -rf "../snapshot"
git submodule update --init tools/boostdep
python tools/boostdep/depinst/depinst.py --git_args "--jobs $GIT_FETCH_JOBS" $LIBRARY
- name: Use library with add_subdirectory
run: |
cd ../boost-root/libs/$LIBRARY/test/cmake_subdir_test
cd boost-root/libs/$LIBRARY/test/cmake_subdir_test
mkdir __build__ && cd __build__
cmake ..
cmake --build . -- -j $BUILD_JOBS
@@ -604,15 +680,17 @@ jobs:
- os: ubuntu-22.04
- os: macos-11
- os: macos-12
- os: macos-13
runs-on: ${{matrix.os}}
timeout-minutes: 10
steps:
- uses: actions/checkout@v3
- name: Install packages
if: matrix.install
run: sudo apt install ${{matrix.install}}
run: |
sudo apt-get -o Acquire::Retries=$NET_RETRY_COUNT update
sudo apt-get -o Acquire::Retries=$NET_RETRY_COUNT -y ${{join(matrix.install, ' ')}}
- name: Setup Boost
run: |
@@ -627,27 +705,45 @@ jobs:
echo REF: $REF
BOOST_BRANCH=develop && [ "$REF" = "master" ] && BOOST_BRANCH=master || true
echo BOOST_BRANCH: $BOOST_BRANCH
BUILD_JOBS=$((nproc || sysctl -n hw.ncpu) 2> /dev/null)
echo "BUILD_JOBS=$BUILD_JOBS" >> $GITHUB_ENV
echo "CMAKE_BUILD_PARALLEL_LEVEL=$BUILD_JOBS" >> $GITHUB_ENV
mkdir -p snapshot
cd snapshot
echo "Downloading library snapshot: https://github.com/${GITHUB_REPOSITORY}/archive/${GITHUB_SHA}.tar.gz"
curl -L --retry "$NET_RETRY_COUNT" -o "${LIBRARY}-${GITHUB_SHA}.tar.gz" "https://github.com/${GITHUB_REPOSITORY}/archive/${GITHUB_SHA}.tar.gz"
tar -xf "${LIBRARY}-${GITHUB_SHA}.tar.gz"
if [ ! -d "${LIBRARY}-${GITHUB_SHA}" ]
then
echo "Library snapshot does not contain the library directory ${LIBRARY}-${GITHUB_SHA}:"
ls -la
exit 1
fi
rm -f "${LIBRARY}-${GITHUB_SHA}.tar.gz"
cd ..
git clone -b $BOOST_BRANCH --depth 1 https://github.com/boostorg/boost.git boost-root
cd boost-root
cp -r $GITHUB_WORKSPACE/* libs/$LIBRARY
mkdir -p libs
rm -rf "libs/$LIBRARY"
mv -f "../snapshot/${LIBRARY}-${GITHUB_SHA}" "libs/$LIBRARY"
rm -rf "../snapshot"
git submodule update --init tools/boostdep
python tools/boostdep/depinst/depinst.py --git_args "--jobs $GIT_FETCH_JOBS" $LIBRARY
- name: Configure
run: |
cd ../boost-root
cd boost-root
mkdir __build__ && cd __build__
cmake -DBOOST_INCLUDE_LIBRARIES=$LIBRARY -DCMAKE_INSTALL_PREFIX=~/.local ..
- name: Install
run: |
cd ../boost-root/__build__
cd boost-root/__build__
cmake --build . --target install -- -j $BUILD_JOBS
- name: Use the installed library
run: |
cd ../boost-root/libs/$LIBRARY/test/cmake_install_test && mkdir __build__ && cd __build__
cd boost-root/libs/$LIBRARY/test/cmake_install_test && mkdir __build__ && cd __build__
cmake -DCMAKE_INSTALL_PREFIX=~/.local ..
cmake --build . -- -j $BUILD_JOBS
ctest --output-on-failure --no-tests=error
@@ -661,15 +757,21 @@ jobs:
- os: ubuntu-22.04
- os: macos-11
- os: macos-12
- os: macos-13
runs-on: ${{matrix.os}}
timeout-minutes: 20
steps:
- uses: actions/checkout@v3
- name: Install packages
if: matrix.install
run: sudo apt install ${{matrix.install}}
run: |
if [ -f "/etc/debian_version" ]
then
sudo apt-get -o Acquire::Retries=$NET_RETRY_COUNT update
sudo apt-get -o Acquire::Retries=$NET_RETRY_COUNT install -y ninja-build ${{join(matrix.install, ' ')}}
else
brew install ninja ${{join(matrix.install, ' ')}}
fi
- name: Setup Boost
run: |
@@ -684,27 +786,47 @@ jobs:
echo REF: $REF
BOOST_BRANCH=develop && [ "$REF" = "master" ] && BOOST_BRANCH=master || true
echo BOOST_BRANCH: $BOOST_BRANCH
BUILD_JOBS=$((nproc || sysctl -n hw.ncpu) 2> /dev/null)
echo BUILD_JOBS: $BUILD_JOBS
echo "BUILD_JOBS=$BUILD_JOBS" >> $GITHUB_ENV
echo "CMAKE_BUILD_PARALLEL_LEVEL=$BUILD_JOBS" >> $GITHUB_ENV
mkdir -p snapshot
cd snapshot
echo "Downloading library snapshot: https://github.com/${GITHUB_REPOSITORY}/archive/${GITHUB_SHA}.tar.gz"
curl -L --retry "$NET_RETRY_COUNT" -o "${LIBRARY}-${GITHUB_SHA}.tar.gz" "https://github.com/${GITHUB_REPOSITORY}/archive/${GITHUB_SHA}.tar.gz"
tar -xf "${LIBRARY}-${GITHUB_SHA}.tar.gz"
if [ ! -d "${LIBRARY}-${GITHUB_SHA}" ]
then
echo "Library snapshot does not contain the library directory ${LIBRARY}-${GITHUB_SHA}:"
ls -la
exit 1
fi
rm -f "${LIBRARY}-${GITHUB_SHA}.tar.gz"
cd ..
git clone -b $BOOST_BRANCH --depth 1 https://github.com/boostorg/boost.git boost-root
cd boost-root
cp -r $GITHUB_WORKSPACE/* libs/$LIBRARY
mkdir -p libs
rm -rf "libs/$LIBRARY"
mv -f "../snapshot/${LIBRARY}-${GITHUB_SHA}" "libs/$LIBRARY"
rm -rf "../snapshot"
git submodule update --init tools/boostdep
python tools/boostdep/depinst/depinst.py --git_args "--jobs $GIT_FETCH_JOBS" $LIBRARY
- name: Configure
run: |
cd ../boost-root
cd boost-root
mkdir __build__ && cd __build__
cmake -DBOOST_INCLUDE_LIBRARIES=$LIBRARY -DBUILD_TESTING=ON ..
# Building tests on Mac OS using makefiles sometimes blocks until timeout, if multiple parallel build jobs are used. Use Ninja instead.
cmake -G Ninja -DBOOST_INCLUDE_LIBRARIES=$LIBRARY -DBUILD_TESTING=ON ..
- name: Build tests
run: |
cd ../boost-root/__build__
cd boost-root/__build__
cmake --build . --target tests -- -j $BUILD_JOBS
- name: Run tests
run: |
cd ../boost-root/__build__
cd boost-root/__build__
ctest --output-on-failure --no-tests=error
windows-cmake-subdir:
@@ -716,10 +838,9 @@ jobs:
- os: windows-2022
runs-on: ${{matrix.os}}
timeout-minutes: 10
steps:
- uses: actions/checkout@v3
- name: Setup Boost
shell: cmd
run: |
@@ -733,17 +854,31 @@ jobs:
set BOOST_BRANCH=develop
for /f %%i in ("%GITHUB_BASE_REF%") do if "%%~nxi" == "master" set BOOST_BRANCH=master
echo BOOST_BRANCH: %BOOST_BRANCH%
mkdir snapshot
cd snapshot
echo Downloading library snapshot: https://github.com/%GITHUB_REPOSITORY%/archive/%GITHUB_SHA%.zip
curl -L --retry %NET_RETRY_COUNT% -o "%LIBRARY%-%GITHUB_SHA%.zip" "https://github.com/%GITHUB_REPOSITORY%/archive/%GITHUB_SHA%.zip"
tar -xf "%LIBRARY%-%GITHUB_SHA%.zip"
if not exist "%LIBRARY%-%GITHUB_SHA%\" (
echo Library snapshot does not contain the library directory %LIBRARY%-%GITHUB_SHA%:
dir
exit /b 1
)
del /f "%LIBRARY%-%GITHUB_SHA%.zip"
cd ..
git clone -b %BOOST_BRANCH% --depth 1 https://github.com/boostorg/boost.git boost-root
cd boost-root
xcopy /s /e /q %GITHUB_WORKSPACE% libs\%LIBRARY%\
if not exist "libs\" mkdir libs
if exist "libs\%LIBRARY%\" rmdir /s /q "libs\%LIBRARY%"
move /Y "..\snapshot\%LIBRARY%-%GITHUB_SHA%" "libs\%LIBRARY%"
rmdir /s /q "..\snapshot"
git submodule update --init tools/boostdep
python tools/boostdep/depinst/depinst.py --git_args "--jobs 3" %LIBRARY%
python tools/boostdep/depinst/depinst.py --git_args "--jobs %GIT_FETCH_JOBS%" %LIBRARY%
- name: Use library with add_subdirectory (Debug)
shell: cmd
run: |
cd ../boost-root/libs/%LIBRARY%/test/cmake_subdir_test
cd boost-root/libs/%LIBRARY%/test/cmake_subdir_test
mkdir __build__ && cd __build__
cmake ..
cmake --build . --config Debug
@@ -752,7 +887,7 @@ jobs:
- name: Use library with add_subdirectory (Release)
shell: cmd
run: |
cd ../boost-root/libs/%LIBRARY%/test/cmake_subdir_test/__build__
cd boost-root/libs/%LIBRARY%/test/cmake_subdir_test/__build__
cmake --build . --config Release
ctest --output-on-failure --no-tests=error -C Release
@@ -765,10 +900,9 @@ jobs:
- os: windows-2022
runs-on: ${{matrix.os}}
timeout-minutes: 10
steps:
- uses: actions/checkout@v3
- name: Setup Boost
shell: cmd
run: |
@@ -782,36 +916,50 @@ jobs:
set BOOST_BRANCH=develop
for /f %%i in ("%GITHUB_BASE_REF%") do if "%%~nxi" == "master" set BOOST_BRANCH=master
echo BOOST_BRANCH: %BOOST_BRANCH%
mkdir snapshot
cd snapshot
echo Downloading library snapshot: https://github.com/%GITHUB_REPOSITORY%/archive/%GITHUB_SHA%.zip
curl -L --retry %NET_RETRY_COUNT% -o "%LIBRARY%-%GITHUB_SHA%.zip" "https://github.com/%GITHUB_REPOSITORY%/archive/%GITHUB_SHA%.zip"
tar -xf "%LIBRARY%-%GITHUB_SHA%.zip"
if not exist "%LIBRARY%-%GITHUB_SHA%\" (
echo Library snapshot does not contain the library directory %LIBRARY%-%GITHUB_SHA%:
dir
exit /b 1
)
del /f "%LIBRARY%-%GITHUB_SHA%.zip"
cd ..
git clone -b %BOOST_BRANCH% --depth 1 https://github.com/boostorg/boost.git boost-root
cd boost-root
xcopy /s /e /q %GITHUB_WORKSPACE% libs\%LIBRARY%\
if not exist "libs\" mkdir libs
if exist "libs\%LIBRARY%\" rmdir /s /q "libs\%LIBRARY%"
move /Y "..\snapshot\%LIBRARY%-%GITHUB_SHA%" "libs\%LIBRARY%"
rmdir /s /q "..\snapshot"
git submodule update --init tools/boostdep
python tools/boostdep/depinst/depinst.py --git_args "--jobs 3" %LIBRARY%
python tools/boostdep/depinst/depinst.py --git_args "--jobs %GIT_FETCH_JOBS%" %LIBRARY%
- name: Configure
shell: cmd
run: |
cd ../boost-root
cd boost-root
mkdir __build__ && cd __build__
cmake -DBOOST_INCLUDE_LIBRARIES=%LIBRARY% -DCMAKE_INSTALL_PREFIX=C:/cmake-prefix ..
- name: Install (Debug)
shell: cmd
run: |
cd ../boost-root/__build__
cd boost-root/__build__
cmake --build . --target install --config Debug
- name: Install (Release)
shell: cmd
run: |
cd ../boost-root/__build__
cd boost-root/__build__
cmake --build . --target install --config Release
- name: Use the installed library (Debug)
shell: cmd
run: |
cd ../boost-root/libs/%LIBRARY%/test/cmake_install_test && mkdir __build__ && cd __build__
cd boost-root/libs/%LIBRARY%/test/cmake_install_test && mkdir __build__ && cd __build__
cmake -DCMAKE_INSTALL_PREFIX=C:/cmake-prefix ..
cmake --build . --config Debug
ctest --output-on-failure --no-tests=error -C Debug
@@ -819,7 +967,7 @@ jobs:
- name: Use the installed library (Release)
shell: cmd
run: |
cd ../boost-root/libs/%LIBRARY%/test/cmake_install_test/__build__
cd boost-root/libs/%LIBRARY%/test/cmake_install_test/__build__
cmake --build . --config Release
ctest --output-on-failure --no-tests=error -C Release
@@ -832,10 +980,9 @@ jobs:
- os: windows-2022
runs-on: ${{matrix.os}}
timeout-minutes: 20
steps:
- uses: actions/checkout@v3
- name: Setup Boost
shell: cmd
run: |
@@ -849,40 +996,54 @@ jobs:
set BOOST_BRANCH=develop
for /f %%i in ("%GITHUB_BASE_REF%") do if "%%~nxi" == "master" set BOOST_BRANCH=master
echo BOOST_BRANCH: %BOOST_BRANCH%
mkdir snapshot
cd snapshot
echo Downloading library snapshot: https://github.com/%GITHUB_REPOSITORY%/archive/%GITHUB_SHA%.zip
curl -L --retry %NET_RETRY_COUNT% -o "%LIBRARY%-%GITHUB_SHA%.zip" "https://github.com/%GITHUB_REPOSITORY%/archive/%GITHUB_SHA%.zip"
tar -xf "%LIBRARY%-%GITHUB_SHA%.zip"
if not exist "%LIBRARY%-%GITHUB_SHA%\" (
echo Library snapshot does not contain the library directory %LIBRARY%-%GITHUB_SHA%:
dir
exit /b 1
)
del /f "%LIBRARY%-%GITHUB_SHA%.zip"
cd ..
git clone -b %BOOST_BRANCH% --depth 1 https://github.com/boostorg/boost.git boost-root
cd boost-root
xcopy /s /e /q %GITHUB_WORKSPACE% libs\%LIBRARY%\
if not exist "libs\" mkdir libs
if exist "libs\%LIBRARY%\" rmdir /s /q "libs\%LIBRARY%"
move /Y "..\snapshot\%LIBRARY%-%GITHUB_SHA%" "libs\%LIBRARY%"
rmdir /s /q "..\snapshot"
git submodule update --init tools/boostdep
python tools/boostdep/depinst/depinst.py --git_args "--jobs 3" %LIBRARY%
python tools/boostdep/depinst/depinst.py --git_args "--jobs %GIT_FETCH_JOBS%" %LIBRARY%
- name: Configure
shell: cmd
run: |
cd ../boost-root
cd boost-root
mkdir __build__ && cd __build__
cmake -DBOOST_INCLUDE_LIBRARIES=%LIBRARY% -DBUILD_TESTING=ON ..
- name: Build tests (Debug)
shell: cmd
run: |
cd ../boost-root/__build__
cd boost-root/__build__
cmake --build . --target tests --config Debug
- name: Run tests (Debug)
shell: cmd
run: |
cd ../boost-root/__build__
cd boost-root/__build__
ctest --output-on-failure --no-tests=error -C Debug
- name: Build tests (Release)
shell: cmd
run: |
cd ../boost-root/__build__
cd boost-root/__build__
cmake --build . --target tests --config Release
- name: Run tests (Release)
shell: cmd
run: |
cd ../boost-root/__build__
cd boost-root/__build__
ctest --output-on-failure --no-tests=error -C Release

View File

@@ -1,12 +1,45 @@
[/
Copyright 2021 Peter Dimov
Copyright 2022 Andrey Semashev
Copyright 2022-2024 Andrey Semashev
Distributed under the Boost Software License, Version 1.0.
https://boost.org/LICENSE_1_0.txt)
]
[section Revision History]
[section Changes in 1.85.0]
* Added a new [link core.functor `boost/core/functor.hpp`] header with a `functor` class template
for wrapping a raw function into a function object class.
* Changed [link core.null_deleter `null_deleter`], [link core.fclose_deleter `fclose_deleter`]
and [link.checked_delete checked deleter] definitions so that they don't bring namespace `boost`
into argument-dependent lookup in cases like this:
```
std::unique_ptr< std::FILE, boost::fclose_deleter > p1, p2;
swap(p1, p2); // no longer looks for boost::swap as part of ADL
```
Users may need to either explicitly qualify the namespace of the called function or add a
`using`-declaration.
[endsect]
[section Changes in 1.84.0]
* `boost::swap` utility function has been renamed to `boost::core::invoke_swap` to
avoid forming a potential infinite recursion when the arguments are not swappable.
The new function is defined in `boost/core/invoke_swap.hpp` and is functionally equivalent
to `boost::swap`. The old `boost::swap` name is preserved for backward compatibility
but deprecated and will be removed in a future release. Its `noexcept` specification
has been removed to avoid compile errors caused by compile-time recursion.
`BOOST_ALLOW_DEPRECATED_SYMBOLS` or `BOOST_ALLOW_DEPRECATED` can be defined to suppress
deprecation warnings for the transition period. ([@https://github.com/boostorg/core/issues/148 #148])
* Headers `boost/swap.hpp`, `boost/utility/swap.hpp` and `boost/core/swap.hpp` are
deprecated and will be removed. Please, switch to `boost/core/invoke_swap.hpp`.
`BOOST_ALLOW_DEPRECATED_HEADERS` or `BOOST_ALLOW_DEPRECATED` can be defined to suppress
deprecation warnings.
[endsect]
[section Changes in 1.83.0]
* Added support for incomplete types to [link core.type_name `boost::core::type_name`].

View File

@@ -55,6 +55,7 @@ criteria for inclusion is that the utility component be:
[include exchange.qbk]
[include explicit_operator_bool.qbk]
[include first_scalar.qbk]
[include functor.qbk]
[include identity.qbk]
[include ignore_unused.qbk]
[include is_same.qbk]
@@ -69,6 +70,7 @@ criteria for inclusion is that the utility component be:
[include null_deleter.qbk]
[include fclose_deleter.qbk]
[include nvp.qbk]
[include pointer_in_range.qbk]
[include pointer_traits.qbk]
[include quick_exit.qbk]
[include ref.qbk]

101
doc/functor.qbk Normal file
View File

@@ -0,0 +1,101 @@
[/
/ Copyright (c) 2024 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:functor functor]
[simplesect Authors]
* Andrey Semashev
[endsimplesect]
[section Header <boost/core/functor.hpp>]
[note This component requires a compiler supporting C++17 or newer.]
The header `<boost/core/functor.hpp>` defines the `boost::core::functor` class template
that wraps a raw function specified in its template parameter into a function object class.
The function object forwards any arguments passed to it to the wrapped function and returns
the result of the call.
The `functor` wrapper can be useful in cases when a function object class type is required,
for example, for use with smart pointers such as `std::unique_ptr`, where the actual logic
of the function object is already implemented as a raw function, possibly provided by a
third party library. Since `functor` is default-constructible and does not store a pointer
to the wrapped function internally, using `functor` is less error-prone and more efficient
than using the pointer to function instead. For example, with `std::unique_ptr` you don't
need to pass a pointer to the deleter function in the `std::unique_ptr` constructor, and
the `std::unique_ptr` object does not store and invoke a pointer to the deleter function.
With `functor`, the deleter function becomes part of the `std::unique_ptr` type, which
prevents mixing pointers with incompatible deleters.
```
void my_deleter(void* p);
using malloc_ptr = std::unique_ptr< char, boost::core::functor< std::free > >;
using my_ptr = std::unique_ptr< char, boost::core::functor< my_deleter > >;
my_ptr create_string(std::size_t size);
void consume_string(my_ptr&& str);
malloc_ptr ptr1(static_cast< char* >(std::malloc(size)));
// ptr1 = allocate_string(size); // error, cannot convert my_ptr to malloc_ptr
my_ptr ptr2 = create_string(size); // ok
// consume_string(std::move(ptr1)); // error, cannot convert malloc_ptr&& to my_ptr
consume_string(std::move(ptr2)); // ok
```
Using `functor` may also be beneficial for reducing generated code sizes. For example, in
order to avoid storing and invoking a pointer to the deleter function in `std::shared_ptr`,
one may be inclined to use lambda functions to wrap the deleter function call like this:
```
std::shared_ptr< int > ptr(static_cast< int* >(std::malloc(sizeof(int))), [](int* p) { std::free(p); });
```
The problem is that every lambda function declaration introduces a unique type, even if
the lambda function definition matches exactly one of the previously declared lambda
functions. Thus, if `std::shared_ptr` objects like the one above are created in multiple
places in the program, the definition of the shared pointer counter and associated code
and data (e.g. virtual function table) will be duplicated for each instance.
Replacing the lambda function with `functor` solves this problem without sacrificing
readability or efficiency:
```
std::shared_ptr< int > ptr(static_cast< int* >(std::malloc(sizeof(int))), boost::core::functor< std::free >());
```
[section Synopsis]
```
namespace boost::core {
template< auto Function >
struct functor
{
template< typename... Args >
decltype(auto) operator() (Args&&... args) const noexcept(...);
};
} // namespace boost::core
```
[endsect]
[section `template< typename... Args > decltype(auto) operator() (Args&&... args) const noexcept(...);`]
* *Effects:* `return Function(std::forward< Args >(args)...)`.
* *Throws:* Nothing, unless invoking `Function` throws.
* *Note:* This function only participates in overload resolution if `Function(std::forward< Args >(args)...)` is a valid call expression.
[endsect]
[endsect]
[endsect]

80
doc/pointer_in_range.qbk Normal file
View File

@@ -0,0 +1,80 @@
[/
Copyright 2024 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_in_range pointer_in_range]
[simplesect Authors]
* Glen Fernandes
[endsimplesect]
[section Overview]
The header <boost/core/pointer_in_range.hpp> provides the function template
`boost::pointer_in_range` to check if a pointer is in a given range. This
can be used in constant expressions in C++14 or higher when the compiler has a
builtin to support `std::is_constant_evaluated`.
[endsect]
[section Examples]
The following is an example of an allocator's deallocation function that does
nothing if the pointer falls within a small automatically allocated buffer.
```
template<class T, class N>
void
Allocator<T, N>::deallocate(pointer ptr, size_type)
{
if (!boost::pointer_in_range(ptr, &buffer_[0], &buffer_[N])) {
::operator delete(ptr);
}
}
```
[endsect]
[section Reference]
```
namespace boost {
template<class T>
constexpr bool pointer_in_range(const T* ptr, const T* begin, const T* end);
} /* boost */
```
[section Functions]
[variablelist
[[`template<class T> constexpr bool pointer_in_range(const T* ptr,
const T* begin, T* end);`]
[[variablelist
[[Returns][`true` if `ptr` is in range `[begin,end)`, otherwise `false`.]]]]]]
[endsect]
[endsect]
[section Notes]
If `boost::pointer_in_range` is not usable in constant expressions the macro
`BOOST_CORE_NO_CONSTEXPR_POINTER_IN_RANGE` is defined.
[endsect]
[section History]
Glen Fernandes implemented `pointer_in_range`.
[endsect]
[endsect]

View File

@@ -20,17 +20,17 @@
[endsimplesect]
[section Header <boost/core/swap.hpp>]
[section Header <boost/core/invoke_swap.hpp>]
[^template<class T> void swap(T& left, T& right) noexcept(['see below]);]
[^template<class T> void invoke_swap(T& left, T& right) noexcept(['see below]);]
[endsect]
[section Introduction]
The template function `boost::swap` allows the values of two
variables to be swapped, using argument dependent lookup to
select a specialized swap function if available. If no
The template function `boost::core::invoke_swap` allows the
values of two variables to be swapped, using argument dependent
lookup to select a specialized swap function if available. If no
specialized swap function is available, `std::swap` is used.
[endsect]
@@ -56,9 +56,9 @@ Although this is legal C++, no Boost libraries use this method,
whereas many Boost libraries provide specialized swap functions
in their own namespaces.
`boost::swap` also supports swapping built-in arrays. Note that
`std::swap` originally did not do so, but a request to add an
overload of `std::swap` for built-in arrays has been accepted
`boost::core::invoke_swap` also supports swapping built-in arrays.
Note that `std::swap` originally did not do so, but a request to
add an overload of `std::swap` for built-in arrays has been accepted
by the C++ Standards Committee[footnote
[@http://open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#809
LWG Defect Report 809: std::swap should be overloaded for array
@@ -68,14 +68,15 @@ by the C++ Standards Committee[footnote
[section Exception Safety]
`boost::swap` provides the same exception guarantee as the
underlying swap function used, with one exception; for an array
`boost::core::invoke_swap` provides the same exception guarantee as
the underlying swap function used, with one exception; for an array
of type `T[n]`, where `n > 1` and the underlying swap function
for `T` provides the strong exception guarantee, `boost::swap`
provides only the basic exception guarantee.
for `T` provides the strong exception guarantee,
`boost::core::invoke_swap` provides only the basic exception guarantee.
In C++11 and later, `boost::swap` propagates the same `noexcept`
specification as the one specified in the underlying swap function.
In C++11 and later, `boost::core::invoke_swap` propagates the same
`noexcept` specification as the one specified in the underlying swap
function.
[endsect]
@@ -104,7 +105,7 @@ Or:
[section Portability]
Several older compilers do not support argument dependent
lookup. On these compilers `boost::swap` will call
lookup. On these compilers `boost::core::invoke_swap` will call
`std::swap`, ignoring any specialized swap functions that
could be found as a result of argument dependent lookup.
@@ -118,7 +119,9 @@ could be found as a result of argument dependent lookup.
tests, and documentation
* *Steven Watanabe* - for the idea to make `boost::swap` less
specialized than `std::swap`, thereby allowing the function
to have the name 'swap' without introducing ambiguity
to have the name 'swap' without introducing ambiguity. However,
later the function was renamed to `boost::core::invoke_swap`
to avoid potential infinite recursion.
[endsect]

View File

@@ -43,9 +43,17 @@ _LIBCPP_SUPPRESS_DEPRECATED_PUSH
#if defined(_STL_DISABLE_DEPRECATED_WARNING)
_STL_DISABLE_DEPRECATED_WARNING
#endif
#if defined(_MSC_VER)
#pragma warning(push)
#pragma warning(disable:4996)
#if defined(__clang__) && defined(__has_warning)
# if __has_warning("-Wdeprecated-declarations")
# pragma clang diagnostic push
# pragma clang diagnostic ignored "-Wdeprecated-declarations"
# endif
#elif defined(_MSC_VER)
# pragma warning(push)
# pragma warning(disable: 4996)
#elif defined(BOOST_GCC) && BOOST_GCC >= 40600
# pragma GCC diagnostic push
# pragma GCC diagnostic ignored "-Wdeprecated-declarations"
#endif
namespace boost {
@@ -807,9 +815,15 @@ using allocator_rebind_t = typename allocator_rebind<A, T>::type;
} /* boost */
#if defined(_MSC_VER)
#pragma warning(pop)
#endif
#if defined(__clang__) && defined(__has_warning)
# if __has_warning("-Wdeprecated-declarations")
# pragma clang diagnostic pop
# endif
#elif defined(_MSC_VER)
# pragma warning(pop)
#elif defined(BOOST_GCC) && BOOST_GCC >= 40600
# pragma GCC diagnostic pop
#endif
#if defined(_STL_RESTORE_DEPRECATED_WARNING)
_STL_RESTORE_DEPRECATED_WARNING
#endif

View File

@@ -47,12 +47,19 @@
# if __has_builtin(__builtin_bit_cast)
# define BOOST_CORE_HAS_BUILTIN_BIT_CAST
# endif
# if __has_builtin(__builtin_bswap16)
# define BOOST_CORE_HAS_BUILTIN_BSWAP16
# endif
#endif
#if defined(BOOST_MSVC) && BOOST_MSVC >= 1926
#if !defined(BOOST_CORE_HAS_BUILTIN_BIT_CAST) && (defined(BOOST_MSVC) && BOOST_MSVC >= 1926)
# define BOOST_CORE_HAS_BUILTIN_BIT_CAST
#endif
#if !defined(BOOST_CORE_HAS_BUILTIN_BSWAP16) && (defined(BOOST_GCC) && BOOST_GCC >= 40800)
# define BOOST_CORE_HAS_BUILTIN_BSWAP16
#endif
namespace boost
{
namespace core
@@ -825,11 +832,22 @@ BOOST_CONSTEXPR inline boost::uint8_t byteswap_impl( boost::uint8_t x ) BOOST_NO
return x;
}
#if defined(BOOST_CORE_HAS_BUILTIN_BSWAP16)
BOOST_CONSTEXPR inline boost::uint16_t byteswap_impl( boost::uint16_t x ) BOOST_NOEXCEPT
{
return __builtin_bswap16( x );
}
#else
BOOST_CONSTEXPR inline boost::uint16_t byteswap_impl( boost::uint16_t x ) BOOST_NOEXCEPT
{
return static_cast<boost::uint16_t>( x << 8 | x >> 8 );
}
#endif
#if defined(__GNUC__) || defined(__clang__)
BOOST_CXX14_CONSTEXPR inline boost::uint32_t byteswap_impl( boost::uint32_t x ) BOOST_NOEXCEPT

View File

@@ -60,6 +60,10 @@ template<class T> inline void checked_array_delete(T * x) BOOST_NOEXCEPT
delete [] x;
}
// Block unintended ADL
namespace checked_deleters
{
template<class T> struct checked_deleter
{
typedef void result_type;
@@ -83,6 +87,11 @@ template<class T> struct checked_array_deleter
}
};
} // namespace checked_deleters
using checked_deleters::checked_deleter;
using checked_deleters::checked_array_deleter;
} // namespace boost
#endif // #ifndef BOOST_CORE_CHECKED_DELETE_HPP

View File

@@ -20,7 +20,7 @@
#include <boost/config.hpp>
#if defined(__has_builtin)
# if __has_builtin(__builtin_ia32_pause) && !defined(_INTEL_COMPILER)
# if __has_builtin(__builtin_ia32_pause) && !defined(__INTEL_COMPILER)
# define BOOST_CORE_HAS_BUILTIN_IA32_PAUSE
# endif
#endif

View File

@@ -56,7 +56,7 @@ using boost::core::detail::sp_thread_sleep;
#include <time.h>
#if defined(BOOST_HAS_PTHREADS)
#if defined(BOOST_HAS_PTHREADS) && !defined(__ANDROID__)
# include <pthread.h>
#endif
@@ -67,7 +67,7 @@ namespace core
inline void sp_thread_sleep() BOOST_NOEXCEPT
{
#if defined(BOOST_HAS_PTHREADS)
#if defined(BOOST_HAS_PTHREADS) && !defined(__ANDROID__)
int oldst;
pthread_setcancelstate( PTHREAD_CANCEL_DISABLE, &oldst );
@@ -85,7 +85,7 @@ inline void sp_thread_sleep() BOOST_NOEXCEPT
nanosleep( &rqtp, 0 );
#if defined(BOOST_HAS_PTHREADS)
#if defined(BOOST_HAS_PTHREADS) && !defined(__ANDROID__)
pthread_setcancelstate( oldst, &oldst );

View File

@@ -392,7 +392,7 @@ public:
#if !defined(BOOST_NO_CXX17_HDR_STRING_VIEW)
basic_string_view( std::basic_string_view<Ch, std::char_traits<Ch> > const& str ) BOOST_NOEXCEPT: p_( str.data() ), n_( str.size() )
BOOST_CONSTEXPR basic_string_view( std::basic_string_view<Ch, std::char_traits<Ch> > const& str ) BOOST_NOEXCEPT: p_( str.data() ), n_( str.size() )
{
}

View File

@@ -26,6 +26,9 @@
namespace boost {
// Block unintended ADL
namespace fclose_deleter_ns {
//! A function object that closes a file
struct fclose_deleter
{
@@ -41,6 +44,10 @@ struct fclose_deleter
}
};
} // namespace fclose_deleter_ns
using fclose_deleter_ns::fclose_deleter;
} // namespace boost
#endif // BOOST_CORE_FCLOSE_DELETER_HPP

View File

@@ -0,0 +1,41 @@
/*
* Copyright Andrey Semashev 2024.
* Distributed under the Boost Software License, Version 1.0.
* (See accompanying file LICENSE_1_0.txt or copy at
* http://www.boost.org/LICENSE_1_0.txt)
*/
/*!
* \file functor.hpp
* \author Andrey Semashev
* \date 2024-01-23
*
* This header contains a \c functor implementation. This is a function object
* that invokes a function that is specified as its template parameter.
*/
#ifndef BOOST_CORE_FUNCTOR_HPP
#define BOOST_CORE_FUNCTOR_HPP
namespace boost::core {
// Block unintended ADL
namespace functor_ns {
//! A function object that invokes a function specified as its template parameter
template< auto Function >
struct functor
{
template< typename... Args >
auto operator() (Args&&... args) const noexcept(noexcept(Function(static_cast< Args&& >(args)...))) -> decltype(Function(static_cast< Args&& >(args)...))
{
return Function(static_cast< Args&& >(args)...);
}
};
} // namespace functor_ns
using functor_ns::functor;
} // namespace boost::core
#endif // BOOST_CORE_FUNCTOR_HPP

View File

@@ -0,0 +1,93 @@
// Copyright (C) 2007, 2008 Steven Watanabe, Joseph Gauterin, Niels Dekker
// Copyright (C) 2023 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)
// For more information, see http://www.boost.org
#ifndef BOOST_CORE_INVOKE_SWAP_HPP
#define BOOST_CORE_INVOKE_SWAP_HPP
// Note: the implementation of this utility contains various workarounds:
// - invoke_swap_impl is put outside the boost namespace, to avoid infinite
// recursion (causing stack overflow) when swapping objects of a primitive
// type.
// - std::swap is imported with a using-directive, rather than
// a using-declaration, because some compilers (including MSVC 7.1,
// Borland 5.9.3, and Intel 8.1) don't do argument-dependent lookup
// when it has a using-declaration instead.
// - The main entry function is called invoke_swap rather than swap
// to avoid forming an infinite recursion when the arguments are not
// swappable.
#include <boost/core/enable_if.hpp>
#include <boost/config.hpp>
#if __cplusplus >= 201103L || defined(BOOST_DINKUMWARE_STDLIB)
#include <utility> // for std::swap (C++11)
#else
#include <algorithm> // for std::swap (C++98)
#endif
#include <cstddef> // for std::size_t
#ifdef BOOST_HAS_PRAGMA_ONCE
#pragma once
#endif
#if defined(BOOST_GCC) && (BOOST_GCC < 40700)
// gcc 4.6 ICEs on noexcept specifications below
#define BOOST_CORE_SWAP_NOEXCEPT_IF(x)
#else
#define BOOST_CORE_SWAP_NOEXCEPT_IF(x) BOOST_NOEXCEPT_IF(x)
#endif
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 }; };
// Use std::swap if argument dependent lookup fails.
// We need to have this at namespace scope to be able to use unqualified swap() call
// in noexcept specification.
using namespace std;
template<class T>
BOOST_GPU_ENABLED
inline void invoke_swap_impl(T& left, T& right) BOOST_CORE_SWAP_NOEXCEPT_IF(BOOST_NOEXCEPT_EXPR(swap(left, right)))
{
swap(left, right);
}
template<class T, std::size_t N>
BOOST_GPU_ENABLED
inline void invoke_swap_impl(T (& left)[N], T (& right)[N])
BOOST_CORE_SWAP_NOEXCEPT_IF(BOOST_NOEXCEPT_EXPR(::boost_swap_impl::invoke_swap_impl(left[0], right[0])))
{
for (std::size_t i = 0; i < N; ++i)
{
::boost_swap_impl::invoke_swap_impl(left[i], right[i]);
}
}
} // namespace boost_swap_impl
namespace boost {
namespace core {
template<class T>
BOOST_GPU_ENABLED
inline typename enable_if_c< !::boost_swap_impl::is_const<T>::value >::type
invoke_swap(T& left, T& right)
BOOST_CORE_SWAP_NOEXCEPT_IF(BOOST_NOEXCEPT_EXPR(::boost_swap_impl::invoke_swap_impl(left, right)))
{
::boost_swap_impl::invoke_swap_impl(left, right);
}
} // namespace core
} // namespace boost
#undef BOOST_CORE_SWAP_NOEXCEPT_IF
#endif // BOOST_CORE_INVOKE_SWAP_HPP

View File

@@ -11,14 +11,28 @@
// Distributed under the Boost Software License, Version 1.0.
// https://www.boost.org/LICENSE_1_0.txt
#include <boost/config.hpp>
#if defined(__has_builtin)
# if __has_builtin(__builtin_launder)
# define BOOST_CORE_HAS_BUILTIN_LAUNDER
# endif
#endif
#if (__cplusplus >= 201703L || (defined(_MSVC_LANG) && _MSVC_LANG >= 201703L)) && !defined(BOOST_CORE_HAS_BUILTIN_LAUNDER)
# include <new>
#if defined(BOOST_MSVC) && BOOST_MSVC < 1920
// msvc-14.1 suffers from internal compiler errors when using std::launder
// https://github.com/boostorg/core/issues/160
// https://github.com/boostorg/optional/issues/122
#elif (BOOST_CXX_VERSION >= 201703L) && !defined(BOOST_CORE_HAS_BUILTIN_LAUNDER)
#include <new>
#if defined(__cpp_lib_launder)
# define BOOST_CORE_HAS_STD_LAUNDER
#endif
#endif
namespace boost
@@ -33,7 +47,7 @@ template<class T> T* launder( T* p )
return __builtin_launder( p );
}
#elif (__cplusplus >= 201703L || (defined(_MSVC_LANG) && _MSVC_LANG >= 201703L)) && defined(__cpp_lib_launder)
#elif defined(BOOST_CORE_HAS_STD_LAUNDER)
template<class T> T* launder( T* p )
{

View File

@@ -27,6 +27,9 @@
namespace boost {
// Block unintended ADL
namespace null_deleter_ns {
//! A function object that does nothing and can be used as an empty deleter for \c shared_ptr
struct null_deleter
{
@@ -39,6 +42,10 @@ struct null_deleter
void operator() (T*) const BOOST_NOEXCEPT {}
};
} // namespace null_deleter_ns
using null_deleter_ns::null_deleter;
} // namespace boost
#endif // BOOST_CORE_NULL_DELETER_HPP

View File

@@ -0,0 +1,49 @@
/*
Copyright 2024 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_IN_RANGE_HPP
#define BOOST_CORE_POINTER_IN_RANGE_HPP
#include <boost/config.hpp>
#include <functional>
#if !defined(BOOST_NO_CXX14_CONSTEXPR)
#if defined(BOOST_MSVC) && BOOST_MSVC >= 1925
#define BOOST_CORE_DETAIL_HAS_IS_CONSTEVAL
#elif defined(__has_builtin)
#if __has_builtin(__builtin_is_constant_evaluated)
#define BOOST_CORE_DETAIL_HAS_IS_CONSTEVAL
#endif
#endif
#endif
#if !defined(BOOST_CORE_DETAIL_HAS_IS_CONSTEVAL)
#define BOOST_CORE_NO_CONSTEXPR_POINTER_IN_RANGE
#endif
namespace boost {
template<class T>
inline BOOST_CONSTEXPR bool
pointer_in_range(const T* p, const T* b, const T* e)
{
#if defined(BOOST_CORE_DETAIL_HAS_IS_CONSTEVAL)
if ( __builtin_is_constant_evaluated()) {
for (; b != e; ++b) {
if (b == p) {
return true;
}
}
return false;
}
#endif
return std::less_equal<const T*>()(b, p) && std::less<const T*>()(p, e);
}
} /* boost */
#endif

View File

@@ -10,80 +10,31 @@
#define BOOST_CORE_SWAP_HPP
// Note: the implementation of this utility contains various workarounds:
// - swap_impl is put outside the boost namespace, to avoid infinite
// recursion (causing stack overflow) when swapping objects of a primitive
// type.
// - std::swap is imported with a using-directive, rather than
// a using-declaration, because some compilers (including MSVC 7.1,
// Borland 5.9.3, and Intel 8.1) don't do argument-dependent lookup
// when it has a using-declaration instead.
// - boost::swap has two template arguments, instead of one, to
// 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>
#if __cplusplus >= 201103L || defined(BOOST_DINKUMWARE_STDLIB)
#include <utility> // for std::swap (C++11)
#else
#include <algorithm> // for std::swap (C++98)
#endif
#include <cstddef> // for std::size_t
#include <boost/config/header_deprecated.hpp>
#include <boost/core/invoke_swap.hpp>
#ifdef BOOST_HAS_PRAGMA_ONCE
#pragma once
#endif
#if defined(BOOST_GCC) && (BOOST_GCC < 40700)
// gcc 4.6 ICEs on noexcept specifications below
#define BOOST_CORE_SWAP_NOEXCEPT_IF(x)
#else
#define BOOST_CORE_SWAP_NOEXCEPT_IF(x) BOOST_NOEXCEPT_IF(x)
#endif
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 }; };
// Use std::swap if argument dependent lookup fails.
// We need to have this at namespace scope to be able to use unqualified swap() call
// in noexcept specification.
using namespace std;
template<class T>
BOOST_GPU_ENABLED
void swap_impl(T& left, T& right) BOOST_CORE_SWAP_NOEXCEPT_IF(BOOST_NOEXCEPT_EXPR(swap(left, right)))
{
swap(left, right);
}
template<class T, std::size_t N>
BOOST_GPU_ENABLED
void swap_impl(T (& left)[N], T (& right)[N])
BOOST_CORE_SWAP_NOEXCEPT_IF(BOOST_NOEXCEPT_EXPR(::boost_swap_impl::swap_impl(left[0], right[0])))
{
for (std::size_t i = 0; i < N; ++i)
{
::boost_swap_impl::swap_impl(left[i], right[i]);
}
}
}
BOOST_HEADER_DEPRECATED("boost/core/invoke_swap.hpp")
namespace boost
{
template<class T1, class T2>
BOOST_GPU_ENABLED
typename enable_if_c< !boost_swap_impl::is_const<T1>::value && !boost_swap_impl::is_const<T2>::value >::type
BOOST_DEPRECATED("This function is deprecated, use boost::core::invoke_swap instead.")
inline 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_CORE_SWAP_NOEXCEPT_IF(BOOST_NOEXCEPT_EXPR(::boost_swap_impl::swap_impl(left, right)))
{
::boost_swap_impl::swap_impl(left, right);
boost::core::invoke_swap(left, right);
}
}
#undef BOOST_CORE_SWAP_NOEXCEPT_IF
#endif // BOOST_CORE_SWAP_HPP

View File

@@ -10,8 +10,11 @@
#define BOOST_SWAP_HPP
// The header file at this path is deprecated;
// use boost/core/swap.hpp instead.
// use boost/core/invoke_swap.hpp instead.
#include <boost/config/header_deprecated.hpp>
#include <boost/core/swap.hpp>
BOOST_HEADER_DEPRECATED("boost/core/invoke_swap.hpp")
#endif

View File

@@ -10,8 +10,11 @@
#define BOOST_UTILITY_SWAP_HPP
// The header file at this path is deprecated;
// use boost/core/swap.hpp instead.
// use boost/core/invoke_swap.hpp instead.
#include <boost/config/header_deprecated.hpp>
#include <boost/core/swap.hpp>
BOOST_HEADER_DEPRECATED("boost/core/invoke_swap.hpp")
#endif

View File

@@ -17,7 +17,7 @@ project : requirements
<toolset>gcc:<warnings-as-errors>on
<toolset>gcc-4.4:<cxxflags>-Wno-sign-compare ;
local warning-as-errors-off =
local warnings-as-errors-off =
"-<toolset>msvc:<warnings-as-errors>on"
"-<toolset>gcc:<warnings-as-errors>on"
"-<toolset>clang:<warnings-as-errors>on" ;
@@ -32,36 +32,40 @@ run addressof_np_test.cpp ;
run addressof_fn_test.cpp ;
compile addressof_constexpr_test.cpp ;
compile-fail addressof_fail_rvalue.cpp
: $(warning-as-errors-off) ;
: $(warnings-as-errors-off) ;
run checked_delete_test.cpp ;
compile-fail checked_delete_fail.cpp
: $(warning-as-errors-off) ;
: $(warnings-as-errors-off) ;
compile-fail checked_delete_fail2.cpp
: $(warning-as-errors-off) ;
: $(warnings-as-errors-off) ;
compile-fail checked_deleter_compile_fail_adl.cpp
: $(warnings-as-errors-off) ;
compile-fail checked_array_deleter_compile_fail_adl.cpp
: $(warnings-as-errors-off) ;
compile ref_ct_test.cpp ;
run ref_test.cpp ;
run ref_ref_test.cpp ;
run ref_fn_test.cpp ;
compile-fail ref_rv_fail1.cpp
: $(warning-as-errors-off) ;
: $(warnings-as-errors-off) ;
compile-fail ref_rv_fail2.cpp
: $(warning-as-errors-off) ;
: $(warnings-as-errors-off) ;
compile-fail ref_rv_fail3.cpp
: $(warning-as-errors-off) ;
: $(warnings-as-errors-off) ;
compile-fail ref_rv_fail4.cpp
: $(warning-as-errors-off) ;
: $(warnings-as-errors-off) ;
compile-fail ref_rv_fail5.cpp
: $(warning-as-errors-off) ;
: $(warnings-as-errors-off) ;
compile-fail ref_implicit_fail.cpp
: $(warning-as-errors-off) ;
: $(warnings-as-errors-off) ;
compile-fail ref_implicit_fail2.cpp
: $(warning-as-errors-off) ;
: $(warnings-as-errors-off) ;
compile-fail ref_implicit_fail3.cpp
: $(warning-as-errors-off) ;
: $(warnings-as-errors-off) ;
compile-fail ref_implicit_fail4.cpp
: $(warning-as-errors-off) ;
: $(warnings-as-errors-off) ;
run ref_cv_test.cpp ;
run ref_conversion_test.cpp ;
@@ -75,18 +79,18 @@ run eif_no_disambiguation.cpp : ;
run eif_partial_specializations.cpp : ;
compile-fail noncopyable_compile_fail.cpp
: $(warning-as-errors-off) ;
: $(warnings-as-errors-off) ;
run explicit_operator_bool.cpp ;
run explicit_operator_bool_noexcept.cpp ;
compile-fail explicit_operator_bool_compile_fail_conv_int.cpp
: $(warning-as-errors-off) ;
: $(warnings-as-errors-off) ;
compile-fail explicit_operator_bool_compile_fail_conv_pvoid.cpp
: $(warning-as-errors-off) ;
: $(warnings-as-errors-off) ;
compile-fail explicit_operator_bool_compile_fail_delete.cpp
: $(warning-as-errors-off) ;
: $(warnings-as-errors-off) ;
compile-fail explicit_operator_bool_compile_fail_shift.cpp
: $(warning-as-errors-off) ;
: $(warnings-as-errors-off) ;
compile ignore_unused_test.cpp ;
@@ -181,13 +185,23 @@ run demangled_name_test.cpp : : : <rtti>off <test-info>always_show_run_output :
run scoped_enum.cpp ;
compile-fail scoped_enum_compile_fail_conv_from_int.cpp
: $(warning-as-errors-off) ;
: $(warnings-as-errors-off) ;
compile-fail scoped_enum_compile_fail_conv_to_int.cpp
: $(warning-as-errors-off) ;
: $(warnings-as-errors-off) ;
run underlying_type.cpp ;
compile-fail null_deleter_compile_fail_adl.cpp
: $(warnings-as-errors-off) ;
run fclose_deleter_test.cpp : : : <target-os>windows:<define>_CRT_SECURE_NO_WARNINGS <target-os>windows:<define>_CRT_SECURE_NO_DEPRECATE ;
compile-fail fclose_deleter_compile_fail_adl.cpp
: <target-os>windows:<define>_CRT_SECURE_NO_WARNINGS <target-os>windows:<define>_CRT_SECURE_NO_DEPRECATE $(warnings-as-errors-off) ;
run functor_test.cpp ;
compile-fail functor_compile_fail_adl.cpp
: $(warnings-as-errors-off) ;
run pointer_traits_pointer_test.cpp ;
run pointer_traits_element_type_test.cpp ;
@@ -251,6 +265,7 @@ run allocator_destroy_test.cpp ;
run allocator_construct_n_test.cpp ;
run allocator_destroy_n_test.cpp ;
run allocator_traits_test.cpp ;
compile allocator_pmr_test.cpp ;
lib lib_typeid : lib_typeid.cpp : <link>shared:<define>LIB_TYPEID_DYN_LINK=1 ;
@@ -349,7 +364,10 @@ run sv_common_reference_test.cpp ;
compile sv_common_reference_test2.cpp ;
compile sv_windows_h_test.cpp ;
compile-fail sv_nullptr_fail.cpp
: $(warning-as-errors-off) ;
: $(warnings-as-errors-off) ;
compile sv_construct_test_cx.cpp ;
compile sv_construct_test_cx2.cpp ;
run span_test.cpp ;
run span_types_test.cpp ;
@@ -378,10 +396,16 @@ run memory_resource_test.cpp ;
run data_test.cpp ;
run size_test.cpp ;
run serialization_nvp_test.cpp : : : <library>/boost//serialization/<warnings>off <undefined-sanitizer>norecover:<build>no ;
run serialization_split_free_test.cpp : : : <library>/boost//serialization/<warnings>off <undefined-sanitizer>norecover:<link>static ;
run serialization_split_member_test.cpp : : : <library>/boost//serialization/<warnings>off <undefined-sanitizer>norecover:<link>static ;
run serialization_construct_data_test.cpp : : : <library>/boost//serialization/<warnings>off <undefined-sanitizer>norecover:<link>static ;
import ../../config/checks/config : requires ;
local CPP11 = [ requires cxx11_variadic_templates cxx11_template_aliases cxx11_decltype cxx11_constexpr cxx11_noexcept ] ;
local with-serialization = <library>/boost//serialization/<warnings>off $(warnings-as-errors-off) <undefined-sanitizer>norecover:<link>static $(CPP11) ;
run serialization_nvp_test.cpp : : : $(with-serialization) <undefined-sanitizer>norecover:<build>no ;
run serialization_split_free_test.cpp : : : $(with-serialization) ;
run serialization_split_member_test.cpp : : : $(with-serialization) ;
run serialization_construct_data_test.cpp : : : $(with-serialization) ;
run identity_test.cpp ;
run identity_rvalue_test.cpp ;
@@ -392,5 +416,8 @@ run sp_thread_sleep_test.cpp ;
run yield_prim_windows_h_test.cpp ;
run yield_prim_pthread_cancel_test.cpp : ;
run pointer_in_range_test.cpp ;
compile pointer_in_range_constexpr_test.cpp ;
use-project /boost/core/swap : ./swap ;
build-project ./swap ;

View File

@@ -0,0 +1,22 @@
//
// Testing stdlib polymorphic allocators
//
// Copyright 2024 Braden Ganetsky
//
// 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/allocator_access.hpp>
#include <boost/config.hpp>
#ifndef BOOST_NO_CXX17_HDR_MEMORY_RESOURCE
#include <memory_resource>
void pmr_allocator_destroy_compiles(std::pmr::polymorphic_allocator<int>& alloc, int* p)
{
boost::allocator_destroy(alloc, p);
}
#endif // !defined(BOOST_NO_CXX17_HDR_MEMORY_RESOURCE)

View File

@@ -0,0 +1,30 @@
/*
* Copyright Andrey Semashev 2024.
* Distributed under the Boost Software License, Version 1.0.
* (See accompanying file LICENSE_1_0.txt or copy at
* http://www.boost.org/LICENSE_1_0.txt)
*/
/*!
* \file checked_array_deleter_compile_fail_adl.cpp
* \author Andrey Semashev
* \date 07.02.2024
*
* This file tests that \c boost::checked_array_deleter doesn't bring namespace
* \c boost into ADL.
*/
#include <boost/core/checked_delete.hpp>
namespace boost {
void check_adl(checked_array_deleter< int > const&)
{
}
} // namespace boost
int main()
{
// Must not find boost::check_adl
check_adl(boost::checked_array_deleter< int >());
}

View File

@@ -0,0 +1,30 @@
/*
* Copyright Andrey Semashev 2024.
* Distributed under the Boost Software License, Version 1.0.
* (See accompanying file LICENSE_1_0.txt or copy at
* http://www.boost.org/LICENSE_1_0.txt)
*/
/*!
* \file checked_deleter_compile_fail_adl.cpp
* \author Andrey Semashev
* \date 07.02.2024
*
* This file tests that \c boost::checked_deleter doesn't bring namespace
* \c boost into ADL.
*/
#include <boost/core/checked_delete.hpp>
namespace boost {
void check_adl(checked_deleter< int > const&)
{
}
} // namespace boost
int main()
{
// Must not find boost::check_adl
check_adl(boost::checked_deleter< int >());
}

View File

@@ -0,0 +1,30 @@
/*
* Copyright Andrey Semashev 2024.
* Distributed under the Boost Software License, Version 1.0.
* (See accompanying file LICENSE_1_0.txt or copy at
* http://www.boost.org/LICENSE_1_0.txt)
*/
/*!
* \file fclose_deleter_compile_fail_adl.cpp
* \author Andrey Semashev
* \date 02.02.2024
*
* This file tests that \c boost::fclose_deleter doesn't bring namespace
* \c boost into ADL.
*/
#include <boost/core/fclose_deleter.hpp>
namespace boost {
void check_adl(fclose_deleter const&)
{
}
} // namespace boost
int main()
{
// Must not find boost::check_adl
check_adl(boost::fclose_deleter());
}

View File

@@ -0,0 +1,32 @@
/*
* Copyright Andrey Semashev 2024.
* Distributed under the Boost Software License, Version 1.0.
* (See accompanying file LICENSE_1_0.txt or copy at
* http://www.boost.org/LICENSE_1_0.txt)
*/
/*!
* \file functor_compile_fail_adl.cpp
* \author Andrey Semashev
* \date 02.02.2024
*
* This file tests that \c boost::core::functor doesn't bring namespace
* \c boost::core into ADL.
*/
#include <boost/core/functor.hpp>
void func() {}
namespace boost::core {
void check_adl(functor< ::func > const&)
{
}
} // namespace boost::core
int main()
{
// Must not find boost::check_adl
check_adl(boost::core::functor< ::func >());
}

202
test/functor_test.cpp Normal file
View File

@@ -0,0 +1,202 @@
/*
* Copyright Andrey Semashev 2024.
* Distributed under the Boost Software License, Version 1.0.
* (See accompanying file LICENSE_1_0.txt or copy at
* http://www.boost.org/LICENSE_1_0.txt)
*/
/*!
* \file functor_test.cpp
* \author Andrey Semashev
* \date 2024-01-23
*
* This file contains tests for \c boost::core::functor.
*/
#include <boost/config.hpp>
#if !defined(BOOST_NO_CXX17_AUTO_NONTYPE_TEMPLATE_PARAMS)
#include <boost/core/functor.hpp>
#include <boost/core/lightweight_test.hpp>
#include <boost/core/lightweight_test_trait.hpp>
#include <type_traits>
#if (defined(__cpp_lib_is_invocable) && (__cpp_lib_is_invocable >= 201703l)) || \
(defined(BOOST_MSSTL_VERSION) && (BOOST_MSSTL_VERSION >= 140) && (BOOST_CXX_VERSION >= 201703l))
namespace test {
using std::is_invocable;
} // namespace test
#else
namespace test {
// A simplified implementation that does not support member function pointers
template< typename Func, typename... Args >
struct is_invocable_impl
{
template< typename F = Func, typename = decltype(std::declval< F >()(std::declval< Args >()...)) >
static std::true_type _check_invocable(int);
static std::false_type _check_invocable(...);
typedef decltype(is_invocable_impl::_check_invocable(0)) type;
};
template< typename Func, typename... Args >
struct is_invocable : public is_invocable_impl< Func, Args... >::type { };
} // namespace test
#endif
int g_n = 0;
void void_func()
{
++g_n;
}
int int_func()
{
return ++g_n;
}
int& int_ref_func()
{
++g_n;
return g_n;
}
void void_add1(int x)
{
g_n += x;
}
int add2(int x, int y)
{
return x + y;
}
namespace test_ns {
int add3(int x, int y, int z)
{
return x + y + z;
}
} // namespace test_ns
int int_func_noexcept() noexcept
{
return ++g_n;
}
int main()
{
{
boost::core::functor< void_func > fun;
BOOST_TEST_TRAIT_TRUE((test::is_invocable< boost::core::functor< void_func >& >));
BOOST_TEST_TRAIT_TRUE((test::is_invocable< boost::core::functor< void_func > const& >));
BOOST_TEST_TRAIT_FALSE((test::is_invocable< boost::core::functor< void_func > const&, int >));
BOOST_TEST_EQ(noexcept(fun()), false);
fun();
BOOST_TEST_EQ(g_n, 1);
fun();
BOOST_TEST_EQ(g_n, 2);
}
g_n = 0;
{
boost::core::functor< int_func > fun;
int res = fun();
BOOST_TEST_EQ(res, 1);
BOOST_TEST_EQ(g_n, 1);
res = fun();
BOOST_TEST_EQ(res, 2);
BOOST_TEST_EQ(g_n, 2);
}
g_n = 0;
{
boost::core::functor< int_ref_func > fun;
int& res1 = fun();
BOOST_TEST_EQ(&res1, &g_n);
BOOST_TEST_EQ(res1, 1);
int& res2 = fun();
BOOST_TEST_EQ(&res2, &g_n);
BOOST_TEST_EQ(res2, 2);
}
g_n = 0;
{
boost::core::functor< void_add1 > fun;
BOOST_TEST_TRAIT_FALSE((test::is_invocable< boost::core::functor< void_add1 >& >));
BOOST_TEST_TRAIT_FALSE((test::is_invocable< boost::core::functor< void_add1 > const& >));
BOOST_TEST_TRAIT_TRUE((test::is_invocable< boost::core::functor< void_add1 >&, int >));
BOOST_TEST_TRAIT_TRUE((test::is_invocable< boost::core::functor< void_add1 > const&, int >));
BOOST_TEST_TRAIT_TRUE((test::is_invocable< boost::core::functor< void_add1 >&, short int >));
BOOST_TEST_TRAIT_TRUE((test::is_invocable< boost::core::functor< void_add1 > const&, short int >));
BOOST_TEST_TRAIT_FALSE((test::is_invocable< boost::core::functor< void_add1 > const&, int, int >));
BOOST_TEST_TRAIT_FALSE((test::is_invocable< boost::core::functor< void_add1 > const&, const char* >));
fun(10);
BOOST_TEST_EQ(g_n, 10);
fun(20);
BOOST_TEST_EQ(g_n, 30);
}
{
boost::core::functor< add2 > fun;
BOOST_TEST_TRAIT_FALSE((test::is_invocable< boost::core::functor< add2 >& >));
BOOST_TEST_TRAIT_FALSE((test::is_invocable< boost::core::functor< add2 > const& >));
BOOST_TEST_TRAIT_FALSE((test::is_invocable< boost::core::functor< add2 >&, int >));
BOOST_TEST_TRAIT_FALSE((test::is_invocable< boost::core::functor< add2 > const&, int >));
BOOST_TEST_TRAIT_TRUE((test::is_invocable< boost::core::functor< add2 >&, int, int >));
BOOST_TEST_TRAIT_TRUE((test::is_invocable< boost::core::functor< add2 > const&, int, int >));
BOOST_TEST_TRAIT_TRUE((test::is_invocable< boost::core::functor< add2 >&, short int, signed char >));
BOOST_TEST_TRAIT_TRUE((test::is_invocable< boost::core::functor< add2 > const&, short int, signed char >));
BOOST_TEST_TRAIT_FALSE((test::is_invocable< boost::core::functor< add2 > const&, const char* >));
BOOST_TEST_TRAIT_FALSE((test::is_invocable< boost::core::functor< add2 > const&, const char*, float >));
int res = fun(10, 20);
BOOST_TEST_EQ(res, 30);
res = fun(30, 40);
BOOST_TEST_EQ(res, 70);
}
{
boost::core::functor< test_ns::add3 > fun;
int res = fun(10, 20, 30);
BOOST_TEST_EQ(res, 60);
res = fun(40, 50, 60);
BOOST_TEST_EQ(res, 150);
}
g_n = 0;
{
boost::core::functor< int_func_noexcept > fun;
BOOST_TEST_EQ(noexcept(fun()), true);
int res = fun();
BOOST_TEST_EQ(res, 1);
BOOST_TEST_EQ(g_n, 1);
res = fun();
BOOST_TEST_EQ(res, 2);
BOOST_TEST_EQ(g_n, 2);
}
return boost::report_errors();
}
#else // !defined(BOOST_NO_CXX17_AUTO_NONTYPE_TEMPLATE_PARAMS)
#include <boost/config/pragma_message.hpp>
BOOST_PRAGMA_MESSAGE("Test skipped because C++17 auto non-type template parameters are not supported")
int main()
{
return 0;
}
#endif // !defined(BOOST_NO_CXX17_AUTO_NONTYPE_TEMPLATE_PARAMS)

View File

@@ -0,0 +1,30 @@
/*
* Copyright Andrey Semashev 2024.
* Distributed under the Boost Software License, Version 1.0.
* (See accompanying file LICENSE_1_0.txt or copy at
* http://www.boost.org/LICENSE_1_0.txt)
*/
/*!
* \file fclose_deleter_compile_fail_adl.cpp
* \author Andrey Semashev
* \date 02.02.2024
*
* This file tests that \c boost::null_deleter doesn't bring namespace
* \c boost into ADL.
*/
#include <boost/core/null_deleter.hpp>
namespace boost {
void check_adl(null_deleter const&)
{
}
} // namespace boost
int main()
{
// Must not find boost::check_adl
check_adl(boost::null_deleter());
}

View File

@@ -0,0 +1,31 @@
/*
Copyright 2024 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_in_range.hpp>
#include <boost/static_assert.hpp>
#if !defined(BOOST_CORE_NO_CONSTEXPR_POINTER_IN_RANGE)
int a[4] = { 0, 0, 0, 0 };
int n = 0;
const int b[4] = { 0, 0, 0, 0 };
const int m = 0;
BOOST_STATIC_ASSERT(!boost::pointer_in_range(&a[0], &a[1], a + 4));
BOOST_STATIC_ASSERT(boost::pointer_in_range(&a[1], &a[1], a + 4));
BOOST_STATIC_ASSERT(boost::pointer_in_range(&a[2], &a[1], a + 4));
BOOST_STATIC_ASSERT(boost::pointer_in_range(&a[3], &a[1], a + 4));
BOOST_STATIC_ASSERT(!boost::pointer_in_range(a + 4, &a[1], a + 4));
BOOST_STATIC_ASSERT(!boost::pointer_in_range(&n, &a[0], &a[3]));
BOOST_STATIC_ASSERT(!boost::pointer_in_range(&m, &a[0], &a[3]));
BOOST_STATIC_ASSERT(!boost::pointer_in_range(&b[0], &b[1], b + 4));
BOOST_STATIC_ASSERT(boost::pointer_in_range(&b[1], &b[1], b + 4));
BOOST_STATIC_ASSERT(boost::pointer_in_range(&b[2], &b[1], b + 4));
BOOST_STATIC_ASSERT(boost::pointer_in_range(&b[3], &b[1], b + 4));
BOOST_STATIC_ASSERT(!boost::pointer_in_range(b + 4, &b[1], b + 4));
BOOST_STATIC_ASSERT(!boost::pointer_in_range(&n, &b[0], &b[3]));
BOOST_STATIC_ASSERT(!boost::pointer_in_range(&m, &b[0], &b[3]));
#endif

View File

@@ -0,0 +1,32 @@
/*
Copyright 2024 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_in_range.hpp>
#include <boost/core/lightweight_test.hpp>
int main()
{
int a[4] = { 0, 0, 0, 0 };
int n = 0;
const int b[4] = { 0, 0, 0, 0 };
const int m = 0;
BOOST_TEST(!boost::pointer_in_range(&a[0], &a[1], a + 4));
BOOST_TEST(boost::pointer_in_range(&a[1], &a[1], a + 4));
BOOST_TEST(boost::pointer_in_range(&a[2], &a[1], a + 4));
BOOST_TEST(boost::pointer_in_range(&a[3], &a[1], a + 4));
BOOST_TEST(!boost::pointer_in_range(a + 4, &a[1], a + 4));
BOOST_TEST(!boost::pointer_in_range(&n, &a[0], &a[3]));
BOOST_TEST(!boost::pointer_in_range(&m, &a[0], &a[3]));
BOOST_TEST(!boost::pointer_in_range(&b[0], &b[1], b + 4));
BOOST_TEST(boost::pointer_in_range(&b[1], &b[1], b + 4));
BOOST_TEST(boost::pointer_in_range(&b[2], &b[1], b + 4));
BOOST_TEST(boost::pointer_in_range(&b[3], &b[1], b + 4));
BOOST_TEST(!boost::pointer_in_range(b + 4, &b[1], b + 4));
BOOST_TEST(!boost::pointer_in_range(&n, &b[0], &b[3]));
BOOST_TEST(!boost::pointer_in_range(&m, &b[0], &b[3]));
return boost::report_errors();
}

View File

@@ -4,6 +4,18 @@
#include <boost/core/detail/string_view.hpp>
#include <boost/core/lightweight_test.hpp>
#include <boost/config.hpp>
#if !defined(BOOST_NO_CXX17_HDR_MEMORY_RESOURCE)
# if defined(__apple_build_version__)
// Under macOS, it's possible for the header
// <memory_resource> to be present, but for
// libc++.dylib to not have support for it.
// https://github.com/boostorg/core/issues/162
# define BOOST_NO_CXX17_HDR_MEMORY_RESOURCE
# endif
#endif
#include <iterator>
#include <string>
#if !defined(BOOST_NO_CXX17_HDR_STRING_VIEW)

View File

@@ -0,0 +1,147 @@
// Copyright 2021, 2024 Peter Dimov
// Distributed under the Boost Software License, Version 1.0.
// https://www.boost.org/LICENSE_1_0.txt
#include <boost/core/detail/string_view.hpp>
#include <boost/config.hpp>
#include <boost/config/pragma_message.hpp>
#if defined(BOOST_NO_CXX14_CONSTEXPR)
BOOST_PRAGMA_MESSAGE( "Test skipped because BOOST_NO_CXX14_CONSTEXPR is defined" )
int main() {}
#else
#if !defined(BOOST_NO_CXX17_HDR_STRING_VIEW)
# include <string_view>
#endif
#define STATIC_ASSERT(...) static_assert(__VA_ARGS__, #__VA_ARGS__)
int main()
{
{
constexpr boost::core::string_view sv;
STATIC_ASSERT( sv.data() == nullptr );
STATIC_ASSERT( sv.size() == 0 );
STATIC_ASSERT( sv.begin() == sv.data() );
STATIC_ASSERT( sv.end() == sv.data() + sv.size() );
STATIC_ASSERT( sv.cbegin() == sv.data() );
STATIC_ASSERT( sv.cend() == sv.data() + sv.size() );
STATIC_ASSERT( sv.length() == sv.size() );
STATIC_ASSERT( sv.empty() == ( sv.size() == 0 ) );
STATIC_ASSERT( sv.max_size() == boost::core::string_view::npos );
}
{
constexpr char const* s = "123";
constexpr boost::core::string_view sv( s, 0 );
STATIC_ASSERT( sv.data() == s );
STATIC_ASSERT( sv.size() == 0 );
STATIC_ASSERT( sv.begin() == sv.data() );
STATIC_ASSERT( sv.end() == sv.data() + sv.size() );
STATIC_ASSERT( sv.cbegin() == sv.data() );
STATIC_ASSERT( sv.cend() == sv.data() + sv.size() );
STATIC_ASSERT( sv.length() == sv.size() );
STATIC_ASSERT( sv.empty() == ( sv.size() == 0 ) );
STATIC_ASSERT( sv.max_size() == boost::core::string_view::npos );
}
{
constexpr char const* s = "123";
constexpr boost::core::string_view sv( s, 2 );
STATIC_ASSERT( sv.data() == s );
STATIC_ASSERT( sv.size() == 2 );
STATIC_ASSERT( sv.begin() == sv.data() );
STATIC_ASSERT( sv.end() == sv.data() + sv.size() );
STATIC_ASSERT( sv.cbegin() == sv.data() );
STATIC_ASSERT( sv.cend() == sv.data() + sv.size() );
STATIC_ASSERT( sv.length() == sv.size() );
STATIC_ASSERT( sv.empty() == ( sv.size() == 0 ) );
STATIC_ASSERT( sv.max_size() == boost::core::string_view::npos );
}
{
constexpr char const* s = "123";
constexpr boost::core::string_view sv( s, s );
STATIC_ASSERT( sv.data() == s );
STATIC_ASSERT( sv.size() == 0 );
STATIC_ASSERT( sv.begin() == sv.data() );
STATIC_ASSERT( sv.end() == sv.data() + sv.size() );
STATIC_ASSERT( sv.cbegin() == sv.data() );
STATIC_ASSERT( sv.cend() == sv.data() + sv.size() );
STATIC_ASSERT( sv.length() == sv.size() );
STATIC_ASSERT( sv.empty() == ( sv.size() == 0 ) );
STATIC_ASSERT( sv.max_size() == boost::core::string_view::npos );
}
{
constexpr char const* s = "123";
constexpr boost::core::string_view sv( s, s + 2 );
STATIC_ASSERT( sv.data() == s );
STATIC_ASSERT( sv.size() == 2 );
STATIC_ASSERT( sv.begin() == sv.data() );
STATIC_ASSERT( sv.end() == sv.data() + sv.size() );
STATIC_ASSERT( sv.cbegin() == sv.data() );
STATIC_ASSERT( sv.cend() == sv.data() + sv.size() );
STATIC_ASSERT( sv.length() == sv.size() );
STATIC_ASSERT( sv.empty() == ( sv.size() == 0 ) );
STATIC_ASSERT( sv.max_size() == boost::core::string_view::npos );
}
#if !defined(BOOST_NO_CXX17_HDR_STRING_VIEW)
{
constexpr std::string_view str( "123", 3 );
constexpr boost::core::string_view sv( str );
STATIC_ASSERT( sv.data() == str.data() );
STATIC_ASSERT( sv.size() == str.size() );
STATIC_ASSERT( sv.begin() == sv.data() );
STATIC_ASSERT( sv.end() == sv.data() + sv.size() );
STATIC_ASSERT( sv.cbegin() == sv.data() );
STATIC_ASSERT( sv.cend() == sv.data() + sv.size() );
STATIC_ASSERT( sv.length() == sv.size() );
STATIC_ASSERT( sv.empty() == ( sv.size() == 0 ) );
STATIC_ASSERT( sv.max_size() == boost::core::string_view::npos );
}
#endif
}
#endif

View File

@@ -0,0 +1,75 @@
// Copyright 2021, 2024 Peter Dimov
// Distributed under the Boost Software License, Version 1.0.
// https://www.boost.org/LICENSE_1_0.txt
#include <boost/core/detail/string_view.hpp>
#include <boost/config.hpp>
#include <boost/config/pragma_message.hpp>
#if defined(BOOST_NO_CXX14_CONSTEXPR)
BOOST_PRAGMA_MESSAGE( "Test skipped because BOOST_NO_CXX14_CONSTEXPR is defined" )
int main() {}
#elif BOOST_CXX_VERSION < 201703L
// std::char_traits is not constexpr in C++14
BOOST_PRAGMA_MESSAGE( "Test skipped because BOOST_CXX_VERSION < 201703L" )
int main() {}
#elif defined(BOOST_LIBSTDCXX_VERSION) && BOOST_LIBSTDCXX_VERSION < 70300
// std::char_traits is not constexpr in libstdc++ 7.2
BOOST_PRAGMA_MESSAGE( "Test skipped because BOOST_LIBSTDCXX_VERSION < 70300" )
int main() {}
#else
#define STATIC_ASSERT(...) static_assert(__VA_ARGS__, #__VA_ARGS__)
int main()
{
{
constexpr char const* s = "";
constexpr boost::core::string_view sv( s );
STATIC_ASSERT( sv.data() == s );
STATIC_ASSERT( sv.size() == 0 );
STATIC_ASSERT( sv.begin() == sv.data() );
STATIC_ASSERT( sv.end() == sv.data() + sv.size() );
STATIC_ASSERT( sv.cbegin() == sv.data() );
STATIC_ASSERT( sv.cend() == sv.data() + sv.size() );
STATIC_ASSERT( sv.length() == sv.size() );
STATIC_ASSERT( sv.empty() == ( sv.size() == 0 ) );
STATIC_ASSERT( sv.max_size() == boost::core::string_view::npos );
}
{
constexpr char const* s = "123";
constexpr boost::core::string_view sv( s );
STATIC_ASSERT( sv.data() == s );
STATIC_ASSERT( sv.size() == 3 );
STATIC_ASSERT( sv.begin() == sv.data() );
STATIC_ASSERT( sv.end() == sv.data() + sv.size() );
STATIC_ASSERT( sv.cbegin() == sv.data() );
STATIC_ASSERT( sv.cend() == sv.data() + sv.size() );
STATIC_ASSERT( sv.length() == sv.size() );
STATIC_ASSERT( sv.empty() == ( sv.size() == 0 ) );
STATIC_ASSERT( sv.max_size() == boost::core::string_view::npos );
}
}
#endif

View File

@@ -4,6 +4,18 @@
#include <boost/core/detail/string_view.hpp>
#include <boost/core/lightweight_test.hpp>
#include <boost/config.hpp>
#if !defined(BOOST_NO_CXX17_HDR_MEMORY_RESOURCE)
# if defined(__apple_build_version__)
// Under macOS, it's possible for the header
// <memory_resource> to be present, but for
// libc++.dylib to not have support for it.
// https://github.com/boostorg/core/issues/162
# define BOOST_NO_CXX17_HDR_MEMORY_RESOURCE
# endif
#endif
#include <string>
#if !defined(BOOST_NO_CXX17_HDR_STRING_VIEW)
# include <string_view>

View File

@@ -4,6 +4,18 @@
#include <boost/core/detail/string_view.hpp>
#include <boost/core/lightweight_test.hpp>
#include <boost/config.hpp>
#if !defined(BOOST_NO_CXX17_HDR_MEMORY_RESOURCE)
# if defined(__apple_build_version__)
// Under macOS, it's possible for the header
// <memory_resource> to be present, but for
// libc++.dylib to not have support for it.
// https://github.com/boostorg/core/issues/162
# define BOOST_NO_CXX17_HDR_MEMORY_RESOURCE
# endif
#endif
#include <cstddef>
#if !defined(BOOST_NO_CXX17_HDR_STRING_VIEW)
# include <string_view>

View File

@@ -4,6 +4,18 @@
#include <boost/core/detail/string_view.hpp>
#include <boost/core/lightweight_test.hpp>
#include <boost/config.hpp>
#if !defined(BOOST_NO_CXX17_HDR_MEMORY_RESOURCE)
# if defined(__apple_build_version__)
// Under macOS, it's possible for the header
// <memory_resource> to be present, but for
// libc++.dylib to not have support for it.
// https://github.com/boostorg/core/issues/162
# define BOOST_NO_CXX17_HDR_MEMORY_RESOURCE
# endif
#endif
#include <cstddef>
#if !defined(BOOST_NO_CXX17_HDR_STRING_VIEW)
# include <string_view>

View File

@@ -7,12 +7,8 @@
# bring in rules for testing
import testing ;
compile swap_root_header_1.cpp ;
compile swap_root_header_2.cpp ;
compile swap_lib_header_1.cpp ;
compile swap_lib_header_2.cpp ;
compile swap_mixed_headers_1.cpp ;
compile swap_mixed_headers_2.cpp ;
compile swap_noexcept.cpp ;
compile-fail swap_const_wrapper_fail.cpp ;

View File

@@ -4,9 +4,9 @@
// (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
// Tests swapping an array of arrays of swap_test_class objects by means of boost::swap.
// Tests swapping an array of arrays of swap_test_class objects by means of boost::core::invoke_swap.
#include <boost/utility/swap.hpp>
#include <boost/core/invoke_swap.hpp>
#include <boost/core/lightweight_test.hpp>
#define BOOST_CHECK BOOST_TEST
#define BOOST_CHECK_EQUAL BOOST_TEST_EQ
@@ -59,7 +59,7 @@ int main()
ptr2[i].set_data( static_cast<int>(i + number_of_elements) );
}
boost::swap(array1, array2);
boost::core::invoke_swap(array1, array2);
for (std::size_t i = 0; i < number_of_elements; ++i)
{

View File

@@ -4,9 +4,9 @@
// (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
// Tests swapping an array of arrays of integers by means of boost::swap.
// Tests swapping an array of arrays of integers by means of boost::core::invoke_swap.
#include <boost/utility/swap.hpp>
#include <boost/core/invoke_swap.hpp>
#include <boost/core/lightweight_test.hpp>
#define BOOST_CHECK BOOST_TEST
#define BOOST_CHECK_EQUAL BOOST_TEST_EQ
@@ -32,7 +32,7 @@ int main()
ptr2[i] = static_cast<int>(i + number_of_elements);
}
boost::swap(array1, array2);
boost::core::invoke_swap(array1, array2);
for (std::size_t i = 0; i < number_of_elements; ++i)
{

View File

@@ -4,9 +4,9 @@
// (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
// Tests swapping an array of arrays of swap_test_class objects by means of boost::swap.
// Tests swapping an array of arrays of swap_test_class objects by means of boost::core::invoke_swap.
#include <boost/utility/swap.hpp>
#include <boost/core/invoke_swap.hpp>
#include <boost/core/lightweight_test.hpp>
#define BOOST_CHECK BOOST_TEST
#define BOOST_CHECK_EQUAL BOOST_TEST_EQ
@@ -54,7 +54,7 @@ int main()
std::copy(initial_array2, initial_array2 + array_size, array2);
swap_test_class::reset();
boost::swap(array1, array2);
boost::core::invoke_swap(array1, array2);
BOOST_CHECK(std::equal(array1, array1 + array_size, initial_array2));
BOOST_CHECK(std::equal(array2, array2 + array_size, initial_array1));

View File

@@ -4,9 +4,9 @@
// (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
// Tests swapping an array of integers by means of boost::swap.
// Tests swapping an array of integers by means of boost::core::invoke_swap.
#include <boost/utility/swap.hpp>
#include <boost/core/invoke_swap.hpp>
#include <boost/core/lightweight_test.hpp>
#define BOOST_CHECK BOOST_TEST
#define BOOST_CHECK_EQUAL BOOST_TEST_EQ
@@ -27,7 +27,7 @@ int main()
std::copy(initial_array1, initial_array1 + array_size, array1);
std::copy(initial_array2, initial_array2 + array_size, array2);
boost::swap(array1, array2);
boost::core::invoke_swap(array1, array2);
BOOST_CHECK(std::equal(array1, array1 + array_size, initial_array2));
BOOST_CHECK(std::equal(array2, array2 + array_size, initial_array1));

View File

@@ -4,9 +4,9 @@
// (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
// Tests swapping an array of swap_test_template<int> objects by means of boost::swap.
// Tests swapping an array of swap_test_template<int> objects by means of boost::core::invoke_swap.
#include <boost/utility/swap.hpp>
#include <boost/core/invoke_swap.hpp>
#include <boost/core/lightweight_test.hpp>
#define BOOST_CHECK BOOST_TEST
#define BOOST_CHECK_EQUAL BOOST_TEST_EQ
@@ -60,7 +60,7 @@ int main()
std::copy(initial_array2, initial_array2 + array_size, array2);
swap_test_class::reset();
boost::swap(array1, array2);
boost::core::invoke_swap(array1, array2);
BOOST_CHECK(std::equal(array1, array1 + array_size, initial_array2));
BOOST_CHECK(std::equal(array2, array2 + array_size, initial_array1));

View File

@@ -1,8 +1,8 @@
// Copyright 2018 Andrzej Krzemieński
// Copyright 2018 Andrzej Krzemieński
// Copyright 2018 Peter Dimov
// Distributed under the Boost Software License, Version 1.0.
#include <boost/core/swap.hpp>
#include <boost/core/invoke_swap.hpp>
namespace boost
{
@@ -14,7 +14,7 @@ template<class T> struct Wrapper
template<class T> inline void swap( Wrapper<T> & w, Wrapper<T> & v )
{
boost::swap( w, v );
boost::core::invoke_swap( w, v );
}
} // namespace boost

View File

@@ -6,5 +6,5 @@
// Tests that the swap header compiles as a standalone translation unit
#include <boost/utility/swap.hpp>
#include <boost/core/invoke_swap.hpp>

View File

@@ -6,6 +6,6 @@
// Tests that the swap header include guards work correctly
#include <boost/utility/swap.hpp>
#include <boost/utility/swap.hpp>
#include <boost/core/invoke_swap.hpp>
#include <boost/core/invoke_swap.hpp>

View File

@@ -1,11 +0,0 @@
// Copyright (c) 2007 Joseph Gauterin
//
// 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)
// Tests that the swap headers work when both are included
#include <boost/swap.hpp>
#include <boost/utility/swap.hpp>

View File

@@ -1,12 +0,0 @@
// Copyright (c) 2007 Joseph Gauterin
//
// 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)
// Tests that the swap headers work when both are included
#include <boost/utility/swap.hpp>
#include <boost/swap.hpp>

View File

@@ -4,15 +4,15 @@
// (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
// boost::swap internally does an unqualified function call to swap.
// boost::core::invoke_swap internally does an unqualified function call to swap.
// This could have led to ambiguity or infinite recursion, when the
// objects to be swapped would themselves be from the boost namespace.
// If so, boost::swap itself might be found by argument dependent lookup.
// The implementation of boost::swap resolves this issue by giving
// boost::swap two template argumetns, thereby making it less specialized
// If so, boost::core::invoke_swap itself might be found by argument dependent lookup.
// The implementation of boost::core::invoke_swap resolves this issue by giving
// boost::core::invoke_swap two template argumetns, thereby making it less specialized
// than std::swap.
#include <boost/utility/swap.hpp>
#include <boost/core/invoke_swap.hpp>
#include <boost/core/lightweight_test.hpp>
#define BOOST_CHECK BOOST_TEST
#define BOOST_CHECK_EQUAL BOOST_TEST_EQ
@@ -33,7 +33,7 @@ int main()
boost::swap_test_class object2 = initial_value2;
boost::swap_test_class::reset();
boost::swap(object1,object2);
boost::core::invoke_swap(object1,object2);
BOOST_CHECK(object1 == initial_value2);
BOOST_CHECK(object2 == initial_value1);

View File

@@ -4,9 +4,9 @@
// (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
// Tests that boost::swap propagates noexcept specification correctly
// Tests that boost::core::invoke_swap propagates noexcept specification correctly
#include <boost/core/swap.hpp>
#include <boost/core/invoke_swap.hpp>
#include <boost/config.hpp>
#if !defined(BOOST_NO_CXX11_NOEXCEPT) && !defined(BOOST_NO_CXX11_STATIC_ASSERT) && \
@@ -34,9 +34,9 @@ struct class_with_except_swap
} // namespace test_ns
static_assert(noexcept(boost::swap(test_ns::class_with_noexcept_swap::instance(), test_ns::class_with_noexcept_swap::instance())),
"boost::swap for class_with_noexcept_swap should have noexcept specification");
static_assert(!noexcept(boost::swap(test_ns::class_with_except_swap::instance(), test_ns::class_with_except_swap::instance())),
"boost::swap for class_with_except_swap should not have noexcept specification");
static_assert(noexcept(boost::core::invoke_swap(test_ns::class_with_noexcept_swap::instance(), test_ns::class_with_noexcept_swap::instance())),
"boost::core::invoke_swap for class_with_noexcept_swap should have noexcept specification");
static_assert(!noexcept(boost::core::invoke_swap(test_ns::class_with_except_swap::instance(), test_ns::class_with_except_swap::instance())),
"boost::core::invoke_swap for class_with_except_swap should not have noexcept specification");
#endif // !defined(BOOST_NO_CXX11_NOEXCEPT) && !defined(BOOST_NO_CXX11_STATIC_ASSERT) ...

View File

@@ -4,7 +4,7 @@
// (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
#include <boost/utility/swap.hpp>
#include <boost/core/invoke_swap.hpp>
#include <boost/core/lightweight_test.hpp>
#define BOOST_CHECK BOOST_TEST
#define BOOST_CHECK_EQUAL BOOST_TEST_EQ
@@ -14,7 +14,7 @@ int main()
int object1 = 1;
int object2 = 2;
boost::swap(object1,object2);
boost::core::invoke_swap(object1,object2);
BOOST_CHECK_EQUAL(object1,2);
BOOST_CHECK_EQUAL(object2,1);

View File

@@ -1,10 +0,0 @@
// Copyright (c) 2007 Joseph Gauterin
//
// 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)
// Tests that the swap header compiles as a standalone translation unit
#include <boost/swap.hpp>

View File

@@ -1,11 +0,0 @@
// Copyright (c) 2007 Joseph Gauterin
//
// 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)
// Tests that the swap header include guards work correctly
#include <boost/swap.hpp>
#include <boost/swap.hpp>

View File

@@ -4,7 +4,7 @@
// (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
#include <boost/utility/swap.hpp>
#include <boost/core/invoke_swap.hpp>
#include <boost/core/lightweight_test.hpp>
#define BOOST_CHECK BOOST_TEST
#define BOOST_CHECK_EQUAL BOOST_TEST_EQ
@@ -33,7 +33,7 @@ int main()
boost::swap_test_class object2 = initial_value2;
boost::swap_test_class::reset();
boost::swap(object1,object2);
boost::core::invoke_swap(object1,object2);
BOOST_CHECK(object1 == initial_value2);
BOOST_CHECK(object2 == initial_value1);

View File

@@ -8,13 +8,13 @@
// properly swapped, when both boost and the other namespace have a custom
// swap function for that class. Note that it shouldn't be necessary for a class
// in an other namespace to have a custom swap function in boost, because the
// boost::swap utility should find the swap function in the other namespace, by
// argument dependent lookup (ADL). Unfortunately ADL isn't fully implemented
// by some specific compiler versions, including Intel C++ 8.1, MSVC 7.1, and
// Borland 5.9.3. Users of those compilers might consider adding a swap overload
// boost::core::invoke_swap utility should find the swap function in the other
// namespace, by argument dependent lookup (ADL). Unfortunately ADL isn't fully
// implemented by some specific compiler versions, including Intel C++ 8.1, MSVC 7.1,
// and Borland 5.9.3. Users of those compilers might consider adding a swap overload
// to the boost namespace.
#include <boost/utility/swap.hpp>
#include <boost/core/invoke_swap.hpp>
#include <boost/core/lightweight_test.hpp>
#define BOOST_CHECK BOOST_TEST
#define BOOST_CHECK_EQUAL BOOST_TEST_EQ
@@ -52,7 +52,7 @@ int main()
other::swap_test_class object2 = initial_value2;
other::swap_test_class::reset();
boost::swap(object1,object2);
boost::core::invoke_swap(object1,object2);
BOOST_CHECK(object1 == initial_value2);
BOOST_CHECK(object2 == initial_value1);

View File

@@ -4,7 +4,7 @@
// (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
#include <boost/utility/swap.hpp>
#include <boost/core/invoke_swap.hpp>
#include <boost/core/lightweight_test.hpp>
#define BOOST_CHECK BOOST_TEST
#define BOOST_CHECK_EQUAL BOOST_TEST_EQ
@@ -27,7 +27,7 @@ int main()
swap_test_class object2 = initial_value2;
swap_test_class::reset();
boost::swap(object1,object2);
boost::core::invoke_swap(object1,object2);
BOOST_CHECK(object1 == initial_value2);
BOOST_CHECK(object2 == initial_value1);

View File

@@ -4,7 +4,7 @@
// (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
#include <boost/utility/swap.hpp>
#include <boost/core/invoke_swap.hpp>
#include <boost/core/lightweight_test.hpp>
#define BOOST_CHECK BOOST_TEST
#define BOOST_CHECK_EQUAL BOOST_TEST_EQ
@@ -33,7 +33,7 @@ int main()
other::swap_test_class object2 = initial_value2;
other::swap_test_class::reset();
boost::swap(object1,object2);
boost::core::invoke_swap(object1,object2);
BOOST_CHECK(object1 == initial_value2);
BOOST_CHECK(object2 == initial_value1);

View File

@@ -4,7 +4,7 @@
// (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
#include <boost/utility/swap.hpp>
#include <boost/core/invoke_swap.hpp>
#include <boost/core/lightweight_test.hpp>
#define BOOST_CHECK BOOST_TEST
#define BOOST_CHECK_EQUAL BOOST_TEST_EQ
@@ -32,7 +32,7 @@ int main()
swap_test_class object2 = initial_value2;
swap_test_class::reset();
boost::swap(object1,object2);
boost::core::invoke_swap(object1,object2);
BOOST_CHECK(object1 == initial_value2);
BOOST_CHECK(object2 == initial_value1);

View File

@@ -4,11 +4,11 @@
// (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
// Tests swapping std::bitset<T> objects by means of boost::swap.
// Tests swapping std::bitset<T> objects by means of boost::core::invoke_swap.
// Unlike most other Standard C++ Library template classes,
// std::bitset<T> does not have its own std::swap overload.
#include <boost/utility/swap.hpp>
#include <boost/core/invoke_swap.hpp>
#include <boost/core/lightweight_test.hpp>
#define BOOST_CHECK BOOST_TEST
#define BOOST_CHECK_EQUAL BOOST_TEST_EQ
@@ -24,7 +24,7 @@ int main()
bitset_type object1 = initial_value1;
bitset_type object2 = initial_value2;
boost::swap(object1,object2);
boost::core::invoke_swap(object1,object2);
BOOST_CHECK_EQUAL(object1,initial_value2);
BOOST_CHECK_EQUAL(object2,initial_value1);

View File

@@ -4,11 +4,11 @@
// (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
// Tests swapping std::time_base::dateorder objects by means of boost::swap.
// Tests swapping std::time_base::dateorder objects by means of boost::core::invoke_swap.
// std::time_base::dateorder is an enumerated type. It does not have an
// std::swap overload or template specialization.
#include <boost/utility/swap.hpp>
#include <boost/core/invoke_swap.hpp>
#include <boost/core/lightweight_test.hpp>
#define BOOST_CHECK BOOST_TEST
#define BOOST_CHECK_EQUAL BOOST_TEST_EQ
@@ -23,7 +23,7 @@ int main()
std::time_base::dateorder object1 = initial_value1;
std::time_base::dateorder object2 = initial_value2;
boost::swap(object1,object2);
boost::core::invoke_swap(object1,object2);
BOOST_CHECK_EQUAL(object1,initial_value2);
BOOST_CHECK_EQUAL(object2,initial_value1);

View File

@@ -4,10 +4,10 @@
// (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
// Tests swapping std::string objects by means of boost::swap.
// Tests swapping std::string objects by means of boost::core::invoke_swap.
// std::string has its own std::swap overload.
#include <boost/utility/swap.hpp>
#include <boost/core/invoke_swap.hpp>
#include <boost/core/lightweight_test.hpp>
#define BOOST_CHECK BOOST_TEST
#define BOOST_CHECK_EQUAL BOOST_TEST_EQ
@@ -22,7 +22,7 @@ int main()
std::string object1 = initial_value1;
std::string object2 = initial_value2;
boost::swap(object1,object2);
boost::core::invoke_swap(object1,object2);
BOOST_CHECK_EQUAL(object1,initial_value2);
BOOST_CHECK_EQUAL(object2,initial_value1);

View File

@@ -4,11 +4,11 @@
// (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
// Tests swapping std::type_info pointers by means of boost::swap.
// Tests swapping std::type_info pointers by means of boost::core::invoke_swap.
// There is no std::swap overload or template specialization
// for std::type_info pointers.
#include <boost/utility/swap.hpp>
#include <boost/core/invoke_swap.hpp>
#include <boost/core/lightweight_test.hpp>
#define BOOST_CHECK BOOST_TEST
#define BOOST_CHECK_EQUAL BOOST_TEST_EQ
@@ -23,7 +23,7 @@ int main()
const std::type_info * ptr1 = initial_value1;
const std::type_info * ptr2 = initial_value2;
boost::swap(ptr1,ptr2);
boost::core::invoke_swap(ptr1,ptr2);
BOOST_CHECK_EQUAL(ptr1,initial_value2);
BOOST_CHECK_EQUAL(ptr2,initial_value1);

View File

@@ -4,10 +4,10 @@
// (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
// Tests swapping std::vector objects by means of boost::swap,
// Tests swapping std::vector objects by means of boost::core::invoke_swap,
// having boost::swap_test_class as vector element type.
#include <boost/utility/swap.hpp>
#include <boost/core/invoke_swap.hpp>
#include <boost/core/lightweight_test.hpp>
#define BOOST_CHECK BOOST_TEST
#define BOOST_CHECK_EQUAL BOOST_TEST_EQ
@@ -45,7 +45,7 @@ int main()
swap_test_class_type::reset();
boost::swap(object1,object2);
boost::core::invoke_swap(object1,object2);
BOOST_CHECK_EQUAL(object1.size(),initial_size2);
BOOST_CHECK_EQUAL(object2.size(),initial_size1);

View File

@@ -4,10 +4,10 @@
// (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
// Tests swapping std::vector objects by means of boost::swap,
// Tests swapping std::vector objects by means of boost::core::invoke_swap,
// having ::swap_test_class as vector element type.
#include <boost/utility/swap.hpp>
#include <boost/core/invoke_swap.hpp>
#include <boost/core/lightweight_test.hpp>
#define BOOST_CHECK BOOST_TEST
#define BOOST_CHECK_EQUAL BOOST_TEST_EQ
@@ -38,7 +38,7 @@ int main()
swap_test_class::reset();
boost::swap(object1,object2);
boost::core::invoke_swap(object1,object2);
BOOST_CHECK_EQUAL(object1.size(),initial_size2);
BOOST_CHECK_EQUAL(object2.size(),initial_size1);

View File

@@ -4,10 +4,10 @@
// (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
// Tests swapping std::vector objects by means of boost::swap,
// Tests swapping std::vector objects by means of boost::core::invoke_swap,
// having other::swap_test_class as vector element type.
#include <boost/utility/swap.hpp>
#include <boost/core/invoke_swap.hpp>
#include <boost/core/lightweight_test.hpp>
#define BOOST_CHECK BOOST_TEST
#define BOOST_CHECK_EQUAL BOOST_TEST_EQ
@@ -45,7 +45,7 @@ int main()
swap_test_class_type::reset();
boost::swap(object1,object2);
boost::core::invoke_swap(object1,object2);
BOOST_CHECK_EQUAL(object1.size(),initial_size2);
BOOST_CHECK_EQUAL(object2.size(),initial_size1);