Compare commits

...

25 Commits

Author SHA1 Message Date
Peter Dimov
9fb0dd1f5e Merge pull request #162 from Lastique/feature/remove_static_assert
Remove dependencies on Boost.StaticAssert
2026-02-07 14:41:31 +02:00
Peter Dimov
cd1ea88867 Fix typo in test/Jamfile.v2 2026-02-07 03:25:31 +02:00
Peter Dimov
ea9200416a Disable find_end.cpp, find_first_of.cpp under CMake, as they require /bigobj 2026-02-07 02:13:57 +02:00
Peter Dimov
23e09c1b06 Disable ticket_6742_... on macOS; libc++ wants iterators to be assignable and transform_iterator<phoenix::actor<...>> is not 2026-02-07 02:10:36 +02:00
Peter Dimov
a680ca3e85 Exclude clang-cl from msvc workaround 2026-02-06 22:51:39 +02:00
Peter Dimov
0d565eac10 Update LINK_LIBRARIES in test/CMakeLists.txt 2026-02-06 22:45:11 +02:00
Peter Dimov
9c94196fe4 Add test/cmake_subdir_test 2026-02-06 21:38:24 +02:00
Peter Dimov
55ded212a8 Add test/cmake_install_test 2026-02-06 21:38:09 +02:00
Peter Dimov
33782d7cc3 Add test/CMakeLists.txt 2026-02-06 21:33:20 +02:00
Peter Dimov
11c49b2803 Simplify test/Jamfile.v2 2026-02-06 21:33:00 +02:00
Peter Dimov
df2bc3704b Add .github/workflows/ci.yml 2026-02-06 21:02:06 +02:00
Andrey Semashev
72673a7dc4 Remove dependencies on Boost.StaticAssert.
Boost.StaticAssert has been merged into Boost.Config, so remove
the dependency.
2026-01-22 20:45:45 +03:00
Peter Dimov
cf7d2d2d3b Merge pull request #151 from grafikrobot/modular
Add support for modular build structure.
2025-05-02 19:18:50 +03:00
Rene Rivera
6cd17cbeae Sync from upstream. 2025-04-25 09:07:21 -05:00
neilgroves
1d124e8869 Merge pull request #157 from cho-m/any_iterator_interface-add_const
Add include for add_const
2025-04-25 01:42:52 +01:00
Rene Rivera
a377e87bfc Move project global include to target local include. 2025-04-07 21:24:57 -05:00
Rene Rivera
63544b1ec6 Sync from upstream. 2025-04-04 21:40:00 -05:00
Michael Cho
9ac89e9936 Add include for add_const
Signed-off-by: Michael Cho <michael@michaelcho.dev>
2025-03-30 23:07:34 -04:00
Rene Rivera
2b6fd29168 Move inter-lib dependencies to a project variable and into the build targets. 2024-07-23 22:34:23 -05:00
Rene Rivera
e3ac7974f3 Update copyright dates. 2024-07-20 22:52:04 -05:00
Rene Rivera
c31588ed06 Change all <source> references to <library>. 2024-07-20 19:42:16 -05:00
Rene Rivera
6a13721e44 Bump B2 require to 5.2 2024-06-14 11:33:56 -05:00
Rene Rivera
422c4d9b42 Add requires-b2 check to top-level build file. 2024-05-05 09:00:01 -05:00
Rene Rivera
a9c1add21c Switch to library requirements instead of source. As source puts extra source in install targets. 2024-03-29 21:15:59 -05:00
Rene Rivera
048e860e59 Make the library modular usable. 2024-03-11 08:38:17 -05:00
11 changed files with 1008 additions and 205 deletions

668
.github/workflows/ci.yml vendored Normal file
View File

@@ -0,0 +1,668 @@
name: CI
on:
pull_request:
push:
branches:
- master
- develop
- feature/**
env:
UBSAN_OPTIONS: print_stacktrace=1
jobs:
posix:
strategy:
fail-fast: false
matrix:
include:
- toolset: gcc-4.8
cxxstd: "11"
container: ubuntu:18.04
os: ubuntu-latest
install: g++-4.8-multilib
address-model: 32,64
- toolset: gcc-4.9
cxxstd: "11"
container: ubuntu:16.04
os: ubuntu-latest
install: g++-4.9-multilib
address-model: 32,64
- toolset: gcc-5
cxxstd: "11,14,1z"
container: ubuntu:18.04
os: ubuntu-latest
install: g++-5-multilib
address-model: 32,64
- toolset: gcc-6
cxxstd: "11,14,1z"
container: ubuntu:18.04
os: ubuntu-latest
install: g++-6-multilib
address-model: 32,64
- toolset: gcc-7
cxxstd: "11,14,17"
container: ubuntu:20.04
os: ubuntu-latest
install: g++-7-multilib
address-model: 32,64
- toolset: gcc-8
cxxstd: "11,14,17,2a"
container: ubuntu:20.04
os: ubuntu-latest
install: g++-8-multilib
address-model: 32,64
- toolset: gcc-9
cxxstd: "11,14,17,2a"
container: ubuntu:20.04
os: ubuntu-latest
install: g++-9-multilib
address-model: 32,64
- toolset: gcc-10
cxxstd: "11,14,17,2a"
container: ubuntu:22.04
os: ubuntu-latest
install: g++-10-multilib
address-model: 32,64
- toolset: gcc-11
cxxstd: "11,14,17,20"
container: ubuntu:22.04
os: ubuntu-latest
install: g++-11-multilib
address-model: 32,64
- toolset: gcc-12
cxxstd: "11,14,17,20,2b"
container: ubuntu:22.04
os: ubuntu-latest
install: g++-12-multilib
address-model: 32,64
- toolset: gcc-13
cxxstd: "11,14,17,20,2b"
container: ubuntu:24.04
os: ubuntu-latest
install: g++-13-multilib
address-model: 32,64
- toolset: gcc-14
cxxstd: "11,14,17,20,2b"
container: ubuntu:24.04
os: ubuntu-latest
install: g++-14-multilib
address-model: 32,64
- toolset: gcc-15
cxxstd: "11,14,17,20,23,2c"
container: ubuntu:25.10
os: ubuntu-latest
install: g++-15-multilib
address-model: 32,64
- toolset: clang
compiler: clang++-3.9
cxxstd: "11,14"
container: ubuntu:18.04
os: ubuntu-latest
install: clang-3.9
- toolset: clang
compiler: clang++-4.0
cxxstd: "11,14"
container: ubuntu:18.04
os: ubuntu-latest
install: clang-4.0
- toolset: clang
compiler: clang++-5.0
cxxstd: "11,14,1z"
container: ubuntu:18.04
os: ubuntu-latest
install: clang-5.0
- toolset: clang
compiler: clang++-6.0
cxxstd: "11,14,17"
container: ubuntu:20.04
os: ubuntu-latest
install: clang-6.0
- toolset: clang
compiler: clang++-7
cxxstd: "11,14,17"
container: ubuntu:20.04
os: ubuntu-latest
install: clang-7
- toolset: clang
compiler: clang++-8
cxxstd: "11,14,17"
container: ubuntu:20.04
os: ubuntu-latest
install: clang-8
- toolset: clang
compiler: clang++-9
cxxstd: "11,14,17,2a"
container: ubuntu:20.04
os: ubuntu-latest
install: clang-9
- toolset: clang
compiler: clang++-10
cxxstd: "11,14,17,2a"
container: ubuntu:20.04
os: ubuntu-latest
install: clang-10
- toolset: clang
compiler: clang++-11
cxxstd: "11,14,17,2a"
container: ubuntu:20.04
os: ubuntu-latest
install: clang-11
- toolset: clang
compiler: clang++-12
cxxstd: "11,14,17,20"
container: ubuntu:20.04
os: ubuntu-latest
install: clang-12
- toolset: clang
compiler: clang++-13
cxxstd: "11,14,17,20,2b"
container: ubuntu:22.04
os: ubuntu-latest
install: clang-13
- toolset: clang
compiler: clang++-14
cxxstd: "11,14,17,20,2b"
container: ubuntu:22.04
os: ubuntu-latest
install: clang-14
- toolset: clang
compiler: clang++-15
cxxstd: "11,14,17,20,2b"
container: ubuntu:22.04
os: ubuntu-latest
install: clang-15
- toolset: clang
compiler: clang++-16
cxxstd: "11,14,17,20,2b"
container: ubuntu:24.04
os: ubuntu-latest
install: clang-16
- toolset: clang
compiler: clang++-17
cxxstd: "11,14,17,20,2b"
container: ubuntu:24.04
os: ubuntu-latest
install: clang-17
- toolset: clang
compiler: clang++-18
cxxstd: "11,14,17,20,2b"
container: ubuntu:24.04
os: ubuntu-latest
install: clang-18
- toolset: clang
compiler: clang++-19
cxxstd: "11,14,17,20,2b"
container: ubuntu:24.04
os: ubuntu-latest
install: clang-19
- toolset: clang
compiler: clang++-20
cxxstd: "11,14,17,20,2b"
container: ubuntu:24.04
os: ubuntu-latest
install: clang-20
- toolset: clang
compiler: clang++-21
cxxstd: "11,14,17,20,23,2c"
container: ubuntu:25.10
os: ubuntu-latest
install: clang-21
- toolset: clang
cxxstd: "11,14,17,20,2b"
os: macos-14
- toolset: clang
cxxstd: "11,14,17,20,2b"
os: macos-15
- toolset: clang
cxxstd: "11,14,17,20,23,2c"
os: macos-26
runs-on: ${{matrix.os}}
container:
image: ${{matrix.container}}
volumes:
- /node20217:/node20217:rw,rshared
- ${{ startsWith(matrix.container, 'ubuntu:1') && '/node20217:/__e/node20:ro,rshared' || ' ' }}
defaults:
run:
shell: bash
steps:
- name: Setup container environment
if: matrix.container
run: |
apt-get update
apt-get -y install sudo python3 git g++ curl xz-utils
- name: Install nodejs20glibc2.17
if: ${{ startsWith( matrix.container, 'ubuntu:1' ) }}
run: |
curl -LO https://archives.boost.io/misc/node/node-v20.9.0-linux-x64-glibc-217.tar.xz
tar -xf node-v20.9.0-linux-x64-glibc-217.tar.xz --strip-components 1 -C /node20217
ldd /__e/node20/bin/node
- uses: actions/checkout@v4
- name: Install packages
if: matrix.install
run: |
sudo apt-get update
sudo apt-get -y install ${{matrix.install}}
- name: Setup Boost
run: |
echo GITHUB_REPOSITORY: $GITHUB_REPOSITORY
LIBRARY=${GITHUB_REPOSITORY#*/}
echo LIBRARY: $LIBRARY
echo "LIBRARY=$LIBRARY" >> $GITHUB_ENV
echo GITHUB_BASE_REF: $GITHUB_BASE_REF
echo GITHUB_REF: $GITHUB_REF
REF=${GITHUB_BASE_REF:-$GITHUB_REF}
REF=${REF#refs/heads/}
echo REF: $REF
BOOST_BRANCH=develop && [ "$REF" == "master" ] && BOOST_BRANCH=master || true
echo BOOST_BRANCH: $BOOST_BRANCH
cd ..
git clone -b $BOOST_BRANCH --depth 1 https://github.com/boostorg/boost.git boost-root
cd boost-root
cp -r $GITHUB_WORKSPACE/* libs/$LIBRARY
git submodule update --init tools/boostdep
python3 tools/boostdep/depinst/depinst.py -I examples $LIBRARY
./bootstrap.sh
./b2 -d0 headers
- name: Create user-config.jam
if: matrix.compiler
run: |
echo "using ${{matrix.toolset}} : : ${{matrix.compiler}} ;" > ~/user-config.jam
- name: Run tests
run: |
cd ../boost-root
export ADDRMD=${{matrix.address-model}}
./b2 -j3 libs/$LIBRARY/test toolset=${{matrix.toolset}} cxxstd=${{matrix.cxxstd}} ${ADDRMD:+address-model=$ADDRMD} variant=debug,release
windows:
strategy:
fail-fast: false
matrix:
include:
- toolset: msvc-14.3
cxxstd: "14,17,20,latest"
addrmd: 32,64
os: windows-2022
- toolset: clang-win
cxxstd: "14,17,20,latest"
addrmd: 32,64
os: windows-2025
- toolset: gcc
cxxstd: "11,14,17,2a"
addrmd: 64
os: windows-2022
runs-on: ${{matrix.os}}
steps:
- uses: actions/checkout@v4
- name: Setup Boost
shell: cmd
run: |
echo GITHUB_REPOSITORY: %GITHUB_REPOSITORY%
for /f %%i in ("%GITHUB_REPOSITORY%") do set LIBRARY=%%~nxi
echo LIBRARY: %LIBRARY%
echo LIBRARY=%LIBRARY%>>%GITHUB_ENV%
echo GITHUB_BASE_REF: %GITHUB_BASE_REF%
echo GITHUB_REF: %GITHUB_REF%
if "%GITHUB_BASE_REF%" == "" set GITHUB_BASE_REF=%GITHUB_REF%
set BOOST_BRANCH=develop
for /f %%i in ("%GITHUB_BASE_REF%") do if "%%~nxi" == "master" set BOOST_BRANCH=master
echo BOOST_BRANCH: %BOOST_BRANCH%
cd ..
git clone -b %BOOST_BRANCH% --depth 1 https://github.com/boostorg/boost.git boost-root
cd boost-root
xcopy /s /e /q %GITHUB_WORKSPACE% libs\%LIBRARY%\
git submodule update --init tools/boostdep
python tools/boostdep/depinst/depinst.py -I examples --git_args "--jobs 3" %LIBRARY%
cmd /c bootstrap
b2 -d0 headers
- name: Run tests
shell: cmd
run: |
cd ../boost-root
b2 -j3 libs/%LIBRARY%/test toolset=${{matrix.toolset}} cxxstd=${{matrix.cxxstd}} address-model=${{matrix.addrmd}} variant=debug,release embed-manifest-via=linker
posix-cmake-subdir:
strategy:
fail-fast: false
matrix:
include:
- os: ubuntu-latest
- os: macos-latest
runs-on: ${{matrix.os}}
steps:
- uses: actions/checkout@v4
- name: Install packages
if: matrix.install
run: sudo apt-get -y install ${{matrix.install}}
- name: Setup Boost
run: |
echo GITHUB_REPOSITORY: $GITHUB_REPOSITORY
LIBRARY=${GITHUB_REPOSITORY#*/}
echo LIBRARY: $LIBRARY
echo "LIBRARY=$LIBRARY" >> $GITHUB_ENV
echo GITHUB_BASE_REF: $GITHUB_BASE_REF
echo GITHUB_REF: $GITHUB_REF
REF=${GITHUB_BASE_REF:-$GITHUB_REF}
REF=${REF#refs/heads/}
echo REF: $REF
BOOST_BRANCH=develop && [ "$REF" == "master" ] && BOOST_BRANCH=master || true
echo BOOST_BRANCH: $BOOST_BRANCH
cd ..
git clone -b $BOOST_BRANCH --depth 1 https://github.com/boostorg/boost.git boost-root
cd boost-root
cp -r $GITHUB_WORKSPACE/* libs/$LIBRARY
git submodule update --init tools/boostdep
python tools/boostdep/depinst/depinst.py --git_args "--jobs 3" $LIBRARY
- name: Use library with add_subdirectory
run: |
cd ../boost-root/libs/$LIBRARY/test/cmake_subdir_test
mkdir __build__ && cd __build__
cmake ..
cmake --build .
ctest --output-on-failure --no-tests=error
posix-cmake-install:
strategy:
fail-fast: false
matrix:
include:
- os: ubuntu-latest
- os: macos-latest
runs-on: ${{matrix.os}}
steps:
- uses: actions/checkout@v4
- name: Install packages
if: matrix.install
run: sudo apt-get -y install ${{matrix.install}}
- name: Setup Boost
run: |
echo GITHUB_REPOSITORY: $GITHUB_REPOSITORY
LIBRARY=${GITHUB_REPOSITORY#*/}
echo LIBRARY: $LIBRARY
echo "LIBRARY=$LIBRARY" >> $GITHUB_ENV
echo GITHUB_BASE_REF: $GITHUB_BASE_REF
echo GITHUB_REF: $GITHUB_REF
REF=${GITHUB_BASE_REF:-$GITHUB_REF}
REF=${REF#refs/heads/}
echo REF: $REF
BOOST_BRANCH=develop && [ "$REF" == "master" ] && BOOST_BRANCH=master || true
echo BOOST_BRANCH: $BOOST_BRANCH
cd ..
git clone -b $BOOST_BRANCH --depth 1 https://github.com/boostorg/boost.git boost-root
cd boost-root
cp -r $GITHUB_WORKSPACE/* libs/$LIBRARY
git submodule update --init tools/boostdep
python tools/boostdep/depinst/depinst.py --git_args "--jobs 3" $LIBRARY
- name: Configure
run: |
cd ../boost-root
mkdir __build__ && cd __build__
cmake -DBOOST_INCLUDE_LIBRARIES=$LIBRARY -DCMAKE_INSTALL_PREFIX=~/.local ..
- name: Install
run: |
cd ../boost-root/__build__
cmake --build . --target install
- name: Use the installed library
run: |
cd ../boost-root/libs/$LIBRARY/test/cmake_install_test && mkdir __build__ && cd __build__
cmake -DCMAKE_INSTALL_PREFIX=~/.local ..
cmake --build .
ctest --output-on-failure --no-tests=error
posix-cmake-test:
strategy:
fail-fast: false
matrix:
include:
- os: ubuntu-latest
- os: macos-latest
runs-on: ${{matrix.os}}
steps:
- uses: actions/checkout@v4
- name: Install packages
if: matrix.install
run: sudo apt-get -y install ${{matrix.install}}
- name: Setup Boost
run: |
echo GITHUB_REPOSITORY: $GITHUB_REPOSITORY
LIBRARY=${GITHUB_REPOSITORY#*/}
echo LIBRARY: $LIBRARY
echo "LIBRARY=$LIBRARY" >> $GITHUB_ENV
echo GITHUB_BASE_REF: $GITHUB_BASE_REF
echo GITHUB_REF: $GITHUB_REF
REF=${GITHUB_BASE_REF:-$GITHUB_REF}
REF=${REF#refs/heads/}
echo REF: $REF
BOOST_BRANCH=develop && [ "$REF" == "master" ] && BOOST_BRANCH=master || true
echo BOOST_BRANCH: $BOOST_BRANCH
cd ..
git clone -b $BOOST_BRANCH --depth 1 https://github.com/boostorg/boost.git boost-root
cd boost-root
cp -r $GITHUB_WORKSPACE/* libs/$LIBRARY
git submodule update --init tools/boostdep
python tools/boostdep/depinst/depinst.py --git_args "--jobs 3" $LIBRARY
- name: Configure
run: |
cd ../boost-root
mkdir __build__ && cd __build__
cmake -DBOOST_INCLUDE_LIBRARIES=$LIBRARY -DBUILD_TESTING=ON ..
- name: Build tests
run: |
cd ../boost-root/__build__
cmake --build . --target tests
- name: Run tests
run: |
cd ../boost-root/__build__
ctest --output-on-failure --no-tests=error
windows-cmake-subdir:
strategy:
fail-fast: false
matrix:
include:
- os: windows-latest
runs-on: ${{matrix.os}}
steps:
- uses: actions/checkout@v4
- name: Setup Boost
shell: cmd
run: |
echo GITHUB_REPOSITORY: %GITHUB_REPOSITORY%
for /f %%i in ("%GITHUB_REPOSITORY%") do set LIBRARY=%%~nxi
echo LIBRARY: %LIBRARY%
echo LIBRARY=%LIBRARY%>>%GITHUB_ENV%
echo GITHUB_BASE_REF: %GITHUB_BASE_REF%
echo GITHUB_REF: %GITHUB_REF%
if "%GITHUB_BASE_REF%" == "" set GITHUB_BASE_REF=%GITHUB_REF%
set BOOST_BRANCH=develop
for /f %%i in ("%GITHUB_BASE_REF%") do if "%%~nxi" == "master" set BOOST_BRANCH=master
echo BOOST_BRANCH: %BOOST_BRANCH%
cd ..
git clone -b %BOOST_BRANCH% --depth 1 https://github.com/boostorg/boost.git boost-root
cd boost-root
xcopy /s /e /q %GITHUB_WORKSPACE% libs\%LIBRARY%\
git submodule update --init tools/boostdep
python tools/boostdep/depinst/depinst.py --git_args "--jobs 3" %LIBRARY%
- name: Use library with add_subdirectory (Debug)
shell: cmd
run: |
cd ../boost-root/libs/%LIBRARY%/test/cmake_subdir_test
mkdir __build__ && cd __build__
cmake ..
cmake --build . --config Debug
ctest --output-on-failure --no-tests=error -C Debug
- name: Use library with add_subdirectory (Release)
shell: cmd
run: |
cd ../boost-root/libs/%LIBRARY%/test/cmake_subdir_test/__build__
cmake --build . --config Release
ctest --output-on-failure --no-tests=error -C Release
windows-cmake-install:
strategy:
fail-fast: false
matrix:
include:
- os: windows-latest
runs-on: ${{matrix.os}}
steps:
- uses: actions/checkout@v4
- name: Setup Boost
shell: cmd
run: |
echo GITHUB_REPOSITORY: %GITHUB_REPOSITORY%
for /f %%i in ("%GITHUB_REPOSITORY%") do set LIBRARY=%%~nxi
echo LIBRARY: %LIBRARY%
echo LIBRARY=%LIBRARY%>>%GITHUB_ENV%
echo GITHUB_BASE_REF: %GITHUB_BASE_REF%
echo GITHUB_REF: %GITHUB_REF%
if "%GITHUB_BASE_REF%" == "" set GITHUB_BASE_REF=%GITHUB_REF%
set BOOST_BRANCH=develop
for /f %%i in ("%GITHUB_BASE_REF%") do if "%%~nxi" == "master" set BOOST_BRANCH=master
echo BOOST_BRANCH: %BOOST_BRANCH%
cd ..
git clone -b %BOOST_BRANCH% --depth 1 https://github.com/boostorg/boost.git boost-root
cd boost-root
xcopy /s /e /q %GITHUB_WORKSPACE% libs\%LIBRARY%\
git submodule update --init tools/boostdep
python tools/boostdep/depinst/depinst.py --git_args "--jobs 3" %LIBRARY%
- name: Configure
shell: cmd
run: |
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__
cmake --build . --target install --config Debug
- name: Install (Release)
shell: cmd
run: |
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__
cmake -DCMAKE_INSTALL_PREFIX=C:/cmake-prefix ..
cmake --build . --config Debug
ctest --output-on-failure --no-tests=error -C Debug
- name: Use the installed library (Release)
shell: cmd
run: |
cd ../boost-root/libs/%LIBRARY%/test/cmake_install_test/__build__
cmake --build . --config Release
ctest --output-on-failure --no-tests=error -C Release
windows-cmake-test:
strategy:
fail-fast: false
matrix:
include:
- os: windows-latest
runs-on: ${{matrix.os}}
steps:
- uses: actions/checkout@v4
- name: Setup Boost
shell: cmd
run: |
echo GITHUB_REPOSITORY: %GITHUB_REPOSITORY%
for /f %%i in ("%GITHUB_REPOSITORY%") do set LIBRARY=%%~nxi
echo LIBRARY: %LIBRARY%
echo LIBRARY=%LIBRARY%>>%GITHUB_ENV%
echo GITHUB_BASE_REF: %GITHUB_BASE_REF%
echo GITHUB_REF: %GITHUB_REF%
if "%GITHUB_BASE_REF%" == "" set GITHUB_BASE_REF=%GITHUB_REF%
set BOOST_BRANCH=develop
for /f %%i in ("%GITHUB_BASE_REF%") do if "%%~nxi" == "master" set BOOST_BRANCH=master
echo BOOST_BRANCH: %BOOST_BRANCH%
cd ..
git clone -b %BOOST_BRANCH% --depth 1 https://github.com/boostorg/boost.git boost-root
cd boost-root
xcopy /s /e /q %GITHUB_WORKSPACE% libs\%LIBRARY%\
git submodule update --init tools/boostdep
python tools/boostdep/depinst/depinst.py --git_args "--jobs 3" %LIBRARY%
- name: Configure
shell: cmd
run: |
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__
cmake --build . --target tests --config Debug
- name: Run tests (Debug)
shell: cmd
run: |
cd ../boost-root/__build__
ctest --output-on-failure --no-tests=error -C Debug
- name: Build tests (Release)
shell: cmd
run: |
cd ../boost-root/__build__
cmake --build . --target tests --config Release
- name: Run tests (Release)
shell: cmd
run: |
cd ../boost-root/__build__
ctest --output-on-failure --no-tests=error -C Release

View File

@@ -27,7 +27,6 @@ target_link_libraries(boost_range
Boost::optional
Boost::preprocessor
Boost::regex
Boost::static_assert
Boost::tuple
Boost::type_traits
Boost::utility

36
build.jam Normal file
View File

@@ -0,0 +1,36 @@
# Copyright René Ferdinand Rivera Morell 2023-2024
# Distributed under the Boost Software License, Version 1.0.
# (See accompanying file LICENSE_1_0.txt or copy at
# http://www.boost.org/LICENSE_1_0.txt)
require-b2 5.2 ;
constant boost_dependencies :
/boost/array//boost_array
/boost/assert//boost_assert
/boost/concept_check//boost_concept_check
/boost/config//boost_config
/boost/container_hash//boost_container_hash
/boost/conversion//boost_conversion
/boost/core//boost_core
/boost/detail//boost_detail
/boost/iterator//boost_iterator
/boost/mpl//boost_mpl
/boost/optional//boost_optional
/boost/preprocessor//boost_preprocessor
/boost/regex//boost_regex
/boost/tuple//boost_tuple
/boost/type_traits//boost_type_traits
/boost/utility//boost_utility ;
project /boost/range
;
explicit
[ alias boost_range : : :
: <include>include <library>$(boost_dependencies) ]
[ alias all : boost_range test ]
;
call-if : boost-library range
;

View File

@@ -13,6 +13,7 @@
#include <boost/mpl/if.hpp>
#include <boost/range/detail/any_iterator_buffer.hpp>
#include <boost/iterator/iterator_categories.hpp>
#include <boost/type_traits/add_const.hpp>
#include <boost/type_traits/is_convertible.hpp>
#include <boost/type_traits/is_reference.hpp>
#include <boost/type_traits/remove_const.hpp>

22
test/CMakeLists.txt Normal file
View File

@@ -0,0 +1,22 @@
# Copyright 2018, 2019 Peter Dimov
# Distributed under the Boost Software License, Version 1.0.
# See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt
include(BoostTestJamfile OPTIONAL RESULT_VARIABLE HAVE_BOOST_TEST)
if(HAVE_BOOST_TEST)
boost_test_jamfile(
FILE
Jamfile.v2
LINK_LIBRARIES
Boost::range
Boost::unit_test_framework
Boost::assign
Boost::foreach
Boost::lambda
Boost::regex
Boost::variant
)
endif()

View File

@@ -14,213 +14,217 @@ import testing ;
project
: requirements
<library>/boost/test//boost_unit_test_framework/
<library>/boost/regex//boost_regex/
<library>/boost/assign//boost_assign
<library>/boost/foreach//boost_foreach
<library>/boost/lambda//boost_lambda
<library>/boost/regex//boost_regex/<link>static
<library>/boost/test//boost_unit_test_framework
<library>/boost/variant//boost_variant
<link>static
<threading>multi
<warnings>all
;
rule range-test ( name : includes * )
{
return [
run $(name).cpp /boost/test//boost_unit_test_framework /boost/regex//boost_regex/<link>static
:
:
: <toolset>gcc:<cxxflags>"-Wall -Wunused "
] ;
}
compile-fail compile_fail/iterator_range1.cpp ;
compile-fail compile_fail/adaptor/adjacent_filtered_concept.cpp ;
compile-fail compile_fail/adaptor/adjacent_filtered_concept2.cpp ;
compile-fail compile_fail/adaptor/adjacent_filtered_concept3.cpp ;
compile-fail compile_fail/adaptor/adjacent_filtered_concept4.cpp ;
compile-fail compile_fail/adaptor/copied_concept.cpp ;
compile-fail compile_fail/adaptor/copied_concept2.cpp ;
compile-fail compile_fail/adaptor/copied_concept3.cpp ;
compile-fail compile_fail/adaptor/copied_concept4.cpp ;
compile-fail compile_fail/adaptor/reversed_concept.cpp ;
compile-fail compile_fail/adaptor/reversed_concept2.cpp ;
compile-fail compile_fail/adaptor/reversed_concept3.cpp ;
compile-fail compile_fail/adaptor/reversed_concept4.cpp ;
compile-fail compile_fail/adaptor/sliced_concept.cpp ;
compile-fail compile_fail/adaptor/sliced_concept2.cpp ;
compile-fail compile_fail/adaptor/sliced_concept3.cpp ;
compile-fail compile_fail/adaptor/sliced_concept4.cpp ;
compile-fail compile_fail/adaptor/uniqued_concept.cpp ;
compile-fail compile_fail/adaptor/uniqued_concept2.cpp ;
compile-fail compile_fail/adaptor/uniqued_concept3.cpp ;
compile-fail compile_fail/adaptor/uniqued_concept4.cpp ;
test-suite range :
[ compile-fail compile_fail/iterator_range1.cpp ]
[ compile-fail compile_fail/adaptor/adjacent_filtered_concept.cpp ]
[ compile-fail compile_fail/adaptor/adjacent_filtered_concept2.cpp ]
[ compile-fail compile_fail/adaptor/adjacent_filtered_concept3.cpp ]
[ compile-fail compile_fail/adaptor/adjacent_filtered_concept4.cpp ]
[ compile-fail compile_fail/adaptor/copied_concept.cpp ]
[ compile-fail compile_fail/adaptor/copied_concept2.cpp ]
[ compile-fail compile_fail/adaptor/copied_concept3.cpp ]
[ compile-fail compile_fail/adaptor/copied_concept4.cpp ]
[ compile-fail compile_fail/adaptor/reversed_concept.cpp ]
[ compile-fail compile_fail/adaptor/reversed_concept2.cpp ]
[ compile-fail compile_fail/adaptor/reversed_concept3.cpp ]
[ compile-fail compile_fail/adaptor/reversed_concept4.cpp ]
[ compile-fail compile_fail/adaptor/sliced_concept.cpp ]
[ compile-fail compile_fail/adaptor/sliced_concept2.cpp ]
[ compile-fail compile_fail/adaptor/sliced_concept3.cpp ]
[ compile-fail compile_fail/adaptor/sliced_concept4.cpp ]
[ compile-fail compile_fail/adaptor/uniqued_concept.cpp ]
[ compile-fail compile_fail/adaptor/uniqued_concept2.cpp ]
[ compile-fail compile_fail/adaptor/uniqued_concept3.cpp ]
[ compile-fail compile_fail/adaptor/uniqued_concept4.cpp ]
[ range-test adaptor_test/adjacent_filtered ]
[ range-test adaptor_test/chained ]
[ range-test adaptor_test/copied ]
[ range-test adaptor_test/filtered ]
[ range-test adaptor_test/indexed ]
[ range-test adaptor_test/indirected ]
[ range-test adaptor_test/map ]
[ range-test adaptor_test/ref_unwrapped ]
[ range-test adaptor_test/ref_unwrapped_example ]
[ range-test adaptor_test/replaced ]
[ range-test adaptor_test/replaced_if ]
[ range-test adaptor_test/reversed ]
[ range-test adaptor_test/sliced ]
[ range-test adaptor_test/strided ]
[ range-test adaptor_test/strided2 ]
[ range-test adaptor_test/ticket_6742_transformed_c4789_warning ]
[ range-test adaptor_test/ticket_8676_sliced_transformed ]
[ range-test adaptor_test/ticket_9519_strided_reversed ]
[ range-test adaptor_test/tokenized ]
[ range-test adaptor_test/transformed ]
[ range-test adaptor_test/type_erased ]
[ range-test adaptor_test/type_erased_abstract ]
[ range-test adaptor_test/type_erased_brackets ]
[ range-test adaptor_test/type_erased_mix_values ]
[ range-test adaptor_test/type_erased_tparam_conv ]
[ range-test adaptor_test/type_erased_single_pass ]
[ range-test adaptor_test/type_erased_forward ]
[ range-test adaptor_test/type_erased_bidirectional ]
[ range-test adaptor_test/type_erased_random_access ]
[ range-test adaptor_test/type_erased_transformed ]
[ range-test adaptor_test/uniqued ]
[ range-test adaptor_test/adjacent_filtered_example ]
[ range-test adaptor_test/copied_example ]
[ range-test adaptor_test/filtered_example ]
[ range-test adaptor_test/formatted ]
[ range-test adaptor_test/formatted_example ]
[ range-test adaptor_test/indexed_example ]
[ range-test adaptor_test/indirected_example ]
[ range-test adaptor_test/map_keys_example ]
[ range-test adaptor_test/map_values_example ]
[ range-test adaptor_test/replaced_example ]
[ range-test adaptor_test/replaced_if_example ]
[ range-test adaptor_test/reversed_example ]
[ range-test adaptor_test/sliced_example ]
[ range-test adaptor_test/strided_example ]
[ range-test adaptor_test/transformed_example ]
[ range-test adaptor_test/tokenized_example ]
[ range-test adaptor_test/type_erased_example ]
[ range-test adaptor_test/uniqued_example ]
[ range-test algorithm_test/adjacent_find ]
[ range-test algorithm_test/binary_search ]
[ range-test algorithm_test/copy ]
[ range-test algorithm_test/copy_backward ]
[ range-test algorithm_test/count ]
[ range-test algorithm_test/count_if ]
[ range-test algorithm_test/equal ]
[ range-test algorithm_test/equal_range ]
[ range-test algorithm_test/fill ]
[ range-test algorithm_test/find ]
[ range-test algorithm_test/find_if ]
[ range-test algorithm_test/find_end ]
[ range-test algorithm_test/find_first_of ]
[ range-test algorithm_test/for_each ]
[ range-test algorithm_test/generate ]
[ range-test algorithm_test/heap ]
[ range-test algorithm_test/includes ]
[ range-test algorithm_test/inplace_merge ]
[ range-test algorithm_test/lexicographical_compare ]
[ range-test algorithm_test/lower_bound ]
[ range-test algorithm_test/max_element ]
[ range-test algorithm_test/merge ]
[ range-test algorithm_test/min_element ]
[ range-test algorithm_test/mismatch ]
[ range-test algorithm_test/next_permutation ]
[ range-test algorithm_test/nth_element ]
[ range-test algorithm_test/partial_sort ]
[ range-test algorithm_test/partition ]
[ range-test algorithm_test/prev_permutation ]
[ range-test algorithm_test/random_shuffle ]
[ range-test algorithm_test/remove ]
[ range-test algorithm_test/remove_copy ]
[ range-test algorithm_test/remove_copy_if ]
[ range-test algorithm_test/remove_if ]
[ range-test algorithm_test/replace ]
[ range-test algorithm_test/replace_copy ]
[ range-test algorithm_test/replace_copy_if ]
[ range-test algorithm_test/replace_if ]
[ range-test algorithm_test/reverse ]
[ range-test algorithm_test/reverse_copy ]
[ range-test algorithm_test/rotate ]
[ range-test algorithm_test/rotate_copy ]
[ range-test algorithm_test/search ]
[ range-test algorithm_test/search_n ]
[ range-test algorithm_test/set_difference ]
[ range-test algorithm_test/set_intersection ]
[ range-test algorithm_test/set_symmetric_difference ]
[ range-test algorithm_test/set_union ]
[ range-test algorithm_test/sort ]
[ range-test algorithm_test/stable_partition ]
[ range-test algorithm_test/stable_sort ]
[ range-test algorithm_test/swap_ranges ]
[ range-test algorithm_test/transform ]
[ range-test algorithm_test/unique ]
[ range-test algorithm_test/unique_copy ]
[ range-test algorithm_test/upper_bound ]
[ range-test algorithm_ext_test/copy_n ]
[ range-test algorithm_ext_test/erase ]
[ range-test algorithm_ext_test/for_each_ext ]
[ range-test algorithm_ext_test/insert ]
[ range-test algorithm_ext_test/iota ]
[ range-test algorithm_ext_test/is_sorted ]
[ range-test algorithm_ext_test/overwrite ]
[ range-test algorithm_ext_test/push_back ]
[ range-test algorithm_ext_test/push_front ]
[ range-test adl_conformance ]
[ range-test adl_conformance_no_using ]
[ range-test algorithm ]
[ range-test algorithm_example ]
[ range-test array ]
# [ range-test atl : <include>$(VC71_ROOT)/atlmfc/include ]
[ range-test begin ]
[ range-test category ]
[ range-test combine ]
[ range-test compat2 ]
[ range-test compat3 ]
[ range-test const_iterator ]
[ range-test const_ranges ]
[ range-test const_reverse_iterator ]
[ range-test counting_range ]
[ range-test difference_type ]
[ range-test end ]
[ range-test extension_mechanism ]
[ range-test extension_size ]
[ range-test has_range_iterator ]
[ range-test irange ]
[ range-test istream_range ]
[ range-test iterator ]
[ range-test iterator_ext ]
[ range-test iterator_pair ]
[ range-test iterator_range ]
[ range-test iterator_range_drop ]
[ range-test iterator_range_equality_bug ]
[ range-test iterator_range_hash ]
[ range-test iterator_range_variant ]
# [ range-test mfc : <include>$(VC71_ROOT)/atlmfc/include ]
[ range-test join ]
[ range-test mutable_iterator ]
[ range-test partial_workaround ]
[ range-test pointer ]
[ range-test pointer_as_iterator ]
[ range-test reference ]
[ range-test result_iterator ]
[ range-test reverse_iterator ]
[ range-test reverse_result_iterator ]
[ range-test reversible_range ]
[ range-test size_type ]
[ range-test std_container ]
[ range-test string ]
[ range-test sub_range ]
[ range-test ticket_5486 ]
[ range-test ticket_5544_terminate_irange ]
[ range-test ticket_5547 ]
[ range-test ticket_5556_is_sorted_namespace ]
[ range-test ticket_5811_indirected_optional ]
[ range-test ticket_6715_iterator_range_equality ]
[ range-test ticket_6944 ]
[ range-test ticket_10336 ]
[ range-test value_type ]
;
run adaptor_test/adjacent_filtered.cpp ;
run adaptor_test/chained.cpp ;
run adaptor_test/copied.cpp ;
run adaptor_test/filtered.cpp ;
run adaptor_test/indexed.cpp ;
run adaptor_test/indirected.cpp ;
run adaptor_test/map.cpp ;
run adaptor_test/ref_unwrapped.cpp ;
run adaptor_test/ref_unwrapped_example.cpp ;
run adaptor_test/replaced.cpp ;
run adaptor_test/replaced_if.cpp ;
run adaptor_test/reversed.cpp ;
run adaptor_test/sliced.cpp ;
run adaptor_test/strided.cpp ;
run adaptor_test/strided2.cpp ;
run adaptor_test/ticket_6742_transformed_c4789_warning.cpp : : : <library>/boost/phoenix//boost_phoenix
# copy assignment operator of 'transform_iterator<boost::phoenix::actor<...' is deleted
<target-os>darwin:<build>no ;
run adaptor_test/ticket_8676_sliced_transformed.cpp ;
run adaptor_test/ticket_9519_strided_reversed.cpp ;
run adaptor_test/tokenized.cpp ;
run adaptor_test/transformed.cpp ;
run adaptor_test/type_erased.cpp ;
run adaptor_test/type_erased_abstract.cpp ;
run adaptor_test/type_erased_brackets.cpp ;
run adaptor_test/type_erased_mix_values.cpp ;
run adaptor_test/type_erased_tparam_conv.cpp ;
run adaptor_test/type_erased_single_pass.cpp ;
run adaptor_test/type_erased_forward.cpp ;
run adaptor_test/type_erased_bidirectional.cpp ;
run adaptor_test/type_erased_random_access.cpp ;
run adaptor_test/type_erased_transformed.cpp ;
run adaptor_test/uniqued.cpp ;
run adaptor_test/adjacent_filtered_example.cpp ;
run adaptor_test/copied_example.cpp ;
run adaptor_test/filtered_example.cpp ;
run adaptor_test/formatted.cpp ;
run adaptor_test/formatted_example.cpp ;
run adaptor_test/indexed_example.cpp ;
run adaptor_test/indirected_example.cpp ;
run adaptor_test/map_keys_example.cpp ;
run adaptor_test/map_values_example.cpp ;
run adaptor_test/replaced_example.cpp ;
run adaptor_test/replaced_if_example.cpp ;
run adaptor_test/reversed_example.cpp ;
run adaptor_test/sliced_example.cpp ;
run adaptor_test/strided_example.cpp ;
run adaptor_test/transformed_example.cpp ;
run adaptor_test/tokenized_example.cpp ;
run adaptor_test/type_erased_example.cpp ;
run adaptor_test/uniqued_example.cpp ;
run algorithm_test/adjacent_find.cpp ;
run algorithm_test/binary_search.cpp ;
run algorithm_test/copy.cpp ;
run algorithm_test/copy_backward.cpp ;
run algorithm_test/count.cpp ;
run algorithm_test/count_if.cpp ;
run algorithm_test/equal.cpp ;
run algorithm_test/equal_range.cpp ;
run algorithm_test/fill.cpp ;
run algorithm_test/find.cpp ;
run algorithm_test/find_if.cpp ;
# these two tests require /bigobj in windows-cmake-test
run algorithm_test/find_end.cpp : ;
run algorithm_test/find_first_of.cpp : ;
run algorithm_test/for_each.cpp ;
run algorithm_test/generate.cpp ;
run algorithm_test/heap.cpp ;
run algorithm_test/includes.cpp ;
run algorithm_test/inplace_merge.cpp ;
run algorithm_test/lexicographical_compare.cpp ;
run algorithm_test/lower_bound.cpp ;
run algorithm_test/max_element.cpp ;
run algorithm_test/merge.cpp ;
run algorithm_test/min_element.cpp ;
run algorithm_test/mismatch.cpp ;
run algorithm_test/next_permutation.cpp ;
run algorithm_test/nth_element.cpp ;
run algorithm_test/partial_sort.cpp ;
run algorithm_test/partition.cpp ;
run algorithm_test/prev_permutation.cpp ;
run algorithm_test/random_shuffle.cpp ;
run algorithm_test/remove.cpp ;
run algorithm_test/remove_copy.cpp ;
run algorithm_test/remove_copy_if.cpp ;
run algorithm_test/remove_if.cpp ;
run algorithm_test/replace.cpp ;
run algorithm_test/replace_copy.cpp ;
run algorithm_test/replace_copy_if.cpp ;
run algorithm_test/replace_if.cpp ;
run algorithm_test/reverse.cpp ;
run algorithm_test/reverse_copy.cpp ;
run algorithm_test/rotate.cpp ;
run algorithm_test/rotate_copy.cpp ;
run algorithm_test/search.cpp ;
run algorithm_test/search_n.cpp ;
run algorithm_test/set_difference.cpp ;
run algorithm_test/set_intersection.cpp ;
run algorithm_test/set_symmetric_difference.cpp ;
run algorithm_test/set_union.cpp ;
run algorithm_test/sort.cpp ;
run algorithm_test/stable_partition.cpp ;
run algorithm_test/stable_sort.cpp ;
run algorithm_test/swap_ranges.cpp ;
run algorithm_test/transform.cpp ;
run algorithm_test/unique.cpp ;
run algorithm_test/unique_copy.cpp ;
run algorithm_test/upper_bound.cpp ;
run algorithm_ext_test/copy_n.cpp ;
run algorithm_ext_test/erase.cpp ;
run algorithm_ext_test/for_each_ext.cpp ;
run algorithm_ext_test/insert.cpp ;
run algorithm_ext_test/iota.cpp ;
run algorithm_ext_test/is_sorted.cpp ;
run algorithm_ext_test/overwrite.cpp ;
run algorithm_ext_test/push_back.cpp ;
run algorithm_ext_test/push_front.cpp ;
run adl_conformance.cpp ;
run adl_conformance_no_using.cpp ;
run algorithm.cpp ;
run algorithm_example.cpp ;
run array.cpp ;
#run atl.cpp : <include>$(VC71_ROOT)/atlmfc/include ;
run begin.cpp ;
run category.cpp ;
run combine.cpp ;
run compat2.cpp ;
run compat3.cpp ;
run const_iterator.cpp ;
run const_ranges.cpp ;
run const_reverse_iterator.cpp ;
run counting_range.cpp ;
run difference_type.cpp ;
run end.cpp ;
run extension_mechanism.cpp ;
run extension_size.cpp ;
run has_range_iterator.cpp ;
run irange.cpp ;
run istream_range.cpp ;
run iterator.cpp ;
run iterator_ext.cpp ;
run iterator_pair.cpp ;
run iterator_range.cpp ;
run iterator_range_drop.cpp ;
run iterator_range_equality_bug.cpp ;
run iterator_range_hash.cpp ;
run iterator_range_variant.cpp ;
#run mfc.cpp : <include>$(VC71_ROOT)/atlmfc/include ;
run join.cpp ;
run mutable_iterator.cpp ;
run partial_workaround.cpp ;
run pointer.cpp ;
run pointer_as_iterator.cpp ;
run reference.cpp ;
run result_iterator.cpp ;
run reverse_iterator.cpp ;
run reverse_result_iterator.cpp ;
run reversible_range.cpp ;
run size_type.cpp ;
run std_container.cpp ;
run string.cpp ;
run sub_range.cpp ;
run ticket_5486.cpp ;
run ticket_5544_terminate_irange.cpp ;
run ticket_5547.cpp ;
run ticket_5556_is_sorted_namespace.cpp ;
run ticket_5811_indirected_optional.cpp ;
run ticket_6715_iterator_range_equality.cpp ;
run ticket_6944.cpp ;
run ticket_10336.cpp ;
run value_type.cpp ;
# `quick` target (for CI)
alias quick : std_container ;

View File

@@ -23,13 +23,13 @@
#define _SCL_SECURE_NO_WARNINGS
#endif
#ifdef _MSC_VER
#if defined(_MSC_VER) && !defined(__clang__)
// counting_iterator generates a warning about truncating an integer
#pragma warning(push)
#pragma warning(disable : 4244)
#endif
#include <boost/iterator/counting_iterator.hpp>
#ifdef _MSC_VER
#if defined(_MSC_VER) && !defined(__clang__)
template ::boost::counting_iterator<int>;
#pragma warning(pop)
#endif

View File

@@ -0,0 +1,17 @@
# Copyright 2018, 2019 Peter Dimov
# Distributed under the Boost Software License, Version 1.0.
# See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt
cmake_minimum_required(VERSION 3.5...3.31)
project(cmake_install_test LANGUAGES CXX)
find_package(boost_range REQUIRED)
add_executable(main main.cpp)
target_link_libraries(main Boost::range)
enable_testing()
add_test(main main)
add_custom_target(check VERBATIM COMMAND ${CMAKE_CTEST_COMMAND} --output-on-failure -C $<CONFIG>)

View File

@@ -0,0 +1,19 @@
// Copyright 2026 Peter Dimov
// Distributed under the Boost Software License, Version 1.0.
// http://www.boost.org/LICENSE_1_0.txt
#undef NDEBUG
#include <boost/range.hpp>
#include <string>
#include <cassert>
int main()
{
std::string s( "foo" );
assert( boost::begin( s ) == s.begin() );
assert( boost::end( s ) == s.end() );
assert( boost::empty( s ) == s.empty() );
assert( boost::size( s ) == s.size() );
}

View File

@@ -0,0 +1,18 @@
# Copyright 2018, 2019 Peter Dimov
# Distributed under the Boost Software License, Version 1.0.
# See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt
cmake_minimum_required(VERSION 3.5...3.31)
project(cmake_subdir_test LANGUAGES CXX)
set(BOOST_INCLUDE_LIBRARIES range)
add_subdirectory(../../../.. boostorg/boost)
add_executable(main main.cpp)
target_link_libraries(main Boost::range)
enable_testing()
add_test(main main)
add_custom_target(check VERBATIM COMMAND ${CMAKE_CTEST_COMMAND} --output-on-failure -C $<CONFIG>)

View File

@@ -0,0 +1,19 @@
// Copyright 2026 Peter Dimov
// Distributed under the Boost Software License, Version 1.0.
// http://www.boost.org/LICENSE_1_0.txt
#undef NDEBUG
#include <boost/range.hpp>
#include <string>
#include <cassert>
int main()
{
std::string s( "foo" );
assert( boost::begin( s ) == s.begin() );
assert( boost::end( s ) == s.end() );
assert( boost::empty( s ) == s.empty() );
assert( boost::size( s ) == s.size() );
}