Compare commits

...

114 Commits

Author SHA1 Message Date
65337d1af8 Add a std::formatter specialization for core::string_view. Fixes #190. 2025-06-25 17:11:26 +03:00
16d8f5f8ff Add sv_format_test.cpp. Refs #190. 2025-06-25 16:51:59 +03:00
58f469cd80 Added ARM jobs in GitHub Actions. 2025-06-13 02:30:14 +03:00
457d6a8ad0 Use Azure mirrors of Ubuntu .deb repositories in containers.
This reduces the likelihood of spurious CI failures caused by DDoS filters
being triggered by massive numbers of concurrent CI jobs.
2025-06-13 02:23:02 +03:00
e3d8de377b Removed windows-2019 jobs from GitHub Actions.
The windows-2019 image is deprecated and is about to be removed.

https://github.com/actions/runner-images/issues/12045
2025-06-13 02:21:12 +03:00
8d25b9ce54 Add missing include 2025-06-06 21:47:38 +03:00
6e05e5e764 Update ci.yml 2025-06-06 21:00:18 +03:00
7cb3e689e0 Update bit_ceil_test.cpp 2025-06-06 19:03:11 +03:00
11d367377f Merge pull request #199 from Pega5us/fix-issue#197-bitceil
🐛 Fix bit_ceil() to return 1 for input 0 as per specification
2025-06-06 18:17:15 +03:00
f32cb2f696 🐛 Fix bit_ceil() to return 1 for input 0 as per specification 2025-06-06 14:23:26 +05:30
21761b3f62 Merge pull request #192 from mborland/msvc_clz
Use bit scan intrinsic on Windows ARM64 platform
2025-04-16 15:13:43 +03:00
2e87ab53f7 Merge pull request #193 from striezel-stash/ci-ubuntu-20.04-deprecation
Move Ubuntu 20.04 builds to container or newer Ubuntu version
2025-04-16 15:12:26 +03:00
8d5ee24c97 Merge pull request #194 from striezel-stash/fix-typos
Fix a few typos
2025-04-16 04:19:08 +03:00
db59ef2a81 Fix a few typos 2025-04-16 02:16:49 +02:00
c48b7f269f Move Ubuntu 20.04 builds to container or newer Ubuntu version
The Ubuntu 20.04 image on GitHub Actions will be unavailable by
2025-04-15. See <https://github.com/actions/runner-images/issues/11101>
for more information on the deprecation and removal.

Therefore all build jobs that use the Ubuntu 20.04 runner image
of GHA have to be either migrated to a newer runner image (if
the compiler version is available on a newer image) or have to be
moved to Docker containers using Ubuntu 20.04 (if the compiler
version is not available on the newer runner images).
2025-04-16 02:07:28 +02:00
4c74671f73 Use bit scan intrinsic on ARM64 platform 2025-04-10 08:35:11 -04:00
1e1ccb491e Fix GCC 4.8 Drone job to actually use 4.8 2025-02-23 18:37:43 +02:00
787b03ea9c Use BOOST_ASSERT but disable assertions on older GCC 2025-01-18 17:14:03 -05:00
b9a2221b3b Rename detail assert macro since it isn't a public facility 2025-01-18 14:14:24 -05:00
cb603c9c6b Undef assert macro and remove guards 2025-01-18 00:53:35 -05:00
24a8174ef1 Add asserts to span 2025-01-18 00:52:31 -05:00
7178a52909 Merge pull request #187 from eagleoflqj/ohos
OpenHarmony doesn't support pthread_setcancelstate.
2025-01-08 16:45:11 +02:00
9a3febf848 OpenHarmony doesn't support pthread_setcancelstate. 2025-01-07 21:13:58 -05:00
3e147e4ced Merge pull request #183 from Flamefire/warning
Avoid `-Wzero-as-null-pointer-constant` warning in string_view ctor
2025-01-05 17:25:14 +02:00
1222948a8e Avoid -Wzero-as-null-pointer-constant warning in string_view ctor 2025-01-05 11:57:02 +01:00
749b6340b5 Update ci.yml 2024-11-27 20:58:46 +02:00
92f6cfb3cc Remove hash_value overload for basic_string_view; it's no longer needed 2024-11-11 03:18:02 +02:00
ed452c57a3 Add sv_hash_test to test/CMakeLists.txt 2024-11-11 02:31:11 +02:00
78885aab8e Disable serialization tests under MinGW 32 bit 2024-11-10 22:35:54 +02:00
8ebe2e7f57 Update ci.yml 2024-11-10 19:57:55 +02:00
32e6c30f4b Add test/sv_hash_test.cpp 2024-11-10 19:32:31 +02:00
cebfe007e8 Update test/Jamfile 2024-11-10 16:21:59 +02:00
3e16f3df14 Update .drone.jsonnet 2024-11-10 15:43:57 +02:00
e3a2e88e4c Update .drone.jsonnet 2024-08-21 10:50:28 +03:00
5e451b6c84 Add VERBATIM to add_custom_target 2024-08-21 04:14:05 +03:00
88a957b21c test/Jamfile: add cxx11_ref_qualifiers (GCC 4.8+) to Serialization tests because of Optional 2024-08-21 03:02:31 +03:00
1bac0ccfd1 Update build.jam 2024-08-21 02:32:32 +03:00
602961e526 Update build deps. 2024-08-01 21:30:37 -05:00
366802b43c Adjust doc build to avoid boost-root references. 2024-07-28 10:42:22 -05:00
9dd0a8e1e4 Sync from upstream. 2024-07-27 11:09:51 -05:00
622476533c Added a release notes entry for the empty_value fix. 2024-07-27 10:35:28 +03:00
a09ee19e3e Sync from upstream. 2024-07-25 17:19:14 -05:00
040b018ce0 Restore warnings-as-errors-off that got accidentally removed in a merge. 2024-07-24 23:55:54 -05:00
42d0c5954a Move inter-lib dependencies to a project variable and into the build targets. 2024-07-23 22:34:24 -05:00
76d0f22d3b Added 1.86.0 release notes. 2024-07-24 03:02:00 +03:00
243eec26fe Update copyright dates. 2024-07-20 22:52:05 -05:00
44c32d7691 Change all <source> references to <library>. 2024-07-20 19:37:53 -05:00
0ee7dc5910 Sync from upstream. 2024-07-18 09:29:32 -05:00
9e9e6e3898 Rename base type again 2024-07-16 23:53:47 -04:00
242b14bb69 Rename base typedef 2024-07-14 07:14:38 -04:00
76061d91d4 Move compile test to separate source file 2024-07-14 07:04:23 -04:00
bda05a7812 Update .drone.jsonnet 2024-07-13 15:41:26 +03:00
d66b8c1c13 Update ci.yml 2024-07-13 13:32:29 +03:00
bd29e0dd15 Merge pull request #177 from ashtum/rename-base-typedef
Rename typedef `base` to `core_ev_base`
2024-07-13 13:21:00 +03:00
72761e34e0 Rename typedef base to core_ev_base
Using typedef `base` poses a high risk of name conflict, given that
`empty_value` is inherited in user types.
2024-07-13 09:14:58 +00:00
983234baee Sync from upstream. 2024-07-12 08:54:55 -05:00
83a3a51bee Merge pull request #175 from k3DW/feature/empty-value-inherit-public
Fix `empty_value` MSVC bug
2024-07-12 08:53:53 -04:00
acbeaae181 Add link to Visual Studio bug report 2024-07-11 17:02:24 -05:00
d01b4e94cc Write test for empty_value private inheritance 2024-07-11 17:02:23 -05:00
e22bd49fa7 Fix MSVC issue with deriving from empty_value 2024-07-11 17:02:21 -05:00
c056f3dfc9 Write failing test in MSVC for deriving from empty_value 2024-06-23 22:50:52 -05:00
8b8944dd6e Bump B2 require to 5.2 2024-06-14 11:33:55 -05:00
278d3f0060 Sync from upstream. 2024-05-30 11:21:22 -05:00
3f36d507f2 Disable the tn_holder<wchar_t> specialization when BOOST_NO_INTRINSIC_WCHAR_T. Refs #173. 2024-05-28 19:32:36 +03:00
a77338b1cd Use macos-14 image instead of macos-11 as the latter is being removed. 2024-05-21 01:06:02 +03:00
a8c757ddf2 Add requires-b2 check to top-level build file. 2024-05-05 09:00:01 -05:00
98a055cf34 Add missing lib reference. 2024-04-25 22:20:12 -05:00
074a467d9d Sync from upstream. 2024-04-24 20:30:49 -05:00
965508d9e1 Fix type_name for abstract classes. Fixes #172. 2024-04-24 21:46:32 +03:00
0a238bb30d Sync from upstream. 2024-04-20 15:33:40 -05:00
d03e58b77e Correct parameter type in documentation 2024-04-18 13:16:12 -04:00
f774295cdb Add boost/core/detail/minstd_rand.hpp 2024-04-14 04:40:44 +03:00
b18495fe35 Sync from upstream. 2024-04-12 22:40:43 -05:00
c928c844da Merge branch 'feature/sign-conversion' into develop 2024-04-11 13:43:49 +03:00
0a42ddabef Update pointer_in_range documentation 2024-04-11 02:25:05 -04:00
04cc766db3 Address C++17 redeclaration of constexpr static 2024-04-11 00:52:26 -04:00
aa01ad8bf0 Avoid another -Wconversion in sv_find_{first,last}_not_of_test 2024-04-11 05:57:32 +03:00
442e36f652 Avoid -Wconversion in sv_find_{first,last}_not_of_test 2024-04-11 04:33:29 +03:00
03040c7f5c Avoid -Wsign-conversion warnings in string_view.hpp. Fixes #170. 2024-04-11 04:09:29 +03:00
8b31acf9a4 Disable -Wsign-conversion in lightweight_test.hpp for GCC 6/7 2024-04-10 22:25:11 +03:00
fd01cf788c Add -Wsign-conversion to pedantic-errors 2024-04-10 21:51:56 +03:00
151d0c4143 Sync from upstream. 2024-04-10 07:57:45 -05:00
31117ef800 Implement pointer_in_range 2024-04-08 09:56:16 -04:00
25b0defdeb Switch to library requirements instead of source. As source puts extra source in install targets. 2024-03-29 21:15:58 -05:00
541745ea24 Sync from upstream. 2024-03-23 07:57:20 -05:00
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
a973490f53 Fix deprecated warning ignores in allocator_access.hpp, and add compile test for pmr allocator 2024-03-17 20:12:06 -05:00
5f825106c7 Make the library modular usable. 2024-03-11 08:32:21 -05:00
8cc2fdad76 Updated comments. 2024-02-08 18:39:47 +03:00
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
76401063a6 Remove constexpr test from sv_construct_test 2024-02-07 06:34:06 +02:00
c4bb59617c Disable sv_construct_test_cx2 for libstdc++ 7.2 and earlier 2024-02-07 04:55:07 +02:00
2d7e036416 Add sv_construct_test_cx, _cx2 2024-02-07 03:28:41 +02:00
4a0df827c1 Merge pull request #164 from anarthal/develop
Constructor from std::string_view is now constexpr
2024-02-07 03:03:42 +02:00
59c0fb69f0 Constructor from std::string_view is now constexpr
close #163
2024-02-06 23:15:26 +01:00
2f092c62fe Disable std::pmr use under AppleClang. Refs #162. 2024-02-06 19:12:11 +02:00
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
45e7e1a91a Reduced CMake-related job timeouts. 2024-02-06 06:07:30 +03:00
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
b077925d77 Reduced CI job timeouts. 2024-02-06 01:55:42 +03:00
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
0a35bb6a20 Move functor to its own namespace to block bringing boost::core to ADL. 2024-02-02 05:23:00 +03:00
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
7b1d3718c1 Merge pull request #161 from boostorg/feature/functor
Add `functor`
2024-01-27 19:34:21 +03:00
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
6f70ee87a3 Disable Serialization tests for C++03 2024-01-23 18:25:32 +02:00
db20a49e48 Increase GHA timeouts 2024-01-07 01:41:30 +02:00
a57c78221b Add timeouts to all jobs 2024-01-04 14:21:44 +02:00
e4adc769aa Disable use of std::launder under msvc-14.1. Fixes #160. 2024-01-04 04:07:34 +02:00
8af04d101c Update .drone.jsonnet 2024-01-04 02:45:24 +02:00
cece8ca5b4 Update .drone.jsonnet 2023-11-30 11:39:42 +02:00
6c95750f37 Use BOOST_GCC instead of BOOST_GCC_VERSION 2023-11-30 10:33:08 +02:00
a9f1407d84 Added a sanity check to prevent duplicate definition of BOOST_CORE_HAS_BUILTIN_BIT_CAST. 2023-11-25 16:04:12 +03:00
db0fd77af1 Added support for __builtin_bswap16. 2023-11-25 16:04:12 +03:00
62 changed files with 2102 additions and 273 deletions

View File

@ -32,6 +32,8 @@ local linux_pipeline(name, image, environment, packages = "", sources = [], arch
commands:
[
'set -e',
'uname -a',
'echo $DRONE_STAGE_MACHINE',
'wget -O - https://apt.llvm.org/llvm-snapshot.gpg.key | apt-key add -',
] +
(if sources != [] then [ ('apt-add-repository "' + source + '"') for source in sources ] else []) +
@ -97,41 +99,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",
{ TOOLSET: 'gcc', COMPILER: 'g++', CXXSTD: '03,11', ADDRMD: '32,64' },
"Linux 16.04 GCC 4.8 32/64",
"cppalliance/droneubuntu1604:1",
{ TOOLSET: 'gcc', COMPILER: 'g++-4.8', 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 +195,44 @@ 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 24.04 GCC 13* 32/64",
"cppalliance/droneubuntu2404:1",
{ TOOLSET: 'gcc', COMPILER: 'g++', CXXSTD: '03,11,14,17,20,2b', ADDRMD: '32,64' },
),
linux_pipeline(
"Linux 24.04 GCC 14 32 ASAN",
"cppalliance/droneubuntu2404:1",
{ TOOLSET: 'gcc', COMPILER: 'g++-14', CXXSTD: '03,11,14,17,20,2b', ADDRMD: '32' } + asan,
"g++-14-multilib",
),
linux_pipeline(
"Linux 24.04 GCC 14 64 ASAN",
"cppalliance/droneubuntu2404:1",
{ TOOLSET: 'gcc', COMPILER: 'g++-14', CXXSTD: '03,11,14,17,20,2b', ADDRMD: '64' } + asan,
"g++-14-multilib",
),
linux_pipeline(
"Linux 24.04 GCC 14 32 UBSAN",
"cppalliance/droneubuntu2404:1",
{ TOOLSET: 'gcc', COMPILER: 'g++-14', CXXSTD: '03,11,14,17,20,2b', ADDRMD: '32' } + ubsan,
"g++-14-multilib",
),
linux_pipeline(
"Linux 24.04 GCC 14 64 UBSAN",
"cppalliance/droneubuntu2404:1",
{ TOOLSET: 'gcc', COMPILER: 'g++-14', CXXSTD: '03,11,14,17,20,2b', ADDRMD: '64' } + ubsan,
"g++-14-multilib",
),
linux_pipeline(
@ -313,16 +341,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 +352,41 @@ 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 24.04 Clang 16",
"cppalliance/droneubuntu2404: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 24.04 Clang 17",
"cppalliance/droneubuntu2404:1",
{ TOOLSET: 'clang', COMPILER: 'clang++-17', CXXSTD: '03,11,14,17,20,2b' },
"clang-17",
),
linux_pipeline(
"Linux 24.04 Clang 18 UBSAN",
"cppalliance/droneubuntu2404:1",
{ TOOLSET: 'clang', COMPILER: 'clang++-18', CXXSTD: '03,11,14,17,20,2b' } + ubsan,
"clang-18",
),
linux_pipeline(
"Linux 24.04 Clang 18 ASAN",
"cppalliance/droneubuntu2404:1",
{ TOOLSET: 'clang', COMPILER: 'clang++-18', CXXSTD: '03,11,14,17,20,2b' } + asan,
"clang-18",
),
linux_pipeline(
"Linux 24.10 Clang 19",
"cppalliance/droneubuntu2410:1",
{ TOOLSET: 'clang', COMPILER: 'clang++-19', CXXSTD: '03,11,14,17,20,2b' },
"clang-19",
),
macos_pipeline(
@ -367,7 +414,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-2025 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)
@ -100,13 +100,13 @@ jobs:
- toolset: gcc-9
cxxstd: "03,11,14,17,2a"
address-model: 32,64
os: ubuntu-20.04
os: ubuntu-24.04
install:
- g++-9-multilib
- toolset: gcc-10
cxxstd: "03,11,14,17,20"
address-model: 32,64
os: ubuntu-20.04
os: ubuntu-24.04
install:
- g++-10-multilib
- toolset: gcc-11
@ -125,9 +125,23 @@ jobs:
cxxstd: "03,11,14,17,20,23"
address-model: 32,64
os: ubuntu-latest
container: ubuntu:23.04
container: ubuntu:24.04
install:
- g++-13-multilib
- toolset: gcc-14
cxxstd: "03,11,14,17,20,23"
address-model: 32,64
os: ubuntu-latest
container: ubuntu:24.04
install:
- g++-14-multilib
- toolset: gcc-15
cxxstd: "03,11,14,17,20,23,2c"
address-model: 32,64
os: ubuntu-latest
container: ubuntu:25.04
install:
- g++-15-multilib
- name: UBSAN
toolset: gcc-12
cxxstd: "03,11,14,17,20,23"
@ -213,13 +227,15 @@ jobs:
- toolset: clang
compiler: clang++-9
cxxstd: "03,11,14,17,2a"
os: ubuntu-20.04
os: ubuntu-latest
container: ubuntu:20.04
install:
- clang-9
- toolset: clang
compiler: clang++-10
cxxstd: "03,11,14,17,20"
os: ubuntu-20.04
os: ubuntu-latest
container: ubuntu:20.04
install:
- clang-10
- toolset: clang
@ -276,7 +292,7 @@ jobs:
compiler: clang++-16
cxxstd: "03,11,14,17,20,2b"
os: ubuntu-latest
container: ubuntu:23.04
container: ubuntu:24.04
install:
- clang-16
- libc++-16-dev
@ -286,15 +302,45 @@ jobs:
- toolset: clang
compiler: clang++-17
cxxstd: "03,11,14,17,20,2b"
os: ubuntu-22.04
os: ubuntu-latest
container: ubuntu:24.04
install:
- clang-17
- libc++-17-dev
- libc++abi-17-dev
sources:
- "deb http://apt.llvm.org/jammy/ llvm-toolchain-jammy-17 main"
source_keys:
- "https://apt.llvm.org/llvm-snapshot.gpg.key"
cxxflags: -stdlib=libc++
linkflags: -stdlib=libc++
- toolset: clang
compiler: clang++-18
cxxstd: "03,11,14,17,20,2b"
os: ubuntu-latest
container: ubuntu:24.04
install:
- clang-18
- libc++-18-dev
- libc++abi-18-dev
cxxflags: -stdlib=libc++
linkflags: -stdlib=libc++
- toolset: clang
compiler: clang++-19
cxxstd: "03,11,14,17,20,2b"
os: ubuntu-latest
container: ubuntu:24.04
install:
- clang-19
- libc++-19-dev
- libc++abi-19-dev
cxxflags: -stdlib=libc++
linkflags: -stdlib=libc++
- toolset: clang
compiler: clang++-20
cxxstd: "03,11,14,17,20,2b,2c"
os: ubuntu-latest
container: ubuntu:25.04
install:
- clang-20
- libc++-20-dev
- libc++abi-20-dev
cxxflags: -stdlib=libc++
linkflags: -stdlib=libc++
- name: UBSAN
@ -310,17 +356,25 @@ jobs:
- libc++-15-dev
- libc++abi-15-dev
- toolset: clang
cxxstd: "03,11,14,17,2a"
os: macos-11
- toolset: clang
cxxstd: "03,11,14,17,20,2b"
os: macos-12
- name: ARM
toolset: gcc-13
cxxstd: "03-gnu,11-gnu,14-gnu,17-gnu,20-gnu,23-gnu"
os: ubuntu-24.04-arm
container: ubuntu:24.04
install:
- g++-13
- toolset: clang
cxxstd: "03,11,14,17,20,2b"
os: macos-13
- toolset: clang
cxxstd: "03,11,14,17,20,2b"
os: macos-14
- toolset: clang
cxxstd: "03,11,14,17,20,2b"
os: macos-15
timeout-minutes: 120
timeout-minutes: 45
runs-on: ${{matrix.os}}
container: ${{matrix.container}}
@ -337,6 +391,22 @@ jobs:
echo "GHA_CONTAINER=${{matrix.container}}" >> $GITHUB_ENV
if [ -f "/etc/debian_version" ]
then
# Use Azure APT mirrors in containers to avoid HTTP errors due to DDoS filters triggered by lots of CI jobs launching concurrently.
# Note that not all Ubuntu versions support "mirror+file:..." URIs in APT sources, so just use Azure mirrors exclusively.
# Note also that on recent Ubuntu versions DEB822 format is used for source files.
APT_SOURCES=()
if [ -d "/etc/apt/sources.list.d" ]
then
readarray -t APT_SOURCES < <(find "/etc/apt/sources.list.d" -type f -name '*.sources' -print)
fi
if [ -f "/etc/apt/sources.list" ]
then
APT_SOURCES+=("/etc/apt/sources.list")
fi
if [ "${#APT_SOURCES[@]}" -gt 0 ]
then
sed -i -E -e 's!([^ ]+) (http|https)://(archive|security)\.ubuntu\.com/ubuntu[^ ]*(.*)!\1 http://azure.archive.ubuntu.com/ubuntu/\4!' "${APT_SOURCES[@]}"
fi
apt-get -o Acquire::Retries=$NET_RETRY_COUNT update
if [ "$(apt-cache search "^python-is-python3$" | wc -l)" -ne 0 ]
then
@ -349,8 +419,6 @@ jobs:
fi
git config --global pack.threads 0
- uses: actions/checkout@v3
- name: Install packages
if: matrix.install
run: |
@ -465,11 +533,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[@]}"
@ -488,7 +570,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
@ -525,14 +607,6 @@ jobs:
fail-fast: false
matrix:
include:
- toolset: msvc-14.0
cxxstd: "14"
addrmd: 32,64
os: windows-2019
- toolset: msvc-14.2
cxxstd: "14,17,20,latest"
addrmd: 32,64
os: windows-2019
- toolset: msvc-14.3
cxxstd: "14,17,20,latest"
addrmd: 32,64
@ -544,13 +618,19 @@ jobs:
- toolset: gcc
cxxstd: "03,11,14,17,2a"
addrmd: 64
os: windows-2019
os: windows-2022
# Windows SDK 32-bit ARM libs not installed in this image
- name: ARM
toolset: msvc-14.3
cxxstd: "14,17,20,latest"
addrmd: 64
os: windows-11-arm
runs-on: ${{matrix.os}}
timeout-minutes: 45
steps:
- uses: actions/checkout@v3
- name: Setup Boost
shell: cmd
run: |
@ -564,10 +644,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
@ -576,7 +670,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:
@ -584,20 +678,21 @@ jobs:
fail-fast: false
matrix:
include:
- os: ubuntu-20.04
- os: ubuntu-22.04
- os: macos-11
- os: macos-12
- os: ubuntu-24.04
- os: macos-13
- os: macos-14
- os: macos-15
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: |
@ -612,16 +707,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
@ -632,20 +745,21 @@ jobs:
fail-fast: false
matrix:
include:
- os: ubuntu-20.04
- os: ubuntu-22.04
- os: macos-11
- os: macos-12
- os: ubuntu-24.04
- os: macos-13
- os: macos-14
- os: macos-15
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: |
@ -660,27 +774,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
@ -690,20 +822,25 @@ jobs:
fail-fast: false
matrix:
include:
- os: ubuntu-20.04
- os: ubuntu-22.04
- os: macos-11
- os: macos-12
- os: ubuntu-24.04
- os: macos-13
- os: macos-14
- os: macos-15
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: |
@ -718,27 +855,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:
@ -746,14 +903,13 @@ jobs:
fail-fast: false
matrix:
include:
- os: windows-2019
- os: windows-2022
- os: windows-2025
runs-on: ${{matrix.os}}
timeout-minutes: 10
steps:
- uses: actions/checkout@v3
- name: Setup Boost
shell: cmd
run: |
@ -767,17 +923,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
@ -786,7 +956,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
@ -795,14 +965,13 @@ jobs:
fail-fast: false
matrix:
include:
- os: windows-2019
- os: windows-2022
- os: windows-2025
runs-on: ${{matrix.os}}
timeout-minutes: 10
steps:
- uses: actions/checkout@v3
- name: Setup Boost
shell: cmd
run: |
@ -816,36 +985,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
@ -853,7 +1036,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
@ -862,14 +1045,13 @@ jobs:
fail-fast: false
matrix:
include:
- os: windows-2019
- os: windows-2022
- os: windows-2025
runs-on: ${{matrix.os}}
timeout-minutes: 20
steps:
- uses: actions/checkout@v3
- name: Setup Boost
shell: cmd
run: |
@ -883,40 +1065,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

23
build.jam Normal file
View File

@ -0,0 +1,23 @@
# Copyright 2023-2024 René Ferdinand Rivera Morell
# Copyright 2024 Peter Dimov
# Distributed under the Boost Software License, Version 1.0.
# https://www.boost.org/LICENSE_1_0.txt
require-b2 5.2 ;
constant boost_dependencies :
/boost/assert//boost_assert
/boost/config//boost_config
/boost/static_assert//boost_static_assert
/boost/throw_exception//boost_throw_exception
;
project /boost/core ;
explicit
[ alias boost_core : : : : <include>include <library>$(boost_dependencies) ]
[ alias all : boost_core test ]
;
call-if : boost-library core
;

View File

@ -9,7 +9,7 @@ import project ;
import doxygen ;
import quickbook ;
path-constant INCLUDES : ../../.. ;
path-constant INCLUDES : ../include ;
doxygen ref_reference
:

View File

@ -1,12 +1,40 @@
[/
Copyright 2021 Peter Dimov
Copyright 2022-2023 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.86.0]
* Added a [link core.pointer_in_range `boost/core/pointer_in_range.hpp`] header with a `pointer_in_range`
function template to check if a pointer is within a given range.
* Fixed `type_name` for abstract classes. ([github_issue 172])
* Fixed `boost/core/type_name.hpp` compilation error with MSVC with disabled native `wchar_t` type.
([github_issue 173])
* Added a workaround for an MSVC [@https://developercommunity.visualstudio.com/t/Compiler-bug:-Incorrect-C2247-and-C2248/10690025 bug]
causing `empty_value` compilation errors when it is used with a nested class. ([github_pr 175])
[endsect]
[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 core.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

View File

@ -20,6 +20,9 @@ or copy at http://boost.org/LICENSE_1_0.txt)
]
]
[template github_issue[key]'''<ulink url="https://github.com/boostorg/core/issues/'''[key]'''">#'''[key]'''</ulink>''']
[template github_pr[key]'''<ulink url="https://github.com/boostorg/core/pull/'''[key]'''">PR#'''[key]'''</ulink>''']
[template simplesect[title]
[block '''<simplesect><title>'''[title]'''</title>''']]
@ -55,6 +58,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 +73,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]

81
doc/pointer_in_range.qbk Normal file
View File

@ -0,0 +1,81 @@
[/
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_, 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, const T* end);`]
[[variablelist
[[Requires][`[begin,end)` is a valid range.]]
[[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

@ -38,7 +38,7 @@ and return type use spans.
```
auto sha1(boost::span<const unsigned char> input,
boost::span<unsigned char, SHA_DIGEST_LENGTH> ouput)
boost::span<unsigned char, SHA_DIGEST_LENGTH> output)
{
SHA_CTX context;
SHA1_Init(&context);

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

@ -28,7 +28,7 @@
# pragma intrinsic(_BitScanForward)
# pragma intrinsic(_BitScanReverse)
# if defined(_M_X64)
# if defined(_M_X64) || defined(_M_ARM64)
# pragma intrinsic(_BitScanForward64)
# pragma intrinsic(_BitScanReverse64)
# endif
@ -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
@ -223,7 +230,7 @@ inline int countl_impl( boost::uint16_t x ) BOOST_NOEXCEPT
#endif
#if defined(_MSC_VER) && defined(_M_X64) && defined(BOOST_CORE_HAS_BUILTIN_ISCONSTEVAL)
#if defined(_MSC_VER) && (defined(_M_X64) || defined(_M_ARM64)) && defined(BOOST_CORE_HAS_BUILTIN_ISCONSTEVAL)
BOOST_CXX14_CONSTEXPR inline int countl_impl( boost::uint64_t x ) BOOST_NOEXCEPT
{
@ -248,7 +255,7 @@ BOOST_CXX14_CONSTEXPR inline int countl_impl( boost::uint64_t x ) BOOST_NOEXCEPT
}
}
#elif defined(_MSC_VER) && defined(_M_X64)
#elif defined(_MSC_VER) && (defined(_M_X64) || defined(_M_ARM64))
inline int countl_impl( boost::uint64_t x ) BOOST_NOEXCEPT
{
@ -448,7 +455,7 @@ inline int countr_impl( boost::uint16_t x ) BOOST_NOEXCEPT
#endif
#if defined(_MSC_VER) && defined(_M_X64) && defined(BOOST_CORE_HAS_BUILTIN_ISCONSTEVAL)
#if defined(_MSC_VER) && (defined(_M_X64) || defined(_M_ARM64)) && defined(BOOST_CORE_HAS_BUILTIN_ISCONSTEVAL)
BOOST_CXX14_CONSTEXPR inline int countr_impl( boost::uint64_t x ) BOOST_NOEXCEPT
{
@ -473,7 +480,7 @@ BOOST_CXX14_CONSTEXPR inline int countr_impl( boost::uint64_t x ) BOOST_NOEXCEPT
}
}
#elif defined(_MSC_VER) && defined(_M_X64)
#elif defined(_MSC_VER) && (defined(_M_X64) || defined(_M_ARM64))
inline int countr_impl( boost::uint64_t x ) BOOST_NOEXCEPT
{
@ -696,7 +703,7 @@ BOOST_CXX14_CONSTEXPR inline boost::uint32_t bit_ceil_impl( boost::uint32_t x )
{
if( x == 0 )
{
return 0;
return 1;
}
--x;
@ -716,7 +723,7 @@ BOOST_CXX14_CONSTEXPR inline boost::uint64_t bit_ceil_impl( boost::uint64_t x )
{
if( x == 0 )
{
return 0;
return 1;
}
--x;
@ -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

@ -10,6 +10,7 @@ Distributed under the Boost Software License, Version 1.0.
#include <boost/config.hpp>
#include <new>
#include <cstddef>
namespace boost {

View File

@ -30,7 +30,7 @@
#if defined( BOOST_CORE_HAS_CXXABI_H )
# include <cxxabi.h>
// For some archtectures (mips, mips64, x86, x86_64) cxxabi.h in Android NDK is implemented by gabi++ library
// For some architectures (mips, mips64, x86, x86_64) cxxabi.h in Android NDK is implemented by gabi++ library
// (https://android.googlesource.com/platform/ndk/+/master/sources/cxx-stl/gabi++/), which does not implement
// abi::__cxa_demangle(). We detect this implementation by checking the include guard here.
# if defined( __GABIXX_CXXABI_H__ )

View File

@ -0,0 +1,18 @@
/*
Copyright 2025 Glen Joseph Fernandes
(glenjofe@gmail.com)
Distributed under the Boost Software License, Version 1.0.
(http://www.boost.org/LICENSE_1_0.txt)
*/
#undef BOOST_CORE_DETAIL_ASSERT
#if !defined(__clang__) && \
!defined(__INTEL_COMPILER) && \
defined(__GNUC__) && \
(__GNUC__ < 5)
#define BOOST_CORE_DETAIL_ASSERT(expr) void(0)
#else
#include <boost/assert.hpp>
#define BOOST_CORE_DETAIL_ASSERT(expr) BOOST_ASSERT(expr)
#endif

View File

@ -0,0 +1,58 @@
#ifndef BOOST_CORE_DETAIL_MINSTD_RAND_HPP_INCLUDED
#define BOOST_CORE_DETAIL_MINSTD_RAND_HPP_INCLUDED
// Copyright 2017 Peter Dimov
//
// Distributed under the Boost Software License, Version 1.0.
//
// See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt
//
// An implementation of minstd_rand that does not require
// the Random library
#include <boost/cstdint.hpp>
namespace boost
{
namespace detail
{
class minstd_rand
{
private:
boost::uint_least32_t x_;
enum { a = 48271, m = 2147483647 };
public:
minstd_rand(): x_( 1 )
{
}
explicit minstd_rand( boost::uint_least32_t x ): x_( x % m )
{
if( x_ == 0 )
{
x_ = 1;
}
}
boost::uint_least32_t operator()()
{
boost::uint_least64_t y = x_;
y = ( a * y ) % m;
x_ = static_cast<boost::uint_least32_t>( y );
return x_;
}
};
} // namespace detail
} // namespace boost
#endif // #ifndef BOOST_CORE_DETAIL_MINSTD_RAND_HPP_INCLUDED

View File

@ -67,7 +67,7 @@ namespace core
inline void sp_thread_sleep() BOOST_NOEXCEPT
{
#if defined(BOOST_HAS_PTHREADS) && !defined(__ANDROID__)
#if defined(BOOST_HAS_PTHREADS) && !defined(__ANDROID__) && !defined(__OHOS__)
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) && !defined(__ANDROID__)
#if defined(BOOST_HAS_PTHREADS) && !defined(__ANDROID__) && !defined(__OHOS__)
pthread_setcancelstate( oldst, &oldst );

View File

@ -34,6 +34,9 @@
#if !defined(BOOST_NO_CXX20_HDR_CONCEPTS) // std::common_reference_with
# include <type_traits>
#endif
#if !defined(BOOST_NO_CXX20_HDR_FORMAT)
# include <format> // std::formatter
#endif
namespace boost
{
@ -41,9 +44,6 @@ namespace boost
// forward declaration of boost::basic_string_view from Utility
template<class Ch, class Tr> class basic_string_view;
// forward declaration of boost::hash_range from ContainerHash
template<class It> std::size_t hash_range( It, It );
namespace core
{
namespace detail
@ -74,7 +74,7 @@ template<class Ch> BOOST_CXX14_CONSTEXPR std::size_t find_first_of( Ch const* p_
for( std::size_t j = 0; j < n; ++j )
{
UCh ch = s[ j ];
UCh ch = static_cast<UCh>( s[ j ] );
if( ch >= 0 && ch < 256 )
{
@ -91,7 +91,7 @@ template<class Ch> BOOST_CXX14_CONSTEXPR std::size_t find_first_of( Ch const* p_
{
for( std::size_t i = pos; i < n_; ++i )
{
UCh ch = p_[ i ];
UCh ch = static_cast<UCh>( p_[ i ] );
if( ch >= 0 && ch < 256 && table[ ch ] ) return i;
}
}
@ -129,7 +129,7 @@ template<class Ch> BOOST_CXX14_CONSTEXPR std::size_t find_last_of( Ch const* p_,
for( std::size_t j = 0; j < n; ++j )
{
UCh ch = s[ j ];
UCh ch = static_cast<UCh>( s[ j ] );
if( ch >= 0 && ch < 256 )
{
@ -150,7 +150,7 @@ template<class Ch> BOOST_CXX14_CONSTEXPR std::size_t find_last_of( Ch const* p_,
{
do
{
UCh ch = p_[ i ];
UCh ch = static_cast<UCh>( p_[ i ] );
if( ch >= 0 && ch < 256 && table[ ch ] ) return i;
@ -199,7 +199,7 @@ template<class Ch> BOOST_CXX14_CONSTEXPR std::size_t find_first_not_of( Ch const
for( std::size_t j = 0; j < n; ++j )
{
UCh ch = s[ j ];
UCh ch = static_cast<UCh>( s[ j ] );
if( ch >= 0 && ch < 256 )
{
@ -216,7 +216,7 @@ template<class Ch> BOOST_CXX14_CONSTEXPR std::size_t find_first_not_of( Ch const
{
for( std::size_t i = pos; i < n_; ++i )
{
UCh ch = p_[ i ];
UCh ch = static_cast<UCh>( p_[ i ] );
if( !( ch >= 0 && ch < 256 && table[ ch ] ) ) return i;
}
}
@ -262,7 +262,7 @@ template<class Ch> BOOST_CXX14_CONSTEXPR std::size_t find_last_not_of( Ch const*
for( std::size_t j = 0; j < n; ++j )
{
UCh ch = s[ j ];
UCh ch = static_cast<UCh>( s[ j ] );
if( ch >= 0 && ch < 256 )
{
@ -283,7 +283,7 @@ template<class Ch> BOOST_CXX14_CONSTEXPR std::size_t find_last_not_of( Ch const*
{
do
{
UCh ch = p_[ i ];
UCh ch = static_cast<UCh>( p_[ i ] );
if( !( ch >= 0 && ch < 256 && table[ ch ] ) ) return i;
@ -381,7 +381,7 @@ public:
}
template<class End> BOOST_CXX14_CONSTEXPR basic_string_view( Ch const* first, End last,
typename boost::enable_if<boost::core::detail::is_same<End, Ch const*> >::type* = 0 ) BOOST_NOEXCEPT: p_( first ), n_( last - first )
typename boost::enable_if<boost::core::detail::is_same<End, Ch const*>, int >::type = 0 ) BOOST_NOEXCEPT: p_( first ), n_( static_cast<size_type>( last - first ) )
{
BOOST_ASSERT( last - first >= 0 );
}
@ -392,14 +392,14 @@ 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() )
{
}
#endif
template<class Ch2> basic_string_view( boost::basic_string_view<Ch2, std::char_traits<Ch2> > const& str,
typename boost::enable_if<boost::core::detail::is_same<Ch, Ch2> >::type* = 0 ) BOOST_NOEXCEPT: p_( str.data() ), n_( str.size() )
typename boost::enable_if<boost::core::detail::is_same<Ch, Ch2>, int >::type = 0 ) BOOST_NOEXCEPT: p_( str.data() ), n_( str.size() )
{
}
@ -681,7 +681,7 @@ public:
Ch const* r = traits_type::find( data() + pos, size() - pos, c );
return r? r - data(): npos;
return r? static_cast<size_type>( r - data() ): npos;
}
BOOST_CXX14_CONSTEXPR size_type find( Ch const* s, size_type pos, size_type n ) const BOOST_NOEXCEPT
@ -696,11 +696,11 @@ public:
for( ;; )
{
p = traits_type::find( p, last - p, s[0] );
p = traits_type::find( p, static_cast<size_type>( last - p ), s[0] );
if( p == 0 ) break;
if( traits_type::compare( p + 1, s + 1, n - 1 ) == 0 ) return p - data();
if( traits_type::compare( p + 1, s + 1, n - 1 ) == 0 ) return static_cast<size_type>( p - data() );
++p;
}
@ -1181,11 +1181,6 @@ public:
}
#endif
inline friend std::size_t hash_value( basic_string_view const& sv )
{
return boost::hash_range( sv.begin(), sv.end() );
}
};
// stream inserter
@ -1193,7 +1188,7 @@ public:
template<class Ch> std::basic_ostream<Ch>& operator<<( std::basic_ostream<Ch>& os, basic_string_view<Ch> str )
{
Ch const* p = str.data();
std::streamsize n = str.size();
std::streamsize n = static_cast<std::streamsize>( str.size() );
std::streamsize m = os.width();
@ -1269,4 +1264,15 @@ struct std::basic_common_reference<
#endif
// std::format support
#if !defined(BOOST_NO_CXX20_HDR_FORMAT)
template<class Ch, class Ch2>
struct std::formatter<boost::core::basic_string_view<Ch>, Ch2>: std::formatter<std::basic_string_view<Ch>, Ch2>
{
};
#endif
#endif // #ifndef BOOST_CORE_STRING_VIEW_HPP_INCLUDED

View File

@ -95,9 +95,57 @@ private:
};
#if !defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION)
#if defined(BOOST_MSVC)
/*
This is a workaround to an MSVC bug when T is a nested class:
https://developercommunity.visualstudio.com/t/Compiler-bug:-Incorrect-C2247-and-C2248/10690025
*/
namespace detail {
template<class T>
class empty_value_base
: public T {
public:
#if !defined(BOOST_NO_CXX11_DEFAULTED_FUNCTIONS)
empty_value_base() = default;
#else
BOOST_CONSTEXPR empty_value_base() { }
#endif
#if !defined(BOOST_NO_CXX11_RVALUE_REFERENCES)
#if !defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES)
template<class U, class... Args>
BOOST_CONSTEXPR empty_value_base(U&& value, Args&&... args)
: T(std::forward<U>(value), std::forward<Args>(args)...) { }
#else
template<class U>
BOOST_CONSTEXPR empty_value_base(U&& value)
: T(std::forward<U>(value)) { }
#endif
#else
template<class U>
BOOST_CONSTEXPR empty_value_base(const U& value)
: T(value) { }
template<class U>
BOOST_CONSTEXPR empty_value_base(U& value)
: T(value) { }
#endif
};
} /* detail */
#endif
template<class T, unsigned N>
class empty_value<T, N, true>
#if defined(BOOST_MSVC)
: detail::empty_value_base<T> {
typedef detail::empty_value_base<T> empty_base_;
#else
: T {
typedef T empty_base_;
#endif
public:
typedef T type;
@ -108,26 +156,26 @@ public:
#endif
BOOST_CONSTEXPR empty_value(boost::empty_init_t)
: T() { }
: empty_base_() { }
#if !defined(BOOST_NO_CXX11_RVALUE_REFERENCES)
#if !defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES)
template<class U, class... Args>
BOOST_CONSTEXPR empty_value(boost::empty_init_t, U&& value, Args&&... args)
: T(std::forward<U>(value), std::forward<Args>(args)...) { }
: empty_base_(std::forward<U>(value), std::forward<Args>(args)...) { }
#else
template<class U>
BOOST_CONSTEXPR empty_value(boost::empty_init_t, U&& value)
: T(std::forward<U>(value)) { }
: empty_base_(std::forward<U>(value)) { }
#endif
#else
template<class U>
BOOST_CONSTEXPR empty_value(boost::empty_init_t, const U& value)
: T(value) { }
: empty_base_(value) { }
template<class U>
BOOST_CONSTEXPR empty_value(boost::empty_init_t, U& value)
: T(value) { }
: empty_base_(value) { }
#endif
BOOST_CONSTEXPR const T& get() const BOOST_NOEXCEPT {

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

@ -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

@ -153,6 +153,7 @@ inline void no_throw_failed_impl(const char* expr, const char* what, const char*
#elif defined(__GNUC__) && !(defined(__INTEL_COMPILER) || defined(__ICL) || defined(__ICC) || defined(__ECC)) && (__GNUC__ * 100 + __GNUC_MINOR__) >= 406
# pragma GCC diagnostic push
# pragma GCC diagnostic ignored "-Wsign-compare"
# pragma GCC diagnostic ignored "-Wsign-conversion"
#endif
// specialize test output for char pointers to avoid printing as cstring

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

@ -37,7 +37,7 @@ namespace boost
/**
* Casts a scoped enum to its underlying type.
*
* This function is useful when working with scoped enum classes, which doens't implicitly convert to the underlying type.
* This function is useful when working with scoped enum classes, which doesn't implicitly convert to the underlying type.
* @param v A scoped enum.
* @returns The underlying type.
* @throws No-throws.

View File

@ -8,6 +8,7 @@ Distributed under the Boost Software License, Version 1.0.
#ifndef BOOST_CORE_SPAN_HPP
#define BOOST_CORE_SPAN_HPP
#include <boost/core/detail/assert.hpp>
#include <boost/core/data.hpp>
#include <array>
#include <iterator>
@ -274,17 +275,21 @@ public:
}
constexpr span<T, dynamic_extent> first(size_type c) const {
return span<T, dynamic_extent>(s_.p, c);
return BOOST_CORE_DETAIL_ASSERT(c <= size()),
span<T, dynamic_extent>(s_.p, c);
}
constexpr span<T, dynamic_extent> last(size_type c) const {
return span<T, dynamic_extent>(s_.p + (s_.n - c), c);
return BOOST_CORE_DETAIL_ASSERT(c <= size()),
span<T, dynamic_extent>(s_.p + (s_.n - c), c);
}
constexpr span<T, dynamic_extent> subspan(size_type o,
size_type c = dynamic_extent) const {
return span<T, dynamic_extent>(s_.p + o,
c == dynamic_extent ? s_.n - o : c);
return BOOST_CORE_DETAIL_ASSERT(o <= size() &&
(c == dynamic_extent || c + o <= size())),
span<T, dynamic_extent>(s_.p + o,
c == dynamic_extent ? s_.n - o : c);
}
constexpr size_type size() const noexcept {
@ -300,15 +305,15 @@ public:
}
constexpr reference operator[](size_type i) const {
return s_.p[i];
return BOOST_CORE_DETAIL_ASSERT(i < size()), s_.p[i];
}
constexpr reference front() const {
return *s_.p;
return BOOST_CORE_DETAIL_ASSERT(!empty()), *s_.p;
}
constexpr reference back() const {
return s_.p[s_.n - 1];
return BOOST_CORE_DETAIL_ASSERT(!empty()), s_.p[s_.n - 1];
}
constexpr pointer data() const noexcept {
@ -351,8 +356,10 @@ private:
detail::span_store<T, E> s_;
};
#if defined(BOOST_NO_CXX17_INLINE_VARIABLES)
template<class T, std::size_t E>
constexpr std::size_t span<T, E>::extent;
#endif
#ifdef __cpp_deduction_guides
template<class I, class L>

View File

@ -103,7 +103,8 @@ inline std::string fix_typeid_name( char const* n )
}
// class types can be incomplete
template<class T> std::string typeid_name_impl( int T::* )
// but also abstract (T[1] doesn't form)
template<class T> std::string typeid_name_impl( int T::*, T(*)[1] )
{
std::string r = fix_typeid_name( typeid(T[1]).name() );
return r.substr( 0, r.size() - 4 ); // remove ' [1]' suffix
@ -116,7 +117,7 @@ template<class T> std::string typeid_name_impl( ... )
template<class T> std::string typeid_name()
{
return typeid_name_impl<T>( 0 );
return typeid_name_impl<T>( 0, 0 );
}
// template names
@ -345,6 +346,8 @@ template<> struct tn_holder<boost::uint128_type>
#endif
#if !defined(BOOST_NO_INTRINSIC_WCHAR_T)
template<> struct tn_holder<wchar_t>
{
static std::string type_name( std::string const& suffix )
@ -353,6 +356,8 @@ template<> struct tn_holder<wchar_t>
}
};
#endif
#if !defined(BOOST_NO_CXX11_CHAR16_T)
template<> struct tn_holder<char16_t>

View File

@ -8,17 +8,6 @@ if(HAVE_BOOST_TEST)
boost_test_jamfile(FILE Jamfile.v2 LINK_LIBRARIES Boost::core Boost::static_assert Boost::type_traits)
set(BOOST_TEST_LINK_LIBRARIES Boost::core Boost::type_traits)
boost_test(TYPE run SOURCES eif_constructors.cpp)
boost_test(TYPE run SOURCES eif_dummy_arg_disambiguation.cpp)
boost_test(TYPE run SOURCES eif_lazy.cpp)
boost_test(TYPE run SOURCES eif_lazy_test.cpp)
boost_test(TYPE run SOURCES eif_member_templates.cpp)
boost_test(TYPE run SOURCES eif_namespace_disambiguation.cpp)
boost_test(TYPE run SOURCES eif_no_disambiguation.cpp)
boost_test(TYPE run SOURCES eif_partial_specializations.cpp)
set(BOOST_TEST_LINK_LIBRARIES Boost::core Boost::throw_exception)
boost_test(TYPE run SOURCES no_exceptions_support_test.cpp)
@ -27,6 +16,10 @@ set(BOOST_TEST_LINK_LIBRARIES Boost::core Boost::utility)
boost_test(TYPE run SOURCES sv_conversion_test2.cpp)
set(BOOST_TEST_LINK_LIBRARIES Boost::core Boost::container_hash)
boost_test(TYPE run SOURCES sv_hash_test.cpp)
set(BOOST_TEST_LINK_LIBRARIES Boost::core Boost::config Boost::move Boost::smart_ptr)
boost_test(TYPE run SOURCES fclose_deleter_test.cpp)

View File

@ -6,11 +6,15 @@
# See accompanying file LICENSE_1_0.txt or copy at
# http://www.boost.org/LICENSE_1_0.txt
require-b2 5.0.1 ;
import-search /boost/config/checks ;
import config : requires ;
import modules ;
import testing ;
project : requirements
<library>/boost/core//boost_core
<library>/boost/type_traits//boost_type_traits
<warnings>extra
<toolset>msvc:<warnings-as-errors>on
<toolset>clang:<warnings-as-errors>on
@ -22,6 +26,17 @@ local warnings-as-errors-off =
"-<toolset>gcc:<warnings-as-errors>on"
"-<toolset>clang:<warnings-as-errors>on" ;
local pedantic-errors = <warnings>pedantic
<toolset>gcc:<cxxflags>"-Wconversion"
<toolset>gcc:<cxxflags>"-Wsign-conversion"
<toolset>clang:<cxxflags>"-Wconversion"
<toolset>clang:<cxxflags>"-Wsign-conversion"
<toolset>msvc:<warnings-as-errors>on
<toolset>gcc:<warnings-as-errors>on
<toolset>clang:<warnings-as-errors>on ;
local CPP11 = [ requires cxx11_variadic_templates cxx11_template_aliases cxx11_decltype cxx11_constexpr cxx11_noexcept cxx11_ref_qualifiers ] ;
# quick test (for CI)
run quick.cpp ;
@ -34,11 +49,16 @@ compile addressof_constexpr_test.cpp ;
compile-fail addressof_fail_rvalue.cpp
: $(warnings-as-errors-off) ;
run checked_delete_test.cpp ;
run checked_delete_test.cpp
: : : $(pedantic-errors) ;
compile-fail checked_delete_fail.cpp
: $(warnings-as-errors-off) ;
compile-fail checked_delete_fail2.cpp
: $(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 ;
@ -65,14 +85,14 @@ compile-fail ref_implicit_fail4.cpp
run ref_cv_test.cpp ;
run ref_conversion_test.cpp ;
run eif_constructors.cpp : ;
run eif_dummy_arg_disambiguation.cpp : ;
run eif_lazy.cpp : ;
run eif_lazy_test.cpp : ;
run eif_member_templates.cpp : ;
run eif_namespace_disambiguation.cpp : ;
run eif_no_disambiguation.cpp : ;
run eif_partial_specializations.cpp : ;
run eif_constructors.cpp ;
run eif_dummy_arg_disambiguation.cpp ;
run eif_lazy.cpp ;
run eif_lazy_test.cpp ;
run eif_member_templates.cpp ;
run eif_namespace_disambiguation.cpp ;
run eif_no_disambiguation.cpp ;
run eif_partial_specializations.cpp ;
compile-fail noncopyable_compile_fail.cpp
: $(warnings-as-errors-off) ;
@ -97,13 +117,6 @@ run visit_each_test.cpp ;
run get_pointer_test.cpp ;
local pedantic-errors = <warnings>pedantic
<toolset>gcc:<cxxflags>"-Wconversion"
<toolset>clang:<cxxflags>"-Wconversion"
<toolset>msvc:<warnings-as-errors>on
<toolset>gcc:<warnings-as-errors>on
<toolset>clang:<warnings-as-errors>on ;
run lightweight_test_test.cpp
: : : $(pedantic-errors) ;
run lightweight_test_test.cpp : : :
@ -187,7 +200,22 @@ compile-fail scoped_enum_compile_fail_conv_to_int.cpp
run underlying_type.cpp ;
run fclose_deleter_test.cpp : : : <target-os>windows:<define>_CRT_SECURE_NO_WARNINGS <target-os>windows:<define>_CRT_SECURE_NO_DEPRECATE ;
compile-fail null_deleter_compile_fail_adl.cpp
: $(warnings-as-errors-off) ;
run fclose_deleter_test.cpp : : :
$(CPP11)
<library>/boost/move//boost_move
<library>/boost/smart_ptr//boost_smart_ptr
<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 ;
@ -209,6 +237,8 @@ run empty_value_test.cpp ;
run empty_value_size_test.cpp ;
run empty_value_final_test.cpp ;
run empty_value_constexpr_test.cpp ;
compile empty_value_nested_test.cpp ;
compile-fail empty_value_compile_fail_casting.cpp ;
run quick_exit_test.cpp ;
run-fail quick_exit_fail.cpp ;
@ -251,6 +281,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 ;
@ -319,42 +350,69 @@ run type_name_test.cpp ;
run snprintf_test.cpp ;
run sv_types_test.cpp ;
run sv_construct_test.cpp ;
run sv_iteration_test.cpp ;
run sv_element_access_test.cpp ;
run sv_modifiers_test.cpp ;
run sv_copy_test.cpp ;
run sv_substr_test.cpp ;
run sv_compare_test.cpp ;
run sv_starts_with_test.cpp ;
run sv_ends_with_test.cpp ;
run sv_find_test.cpp ;
run sv_rfind_test.cpp ;
run sv_types_test.cpp
: : : $(pedantic-errors) ;
run sv_construct_test.cpp
: : : $(pedantic-errors) ;
run sv_iteration_test.cpp
: : : $(pedantic-errors) ;
run sv_element_access_test.cpp
: : : $(pedantic-errors) ;
run sv_modifiers_test.cpp
: : : $(pedantic-errors) ;
run sv_copy_test.cpp
: : : $(pedantic-errors) ;
run sv_substr_test.cpp
: : : $(pedantic-errors) ;
run sv_compare_test.cpp
: : : $(pedantic-errors) ;
run sv_starts_with_test.cpp
: : : $(pedantic-errors) ;
run sv_ends_with_test.cpp
: : : $(pedantic-errors) ;
run sv_find_test.cpp
: : : $(pedantic-errors) ;
run sv_rfind_test.cpp
: : : $(pedantic-errors) ;
run sv_find_first_of_test.cpp
: : : <toolset>gcc-4.4:<cxxflags>-Wno-type-limits ;
: : : $(pedantic-errors) <toolset>gcc-4.4:<cxxflags>-Wno-type-limits ;
run sv_find_last_of_test.cpp
: : : <toolset>gcc-4.4:<cxxflags>-Wno-type-limits ;
: : : $(pedantic-errors) <toolset>gcc-4.4:<cxxflags>-Wno-type-limits ;
run sv_find_first_not_of_test.cpp
: : : <toolset>gcc-4.4:<cxxflags>-Wno-type-limits ;
: : : $(pedantic-errors) <toolset>gcc-4.4:<cxxflags>-Wno-type-limits ;
run sv_find_last_not_of_test.cpp
: : : <toolset>gcc-4.4:<cxxflags>-Wno-type-limits ;
run sv_contains_test.cpp ;
run sv_eq_test.cpp ;
run sv_lt_test.cpp ;
run sv_stream_insert_test.cpp ;
run sv_conversion_test.cpp ;
run sv_conversion_test2.cpp : ;
run sv_common_reference_test.cpp ;
: : : $(pedantic-errors) <toolset>gcc-4.4:<cxxflags>-Wno-type-limits ;
run sv_contains_test.cpp
: : : $(pedantic-errors) ;
run sv_eq_test.cpp
: : : $(pedantic-errors) ;
run sv_lt_test.cpp
: : : $(pedantic-errors) ;
run sv_stream_insert_test.cpp
: : : $(pedantic-errors) ;
run sv_conversion_test.cpp
: : : $(pedantic-errors) ;
run sv_conversion_test2.cpp : : : <library>/boost/utility//boost_utility ;
run sv_common_reference_test.cpp
: : : $(pedantic-errors) ;
compile sv_common_reference_test2.cpp ;
compile sv_windows_h_test.cpp ;
compile-fail sv_nullptr_fail.cpp
: $(warnings-as-errors-off) ;
compile sv_construct_test_cx.cpp ;
compile sv_construct_test_cx2.cpp ;
run sv_hash_test.cpp : : : $(CPP11) <library>/boost/container_hash//boost_container_hash ;
run sv_format_test.cpp
: : : $(pedantic-errors) ;
run span_test.cpp ;
run span_types_test.cpp ;
run span_constructible_test.cpp ;
run span_deduction_guide_test.cpp ;
run span_constexpr_test.cpp ;
run as_bytes_test.cpp ;
run as_writable_bytes_test.cpp ;
compile span_boost_begin_test.cpp ;
@ -378,7 +436,15 @@ run memory_resource_test.cpp ;
run data_test.cpp ;
run size_test.cpp ;
local with-serialization = <library>/boost//serialization/<warnings>off $(warnings-as-errors-off) <undefined-sanitizer>norecover:<link>static ;
local with-serialization =
<library>/boost/serialization//boost_serialization/<warnings>off
$(warnings-as-errors-off)
<undefined-sanitizer>norecover:<link>static
$(CPP11)
# Serialization no longer builds under classic MinGW
# and <toolset>gcc,<target-os>windows,<address-model>32 fails for some reason
<toolset>gcc,<target-os>windows:<build>no
;
run serialization_nvp_test.cpp : : : $(with-serialization) <undefined-sanitizer>norecover:<build>no ;
run serialization_split_free_test.cpp : : : $(with-serialization) ;
@ -394,5 +460,11 @@ 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 ;
run minstd_rand_test.cpp
: : : $(pedantic-errors) ;
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

@ -19,14 +19,15 @@ template<class T> void test_bit_ceil( T x )
T y = boost::core::bit_ceil( x );
BOOST_TEST( boost::core::has_single_bit( y ) );
BOOST_TEST_GE( +y, +x );
if( x == 0 )
{
BOOST_TEST_EQ( y, 0 );
BOOST_TEST_EQ( y, 1 );
}
else
{
BOOST_TEST( boost::core::has_single_bit( y ) );
BOOST_TEST_GE( +y, +x );
BOOST_TEST_LT( y >> 1, +x );
}
}

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

@ -14,4 +14,4 @@ target_link_libraries(quick Boost::core)
enable_testing()
add_test(quick quick)
add_custom_target(check COMMAND ${CMAKE_CTEST_COMMAND} --output-on-failure -C $<CONFIG>)
add_custom_target(check VERBATIM COMMAND ${CMAKE_CTEST_COMMAND} --output-on-failure -C $<CONFIG>)

View File

@ -18,4 +18,4 @@ target_link_libraries(quick Boost::core)
enable_testing()
add_test(quick quick)
add_custom_target(check COMMAND ${CMAKE_CTEST_COMMAND} --output-on-failure -C $<CONFIG>)
add_custom_target(check VERBATIM COMMAND ${CMAKE_CTEST_COMMAND} --output-on-failure -C $<CONFIG>)

View File

@ -31,7 +31,7 @@ using std::distance;
*/
// struct C {} doesn't wotk with libc++.
// struct C {} doesn't work with libc++.
typedef std::forward_iterator_tag C;
struct T

View File

@ -0,0 +1,20 @@
// Copyright 2024 Braden Ganetsky
// Distributed under the Boost Software License, Version 1.0.
// https://www.boost.org/LICENSE_1_0.txt
#include <boost/core/empty_value.hpp>
struct empty {};
// This test ensures private inheritance of `boost::empty_value<T>` for empty `T`.
// With public inheritance, `boost::empty_value<empty>*` could cast to `empty*`.
void test_empty_not_convertible_to_base()
{
const boost::empty_value<empty> x(boost::empty_init);
const empty* x2 = static_cast<const empty*>(&x);
(void)x2;
}
int main()
{
}

View File

@ -0,0 +1,45 @@
/*
Copyright 2024 Braden Ganetsky
(glenjofe@gmail.com)
Distributed under the Boost Software License, Version 1.0.
(http://www.boost.org/LICENSE_1_0.txt)
*/
#include <boost/core/empty_value.hpp>
/*
Tests workaround for MSVC bug:
https://developercommunity.visualstudio.com/t/Compiler-bug:-Incorrect-C2247-and-C2248/10690025
*/
template<class T>
struct derived
: boost::empty_value<T> {
typedef typename boost::empty_value<T>::type type;
derived(boost::empty_init_t e)
: boost::empty_value<T>(e) { }
};
struct outer {
struct inner_empty { };
struct inner_non_empty {
inner_non_empty()
: value() { }
int value;
};
};
void test()
{
const boost::empty_value<outer> x1(boost::empty_init);
(void)x1;
const boost::empty_value<outer::inner_empty> x2(boost::empty_init);
(void)x2;
const boost::empty_value<outer::inner_non_empty> x3(boost::empty_init);
(void)x3;
const derived<outer> x4(boost::empty_init);
(void)x4;
const derived<outer::inner_empty> x5(boost::empty_init);
(void)x5;
const derived<outer::inner_non_empty> x6(boost::empty_init);
(void)x6;
}

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)

38
test/minstd_rand_test.cpp Normal file
View File

@ -0,0 +1,38 @@
// Test for boost/core/detail/minstd_rand.hpp
//
// Copyright 2022, 2024 Peter Dimov
// Distributed under the Boost Software License, Version 1.0.
// https://www.boost.org/LICENSE_1_0.txt
#include <boost/core/detail/minstd_rand.hpp>
#include <boost/core/lightweight_test.hpp>
#include <boost/cstdint.hpp>
int main()
{
{
boost::detail::minstd_rand rng;
boost::uint_least32_t r1 = rng(), x1 = 48271;
BOOST_TEST_EQ( r1, x1 );
for( int i = 0; i < 1000; ++i ) rng();
boost::uint_least32_t r2 = rng(), x2 = 2076422031;
BOOST_TEST_EQ( r2, x2 );
}
{
boost::detail::minstd_rand rng( 12345 );
boost::uint_least32_t r1 = rng(), x1 = 595905495;
BOOST_TEST_EQ( r1, x1 );
for( int i = 0; i < 1000; ++i ) rng();
boost::uint_least32_t r2 = rng(), x2 = 1065162103;
BOOST_TEST_EQ( r2, x2 );
}
return boost::report_errors();
}

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

@ -0,0 +1,72 @@
/*
Copyright 2025 Glen Joseph Fernandes
(glenjofe@gmail.com)
Distributed under the Boost Software License, Version 1.0.
(http://www.boost.org/LICENSE_1_0.txt)
*/
#include <boost/config.hpp>
#if !defined(BOOST_NO_CXX11_CONSTEXPR)
#include <boost/core/span.hpp>
#include <boost/core/lightweight_test.hpp>
constexpr const int array[4]{ 5, 10, 15, 20 };
void test_first()
{
constexpr boost::span<const int> s =
boost::span<const int>(array, 4).first(2);
BOOST_TEST_EQ(s.data(), &array[0]);
BOOST_TEST_EQ(s.size(), 2);
}
void test_last()
{
constexpr boost::span<const int> s =
boost::span<const int>(array, 4).last(2);
BOOST_TEST_EQ(s.data(), &array[2]);
BOOST_TEST_EQ(s.size(), 2);
}
void test_subspan()
{
constexpr boost::span<const int> s =
boost::span<const int>(array, 4).subspan(1, 2);
BOOST_TEST_EQ(s.data(), &array[1]);
BOOST_TEST_EQ(s.size(), 2);
}
void test_index()
{
constexpr const int i = boost::span<const int>(array, 4)[1];
BOOST_TEST_EQ(i, 10);
}
void test_front()
{
constexpr const int i = boost::span<const int>(array, 4).front();
BOOST_TEST_EQ(i, 5);
}
void test_back()
{
constexpr const int i = boost::span<const int>(array, 4).back();
BOOST_TEST_EQ(i, 20);
}
int main()
{
test_first();
test_last();
test_subspan();
test_index();
test_front();
test_back();
return boost::report_errors();
}
#else
int main()
{
return 0;
}
#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 <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

@ -494,7 +494,7 @@ int main()
for( int i = 0; i < 256; ++i )
{
str[ i ] = static_cast< unsigned char >( i );
str[ i ] = static_cast<char>( static_cast< unsigned char >( i ) );
}
boost::core::string_view sv( str, 256 );
@ -503,22 +503,22 @@ int main()
std::string str2( sv.data(), sv.size() );
for( int i = 0; i < 256; ++i )
for( std::size_t i = 0; i < 256; ++i )
{
std::string str3( str2 );
str3[ i ] = ~str3[ i ];
str3[ i ] = static_cast<char>( ~str3[ i ] );
BOOST_TEST_EQ( sv.find_first_not_of( str3 ), i );
}
std::reverse( str, str + 256 );
for( int i = 0; i < 256; ++i )
for( std::size_t i = 0; i < 256; ++i )
{
std::string str3( str2 );
str3[ i ] = ~str3[ i ];
str3[ i ] = static_cast<char>( ~str3[ i ] );
BOOST_TEST_EQ( sv.find_first_not_of( str3 ), 255 - i );
}
@ -538,22 +538,22 @@ int main()
std::wstring str2( sv.data(), sv.size() );
for( int i = 0; i < 256; ++i )
for( std::size_t i = 0; i < 256; ++i )
{
std::wstring str3( str2 );
str3[ i ] = ~str3[ i ];
str3[ i ] = static_cast<wchar_t>( ~str3[ i ] );
BOOST_TEST_EQ( sv.find_first_not_of( str3 ), i );
}
std::reverse( str, str + 256 );
for( int i = 0; i < 256; ++i )
for( std::size_t i = 0; i < 256; ++i )
{
std::wstring str3( str2 );
str3[ i ] = ~str3[ i ];
str3[ i ] = static_cast<wchar_t>( ~str3[ i ] );
BOOST_TEST_EQ( sv.find_first_not_of( str3 ), 255 - i );
}

View File

@ -426,14 +426,14 @@ int main()
for( int i = 0; i < 256; ++i )
{
str[ i ] = static_cast< unsigned char >( i );
str[ i ] = static_cast<char>( static_cast< unsigned char >( i ) );
}
boost::core::string_view sv( str, 256 );
for( int i = 0; i < 256; ++i )
{
std::string needle( 12, static_cast< unsigned char >( i ) );
std::string needle( 12, static_cast<char>( static_cast< unsigned char >( i ) ) );
BOOST_TEST_EQ( sv.find_first_of( needle ), i );
}
@ -441,7 +441,7 @@ int main()
for( int i = 0; i < 256; ++i )
{
std::string needle( 12, static_cast< unsigned char >( i ) );
std::string needle( 12, static_cast<char>( static_cast< unsigned char >( i ) ) );
BOOST_TEST_EQ( sv.find_first_of( needle ), 255 - i );
}
}

View File

@ -494,7 +494,7 @@ int main()
for( int i = 0; i < 256; ++i )
{
str[ i ] = static_cast< unsigned char >( i );
str[ i ] = static_cast<char>( static_cast< unsigned char >( i ) );
}
boost::core::string_view sv( str, 256 );
@ -503,22 +503,22 @@ int main()
std::string str2( sv.data(), sv.size() );
for( int i = 0; i < 256; ++i )
for( std::size_t i = 0; i < 256; ++i )
{
std::string str3( str2 );
str3[ i ] = ~str3[ i ];
str3[ i ] = static_cast<char>( ~str3[ i ] );
BOOST_TEST_EQ( sv.find_last_not_of( str3 ), i );
}
std::reverse( str, str + 256 );
for( int i = 0; i < 256; ++i )
for( std::size_t i = 0; i < 256; ++i )
{
std::string str3( str2 );
str3[ i ] = ~str3[ i ];
str3[ i ] = static_cast<char>( ~str3[ i ] );
BOOST_TEST_EQ( sv.find_last_not_of( str3 ), 255 - i );
}
@ -538,22 +538,22 @@ int main()
std::wstring str2( sv.data(), sv.size() );
for( int i = 0; i < 256; ++i )
for( std::size_t i = 0; i < 256; ++i )
{
std::wstring str3( str2 );
str3[ i ] = ~str3[ i ];
str3[ i ] = static_cast<wchar_t>( ~str3[ i ] );
BOOST_TEST_EQ( sv.find_first_not_of( str3 ), i );
}
std::reverse( str, str + 256 );
for( int i = 0; i < 256; ++i )
for( std::size_t i = 0; i < 256; ++i )
{
std::wstring str3( str2 );
str3[ i ] = ~str3[ i ];
str3[ i ] = static_cast<wchar_t>( ~str3[ i ] );
BOOST_TEST_EQ( sv.find_first_not_of( str3 ), 255 - i );
}

View File

@ -444,14 +444,14 @@ int main()
for( int i = 0; i < 256; ++i )
{
str[ i ] = static_cast< unsigned char >( i );
str[ i ] = static_cast<char>( static_cast< unsigned char >( i ) );
}
boost::core::string_view sv( str, 256 );
for( int i = 0; i < 256; ++i )
{
std::string needle( 12, static_cast< unsigned char >( i ) );
std::string needle( 12, static_cast<char>( static_cast< unsigned char >( i ) ) );
BOOST_TEST_EQ( sv.find_last_of( needle ), i );
}
@ -459,7 +459,7 @@ int main()
for( int i = 0; i < 256; ++i )
{
std::string needle( 12, static_cast< unsigned char >( i ) );
std::string needle( 12, static_cast<char>( static_cast< unsigned char >( i ) ) );
BOOST_TEST_EQ( sv.find_last_of( needle ), 255 - i );
}
}

30
test/sv_format_test.cpp Normal file
View File

@ -0,0 +1,30 @@
// Copyright 2025 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/core/lightweight_test.hpp>
#include <boost/config.hpp>
#include <boost/config/pragma_message.hpp>
#if !( defined(__cpp_lib_format) && __cpp_lib_format >= 201907L )
BOOST_PRAGMA_MESSAGE( "Test skipped because __cpp_lib_format is not defined to at least 201907L" )
int main() {}
#else
#include <format>
#include <string_view>
int main()
{
BOOST_TEST_EQ( std::format( "{}", boost::core::string_view( "123" ) ), std::format( "{}", std::string_view( "123" ) ) );
BOOST_TEST_EQ( std::format( "{:s}", boost::core::string_view( "123" ) ), std::format( "{:s}", std::string_view( "123" ) ) );
BOOST_TEST_EQ( std::format( "{:^7}", boost::core::string_view( "123" ) ), std::format( "{:^7}", std::string_view( "123" ) ) );
BOOST_TEST_EQ( std::format( "{:-^7}", boost::core::string_view( "123" ) ), std::format( "{:-^7}", std::string_view( "123" ) ) );
return boost::report_errors();
}
#endif

48
test/sv_hash_test.cpp Normal file
View File

@ -0,0 +1,48 @@
// 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/container_hash/hash.hpp>
#include <boost/core/lightweight_test.hpp>
#include <boost/config.hpp>
#include <string>
template<class T> std::size_t hv( T const& t )
{
return boost::hash<T>()( t );
}
template<class Ch> void test( Ch const* p )
{
std::basic_string<Ch> s( p );
boost::core::basic_string_view<Ch> sv( s );
BOOST_TEST_EQ( hv( s ), hv( sv ) );
}
int main()
{
test( "123" );
test( L"123" );
#if !defined(BOOST_NO_CXX11_CHAR16_T)
test( u"123" );
#endif
#if !defined(BOOST_NO_CXX11_CHAR32_T)
test( U"123" );
#endif
#if defined(__cpp_char8_t) && __cpp_char8_t >= 201811L
test( u8"123" );
#endif
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 <cstddef>
#if !defined(BOOST_NO_CXX17_HDR_STRING_VIEW)
# include <string_view>

View File

@ -9,7 +9,7 @@
// objects to be swapped would themselves be from the boost namespace.
// 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
// boost::core::invoke_swap two template arguments, thereby making it less specialized
// than std::swap.
#include <boost/core/invoke_swap.hpp>

View File

@ -12,7 +12,7 @@
//Put test class in the global namespace
#include "./swap_test_class.hpp"
//Provide swap function in gloabl namespace
//Provide swap function in global namespace
void swap(swap_test_class& left, swap_test_class& right)
{
left.swap(right);

View File

@ -55,6 +55,13 @@ template<class T1, class T2> struct X
template<class T1, class T2> struct Y;
class W
{
public:
virtual void f() = 0;
};
enum E1
{
e1
@ -122,6 +129,7 @@ int main()
TEST(A);
TEST(B);
TEST(C);
TEST(W);
TEST(E1);
@ -143,6 +151,9 @@ int main()
TEST(C&);
TEST(C const&);
TEST(W const);
TEST(W&);
#if !defined(BOOST_NO_CXX11_RVALUE_REFERENCES)
TEST(B&&);
@ -156,6 +167,8 @@ int main()
TEST(C*);
TEST(C const* volatile*);
TEST(W volatile*);
TEST(void*);
TEST(void const* volatile*);
@ -307,6 +320,8 @@ int main()
TEST(std::pair<C, C>);
TEST(std::pair<W, W>);
TEST(std::pair<void, void>);
TEST(std::pair<std::pair<void, void>, void>);
@ -336,9 +351,11 @@ int main()
TEST(X<A const&, B&> volatile&);
TEST(X<C, C>);
TEST(X<W, W>);
TEST(Y<A, B>);
TEST(Y<C, C>);
TEST(Y<W, W>);
TEST(X<std::pair<void, void>, void>);