mirror of
https://github.com/boostorg/static_string.git
synced 2026-01-21 17:32:16 +00:00
Compare commits
75 Commits
remove-tra
...
develop
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
e9313dc331 | ||
|
|
0c5e5b8e58 | ||
|
|
6f0c00b268 | ||
|
|
2175496c55 | ||
|
|
aee3c62957 | ||
|
|
0e28b358dc | ||
|
|
4dcfb39494 | ||
|
|
4bf6461ca1 | ||
|
|
67efdf6a9b | ||
|
|
3a410b8472 | ||
|
|
bf988466f8 | ||
|
|
a526ebd1f6 | ||
|
|
2f8c7a69ea | ||
|
|
c915934529 | ||
|
|
10b5491104 | ||
|
|
a58319dbdd | ||
|
|
4c84b61975 | ||
|
|
fbd6051165 | ||
|
|
db1ea76a17 | ||
|
|
ee172b86fd | ||
|
|
bd3dd01259 | ||
|
|
a841869405 | ||
|
|
3613e9578d | ||
|
|
6f17b60377 | ||
|
|
815678e1e7 | ||
|
|
2cc22bf5a8 | ||
|
|
d6f976a7df | ||
|
|
7b564d8d26 | ||
|
|
3c37deed99 | ||
|
|
34ef5c45be | ||
|
|
0f34644488 | ||
|
|
4c27826548 | ||
|
|
9c5d69475d | ||
|
|
300781d954 | ||
|
|
cd1a1a41c3 | ||
|
|
0d255f7438 | ||
|
|
17d77ef5bb | ||
|
|
20afd07676 | ||
|
|
7f903ef7ce | ||
|
|
5dfbb1f2b1 | ||
|
|
37a557d937 | ||
|
|
cd546285c4 | ||
|
|
645bf0a27d | ||
|
|
5067dfce5f | ||
|
|
d37197d773 | ||
|
|
a421cf742c | ||
|
|
7a53b7ff20 | ||
|
|
24d62635a3 | ||
|
|
a8f671ea1e | ||
|
|
d677c9436c | ||
|
|
a3cc7bcf95 | ||
|
|
70578731e7 | ||
|
|
3fb22ed769 | ||
|
|
32824bfa1d | ||
|
|
f15a4d0586 | ||
|
|
cd5bc51e9e | ||
|
|
77d6a43dce | ||
|
|
8f969a62f7 | ||
|
|
bff5cb65a5 | ||
|
|
42bb99ed25 | ||
|
|
175f467a03 | ||
|
|
6275cd7fe3 | ||
|
|
ac84c4f40e | ||
|
|
269987446e | ||
|
|
82ff4e0679 | ||
|
|
9c3d5febe7 | ||
|
|
0c914ff05b | ||
|
|
bfce6eea90 | ||
|
|
ffce33d483 | ||
|
|
c4f6491537 | ||
|
|
25579e482f | ||
|
|
3e9489a7af | ||
|
|
7822f1b991 | ||
|
|
5d6fefdd2a | ||
|
|
f92940bfab |
121
.appveyor.yml
121
.appveyor.yml
@@ -1,5 +1,6 @@
|
|||||||
# Copyright 2016, 2017 Peter Dimov
|
# Copyright 2016, 2017 Peter Dimov
|
||||||
# Copyright (C) 2017 - 2019 James E. King III
|
# Copyright 2017 - 2019 James E. King III
|
||||||
|
# Copyright 2019 - 2021 Alexander Grund
|
||||||
# Distributed under the Boost Software License, Version 1.0.
|
# 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)
|
# (See accompanying file LICENSE_1_0.txt or copy at http://boost.org/LICENSE_1_0.txt)
|
||||||
|
|
||||||
@@ -21,7 +22,7 @@
|
|||||||
|
|
||||||
version: 1.0.{build}-{branch}
|
version: 1.0.{build}-{branch}
|
||||||
|
|
||||||
shallow_clone: true
|
shallow_clone: false
|
||||||
|
|
||||||
branches:
|
branches:
|
||||||
only:
|
only:
|
||||||
@@ -33,115 +34,101 @@ branches:
|
|||||||
- /pr\/.*/
|
- /pr\/.*/
|
||||||
|
|
||||||
matrix:
|
matrix:
|
||||||
|
fast_finish: false
|
||||||
# Adding MAYFAIL to any matrix job allows it to fail but the build stays green:
|
# Adding MAYFAIL to any matrix job allows it to fail but the build stays green:
|
||||||
allow_failures:
|
allow_failures:
|
||||||
- MAYFAIL: true
|
- MAYFAIL: true
|
||||||
|
|
||||||
environment:
|
environment:
|
||||||
global:
|
global:
|
||||||
|
B2_CI_VERSION: 1
|
||||||
|
GIT_FETCH_JOBS: 4
|
||||||
# see: http://www.boost.org/build/doc/html/bbv2/overview/invocation.html#bbv2.overview.invocation.properties
|
# see: http://www.boost.org/build/doc/html/bbv2/overview/invocation.html#bbv2.overview.invocation.properties
|
||||||
# to use the default for a given environment, comment it out; recommend you build debug and release however:
|
# to use the default for a given environment, comment it out; recommend you build debug and release however:
|
||||||
# on Windows it is important to exercise all the possibilities, especially shared vs static, however most
|
# on Windows it is important to exercise all the possibilities, especially shared vs static, however most
|
||||||
# libraries that care about this exercise it in their Jamfiles...
|
# libraries that care about this exercise it in their Jamfiles...
|
||||||
# B2_ADDRESS_MODEL: address-model=64,32
|
B2_ADDRESS_MODEL: 32,64
|
||||||
# B2_LINK: link=shared,static
|
B2_LINK: shared,static
|
||||||
# B2_THREADING: threading=multi,single
|
# B2_THREADING: threading=multi,single
|
||||||
B2_VARIANT: variant=release
|
B2_VARIANT: release
|
||||||
|
|
||||||
matrix:
|
matrix:
|
||||||
|
- FLAVOR: Visual Studio 2022
|
||||||
|
APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2022
|
||||||
|
B2_CXXFLAGS: -permissive-
|
||||||
|
B2_CXXSTD: 14,17,20
|
||||||
|
B2_TOOLSET: msvc-14.3
|
||||||
|
|
||||||
- FLAVOR: Visual Studio 2019
|
- FLAVOR: Visual Studio 2019
|
||||||
APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2019
|
APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2019
|
||||||
B2_ADDRESS_MODEL: address-model=64
|
B2_CXXFLAGS: -permissive-
|
||||||
B2_CXXFLAGS: cxxflags=-permissive-
|
B2_CXXSTD: 14,17,2a
|
||||||
B2_CXXSTD: 17 # 2a
|
|
||||||
B2_TOOLSET: msvc-14.2
|
B2_TOOLSET: msvc-14.2
|
||||||
|
|
||||||
- FLAVOR: Visual Studio 2017 C++2a Strict
|
- FLAVOR: Visual Studio 2017 C++2a Strict
|
||||||
APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2017
|
APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2017
|
||||||
B2_ADDRESS_MODEL: address-model=64
|
B2_CXXFLAGS: -permissive-
|
||||||
B2_CXXFLAGS: cxxflags=-permissive-
|
B2_CXXSTD: 2a
|
||||||
B2_CXXSTD: 17 # 2a
|
|
||||||
B2_TOOLSET: msvc-14.1
|
B2_TOOLSET: msvc-14.1
|
||||||
|
|
||||||
- FLAVOR: Visual Studio 2017 C++17
|
- FLAVOR: Visual Studio 2017 C++14/17
|
||||||
APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2017
|
APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2017
|
||||||
B2_ADDRESS_MODEL: address-model=64
|
B2_CXXSTD: 14,17
|
||||||
B2_CXXSTD: 17
|
|
||||||
B2_TOOLSET: msvc-14.1
|
|
||||||
B2_VARIANT: variant=debug
|
|
||||||
|
|
||||||
- FLAVOR: Visual Studio 2017 C++14 (Default)
|
|
||||||
APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2017
|
|
||||||
B2_ADDRESS_MODEL: address-model=64,32
|
|
||||||
B2_TOOLSET: msvc-14.1
|
B2_TOOLSET: msvc-14.1
|
||||||
|
|
||||||
- FLAVOR: clang-cl
|
- FLAVOR: clang-cl
|
||||||
APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2017
|
APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2019
|
||||||
B2_ADDRESS_MODEL: address-model=64
|
ADDCOMMANDS: '"C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Auxiliary\Build\vcvars64.bat"'
|
||||||
B2_CXXSTD: 11
|
B2_ADDRESS_MODEL: 64
|
||||||
|
B2_CXXSTD: 11,14,17
|
||||||
B2_TOOLSET: clang-win
|
B2_TOOLSET: clang-win
|
||||||
|
|
||||||
- FLAVOR: Visual Studio 2015 C++14 (Default)
|
# not supported
|
||||||
APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2015
|
# - FLAVOR: Visual Studio 2015, 2013
|
||||||
B2_ADDRESS_MODEL: address-model=64,32
|
# APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2015
|
||||||
B2_TOOLSET: msvc-14.0
|
# B2_TOOLSET: msvc-12.0,msvc-14.0
|
||||||
B2_VARIANT: variant=debug
|
|
||||||
|
|
||||||
- FLAVOR: Visual Studio 2010, 2012, 2013
|
# - FLAVOR: Visual Studio 2008, 2010, 2012
|
||||||
APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2015
|
# APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2015
|
||||||
B2_TOOLSET: msvc-10.0,msvc-11.0,msvc-12.0
|
# B2_TOOLSET: msvc-9.0,msvc-10.0,msvc-11.0
|
||||||
|
# B2_ADDRESS_MODEL: 32 # No 64bit support
|
||||||
|
|
||||||
- FLAVOR: cygwin (32-bit)
|
- FLAVOR: cygwin (32-bit)
|
||||||
APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2017
|
APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2017
|
||||||
ADDPATH: C:\cygwin\bin;
|
ADDPATH: C:\cygwin\bin;
|
||||||
B2_ADDRESS_MODEL: address-model=32
|
B2_ADDRESS_MODEL: 32
|
||||||
B2_CXXSTD: 03,11
|
B2_CXXSTD: 11,14,1z
|
||||||
# https://github.com/boostorg/test/issues/144
|
|
||||||
B2_DEFINES: define=_POSIX_C_SOURCE=200112L
|
|
||||||
B2_THREADING: threadapi=pthread
|
|
||||||
B2_TOOLSET: gcc
|
B2_TOOLSET: gcc
|
||||||
B2_VARIANT: variant=debug
|
|
||||||
|
|
||||||
- FLAVOR: cygwin (64-bit)
|
- FLAVOR: cygwin (64-bit)
|
||||||
APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2017
|
APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2017
|
||||||
ADDPATH: C:\cygwin64\bin;
|
ADDPATH: C:\cygwin64\bin;
|
||||||
B2_ADDRESS_MODEL: address-model=64
|
B2_ADDRESS_MODEL: 64
|
||||||
B2_CXXSTD: 11,17
|
B2_CXXSTD: 11,14,1z
|
||||||
# https://github.com/boostorg/test/issues/144
|
|
||||||
B2_DEFINES: define=_POSIX_C_SOURCE=200112L define=__USE_ISOC99
|
|
||||||
B2_THREADING: threadapi=pthread
|
|
||||||
B2_TOOLSET: gcc
|
B2_TOOLSET: gcc
|
||||||
|
|
||||||
- FLAVOR: mingw32
|
- FLAVOR: mingw64 (32-bit)
|
||||||
APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2017
|
APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2019
|
||||||
ARCH: i686
|
ADDPATH: C:\mingw-w64\i686-8.1.0-posix-dwarf-rt_v6-rev0\mingw32\bin;
|
||||||
B2_ADDRESS_MODEL: address-model=32
|
B2_ADDRESS_MODEL: 32
|
||||||
B2_CXXSTD: 03,11
|
B2_CXXSTD: 11,14,17,2a
|
||||||
SCRIPT: ci\appveyor\mingw.bat
|
B2_TOOLSET: gcc
|
||||||
B2_VARIANT: variant=debug
|
|
||||||
|
|
||||||
- FLAVOR: mingw64
|
- FLAVOR: mingw64
|
||||||
APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2017
|
APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2019
|
||||||
ARCH: x86_64
|
ADDPATH: C:\mingw-w64\x86_64-8.1.0-posix-seh-rt_v6-rev0\mingw64\bin;
|
||||||
B2_ADDRESS_MODEL: address-model=64
|
B2_ADDRESS_MODEL: 64
|
||||||
B2_CXXSTD: 11,17
|
B2_CXXSTD: 11,14,17,2a
|
||||||
B2_DEFINES: define=__USE_ISOC99
|
B2_TOOLSET: gcc
|
||||||
SCRIPT: ci\appveyor\mingw.bat
|
|
||||||
|
|
||||||
install:
|
install:
|
||||||
- set SELF=%APPVEYOR_PROJECT_NAME:-=_%
|
- '%ADDCOMMANDS%'
|
||||||
- git clone https://github.com/boostorg/boost-ci.git C:\boost-ci
|
- git clone --depth 1 https://github.com/boostorg/boost-ci.git C:\boost-ci-cloned
|
||||||
- xcopy /s /e /q /i C:\boost-ci\ci .\ci
|
# Copy ci folder if not testing Boost.CI
|
||||||
|
- if NOT "%APPVEYOR_PROJECT_NAME%" == "boost-ci" xcopy /s /e /q /i /y C:\boost-ci-cloned\ci .\ci
|
||||||
|
- rmdir /s /q C:\boost-ci-cloned
|
||||||
- ci\appveyor\install.bat
|
- ci\appveyor\install.bat
|
||||||
|
|
||||||
build: off
|
build: off
|
||||||
|
|
||||||
test_script:
|
test_script: ci\build.bat
|
||||||
- set SELF=%APPVEYOR_PROJECT_NAME:-=_%
|
|
||||||
- PATH=%ADDPATH%%PATH%
|
|
||||||
# The definition of B2_TOOLCXX omits B2_CXXSTD= if it was not defined above
|
|
||||||
- IF NOT DEFINED B2_CXXSTD (SET B2_TOOLCXX=toolset=%B2_TOOLSET%) ELSE (SET B2_TOOLCXX=toolset=%B2_TOOLSET% cxxstd=%B2_CXXSTD%)
|
|
||||||
# Echo the complete build command to the build log
|
|
||||||
- IF NOT DEFINED SCRIPT (ECHO b2 libs/%SELF:\=/% %B2_TOOLCXX% %B2_CXXFLAGS% %B2_DEFINES% %B2_THREADING% %B2_ADDRESS_MODEL% %B2_LINK% %B2_THREADING% %B2_VARIANT% -j3)
|
|
||||||
# Now go build...
|
|
||||||
- IF DEFINED SCRIPT (call libs\%SELF%\%SCRIPT%) ELSE (b2 libs/%SELF:\=/% %B2_TOOLCXX% %B2_CXXFLAGS% %B2_DEFINES% %B2_THREADING% %B2_ADDRESS_MODEL% %B2_LINK% %B2_THREADING% %B2_VARIANT% -j3)
|
|
||||||
|
|||||||
@@ -1,276 +0,0 @@
|
|||||||
# Copyright 2015-2019 Rene Rivera.
|
|
||||||
# Copyright 2019 Mateusz Loskot <mateusz at loskot dot net>
|
|
||||||
# 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)
|
|
||||||
|
|
||||||
#
|
|
||||||
# Generic Azure Pipelines build script for boostorg repositories
|
|
||||||
# See: https://github.com/boostorg/boost-ci/
|
|
||||||
#
|
|
||||||
# Instructions for customizing this script for your library:
|
|
||||||
#
|
|
||||||
# 1. Customize the compilers and language levels you want.
|
|
||||||
# 2. If you have more than include/, src/, test/, example/, examples/,
|
|
||||||
# benchmark/ or tools/ directories, set the environment variable DEPINST.
|
|
||||||
# For example if your build uses code in "bench/" and "fog/" directories:
|
|
||||||
# - DEPINST: --include bench --include fog
|
|
||||||
# 3. Enable pull request builds in your boostorg/<library> account.
|
|
||||||
#
|
|
||||||
# That's it - the script will do everything else for you.
|
|
||||||
|
|
||||||
trigger:
|
|
||||||
branches:
|
|
||||||
include:
|
|
||||||
- develop
|
|
||||||
- master
|
|
||||||
- bugfix/*
|
|
||||||
- feature/*
|
|
||||||
- fix/*
|
|
||||||
- pr/*
|
|
||||||
|
|
||||||
pr:
|
|
||||||
branches:
|
|
||||||
include:
|
|
||||||
- develop
|
|
||||||
|
|
||||||
variables:
|
|
||||||
- name: B2_VARIANT
|
|
||||||
value: variant=release,debug
|
|
||||||
|
|
||||||
stages:
|
|
||||||
|
|
||||||
- stage: Test
|
|
||||||
jobs:
|
|
||||||
|
|
||||||
- job: 'Linux'
|
|
||||||
pool:
|
|
||||||
vmImage: 'ubuntu-16.04'
|
|
||||||
strategy:
|
|
||||||
matrix:
|
|
||||||
GCC 8:
|
|
||||||
B2_TOOLSET: gcc
|
|
||||||
B2_CXXSTD: 14,17
|
|
||||||
CXX: g++-8
|
|
||||||
PACKAGES: g++-8
|
|
||||||
GCC 7:
|
|
||||||
B2_TOOLSET: gcc
|
|
||||||
B2_CXXSTD: 11,14,17
|
|
||||||
CXX: g++-7
|
|
||||||
PACKAGES: g++-7
|
|
||||||
GCC 6:
|
|
||||||
B2_TOOLSET: gcc
|
|
||||||
B2_CXXSTD: 11,14
|
|
||||||
CXX: g++-6
|
|
||||||
PACKAGES: g++-6
|
|
||||||
GCC 5:
|
|
||||||
B2_TOOLSET: gcc
|
|
||||||
B2_CXXSTD: 11
|
|
||||||
CXX: g++-5
|
|
||||||
PACKAGES: g++-5
|
|
||||||
GCC 4.9:
|
|
||||||
B2_TOOLSET: gcc
|
|
||||||
B2_CXXSTD: 11
|
|
||||||
CXX: g++-4.9
|
|
||||||
PACKAGES: g++-4.9
|
|
||||||
GCC 4.8:
|
|
||||||
B2_TOOLSET: gcc
|
|
||||||
B2_CXXSTD: 11
|
|
||||||
CXX: g++-4.8
|
|
||||||
PACKAGES: g++-4.8
|
|
||||||
Clang 8:
|
|
||||||
B2_TOOLSET: clang
|
|
||||||
B2_CXXSTD: 14,17
|
|
||||||
CXX: clang++-8
|
|
||||||
PACKAGES: clang-8
|
|
||||||
LLVM_REPO: llvm-toolchain-xenial-8
|
|
||||||
Clang 7:
|
|
||||||
B2_TOOLSET: clang
|
|
||||||
B2_CXXSTD: 14,17
|
|
||||||
CXX: clang++-7
|
|
||||||
PACKAGES: clang-7
|
|
||||||
LLVM_REPO: llvm-toolchain-xenial-7
|
|
||||||
Clang 6:
|
|
||||||
B2_TOOLSET: clang
|
|
||||||
B2_CXXSTD: 14,17
|
|
||||||
CXX: clang++-6.0
|
|
||||||
PACKAGES: clang-6.0
|
|
||||||
LLVM_REPO: llvm-toolchain-xenial-6.0
|
|
||||||
Clang 5:
|
|
||||||
B2_TOOLSET: clang
|
|
||||||
B2_CXXSTD: 11,14,17
|
|
||||||
PACKAGES: clang-5.0
|
|
||||||
CXX: clang++-5.0
|
|
||||||
LLVM_REPO: llvm-toolchain-xenial-5.0
|
|
||||||
Clang 4:
|
|
||||||
B2_TOOLSET: clang
|
|
||||||
B2_CXXSTD: 11,14,17
|
|
||||||
CXX: clang++-4.0
|
|
||||||
PACKAGES: clang-4.0
|
|
||||||
LLVM_REPO: llvm-toolchain-xenial-4.0
|
|
||||||
Clang 3.9:
|
|
||||||
B2_TOOLSET: clang
|
|
||||||
B2_CXXSTD: 11,14
|
|
||||||
CXX: clang++-3.9
|
|
||||||
PACKAGES: clang-3.9
|
|
||||||
Clang 3.8:
|
|
||||||
B2_TOOLSET: clang
|
|
||||||
CXX: clang++-3.8
|
|
||||||
B2_CXXSTD: 11,14
|
|
||||||
PACKAGES: clang-3.8
|
|
||||||
Clang 3.7:
|
|
||||||
B2_TOOLSET: clang
|
|
||||||
B2_CXXSTD: 11
|
|
||||||
CXX: clang++-3.7
|
|
||||||
PACKAGES: clang-3.7
|
|
||||||
Clang 3.6:
|
|
||||||
B2_TOOLSET: clang
|
|
||||||
B2_CXXSTD: 11
|
|
||||||
CXX: clang++-3.6
|
|
||||||
PACKAGES: clang-3.6
|
|
||||||
Clang 3.5:
|
|
||||||
B2_TOOLSET: clang
|
|
||||||
B2_CXXSTD: 11
|
|
||||||
CXX: clang++-3.5
|
|
||||||
PACKAGES: clang-3.5
|
|
||||||
steps:
|
|
||||||
- bash: |
|
|
||||||
set -e
|
|
||||||
uname -a
|
|
||||||
sudo -E apt-add-repository -y "ppa:ubuntu-toolchain-r/test"
|
|
||||||
if test -n "${LLVM_REPO}" ; then
|
|
||||||
wget -O - https://apt.llvm.org/llvm-snapshot.gpg.key | sudo apt-key add -
|
|
||||||
sudo -E apt-add-repository "deb http://apt.llvm.org/xenial/ ${LLVM_REPO} main"
|
|
||||||
fi
|
|
||||||
sudo -E apt-get update
|
|
||||||
sudo -E apt-get -yq --no-install-suggests --no-install-recommends install ${PACKAGES}
|
|
||||||
|
|
||||||
git clone --branch master https://github.com/boostorg/boost-ci.git boost-ci
|
|
||||||
cp -pr boost-ci/ci boost-ci/.codecov.yml .
|
|
||||||
rm -rf boost-ci
|
|
||||||
source ci/azure-pipelines/install.sh
|
|
||||||
|
|
||||||
# AzP requires to run special task in order to export
|
|
||||||
# SELF and BOOST_ROOT as job-scoped variable from a script.
|
|
||||||
# NOTE: Disable set -x is necessary, see the troubleshooting guide
|
|
||||||
# on "Variables having ' (single quote) appended":
|
|
||||||
# https://docs.microsoft.com/en-us/azure/devops/pipelines/troubleshooting
|
|
||||||
set +x
|
|
||||||
echo "##vso[task.setvariable variable=SELF]"$SELF
|
|
||||||
echo "##vso[task.setvariable variable=BOOST_ROOT]"$BOOST_ROOT
|
|
||||||
set -x
|
|
||||||
displayName: 'Install'
|
|
||||||
- bash: |
|
|
||||||
set -e
|
|
||||||
echo "SELF=$SELF"
|
|
||||||
echo "BOOST_ROOT=$BOOST_ROOT"
|
|
||||||
|
|
||||||
cd $BOOST_ROOT/libs/$SELF
|
|
||||||
ci/azure-pipelines/build.sh --debug-configuration
|
|
||||||
displayName: 'Build'
|
|
||||||
|
|
||||||
- job: 'Windows'
|
|
||||||
strategy:
|
|
||||||
matrix:
|
|
||||||
VS 2019 C++17 Strict:
|
|
||||||
B2_TOOLSET: msvc-14.2
|
|
||||||
B2_CXXSTD: 17
|
|
||||||
B2_CXXFLAGS: cxxflags=-permissive-
|
|
||||||
B2_ADDRESS_MODEL: address-model=64
|
|
||||||
VM_IMAGE: 'windows-2019'
|
|
||||||
VS 2017 C++17 Strict:
|
|
||||||
B2_TOOLSET: msvc-14.1
|
|
||||||
B2_CXXSTD: 17
|
|
||||||
B2_CXXFLAGS: cxxflags=-permissive-
|
|
||||||
B2_ADDRESS_MODEL: address-model=64
|
|
||||||
VM_IMAGE: 'vs2017-win2016'
|
|
||||||
VS 2017 C++17:
|
|
||||||
B2_TOOLSET: msvc-14.1
|
|
||||||
B2_CXXSTD: 17
|
|
||||||
B2_ADDRESS_MODEL: address-model=64,32
|
|
||||||
VM_IMAGE: 'vs2017-win2016'
|
|
||||||
VS 2017 C++14:
|
|
||||||
B2_TOOLSET: msvc-14.1
|
|
||||||
#B2_CXXSTD: 14 # default
|
|
||||||
B2_ADDRESS_MODEL: address-model=64,32
|
|
||||||
VM_IMAGE: 'vs2017-win2016'
|
|
||||||
|
|
||||||
pool:
|
|
||||||
vmImage: $(VM_IMAGE)
|
|
||||||
steps:
|
|
||||||
- script: |
|
|
||||||
set SELF=%BUILD_REPOSITORY_NAME:-=_%
|
|
||||||
for /f "tokens=2 delims=/" %%a in ("%SELF%") do set SELF=%%a
|
|
||||||
set BOOST_ROOT=%BUILD_SOURCESDIRECTORY%\boost-root
|
|
||||||
|
|
||||||
git clone --branch master https://github.com/boostorg/boost-ci.git boost-ci
|
|
||||||
xcopy /s /e /q /i boost-ci\ci .\ci
|
|
||||||
cmd /k ci\azure-pipelines\install.bat
|
|
||||||
|
|
||||||
echo ##vso[task.setvariable variable=SELF]%SELF%
|
|
||||||
echo ##vso[task.setvariable variable=BOOST_ROOT]%BOOST_ROOT%
|
|
||||||
displayName: 'Install'
|
|
||||||
- script: |
|
|
||||||
PATH=%ADDPATH%%PATH%
|
|
||||||
REM The definition of B2_TOOLCXX omits B2_CXXSTD= if it was not defined above
|
|
||||||
IF NOT DEFINED B2_CXXSTD (SET B2_TOOLCXX=toolset=%B2_TOOLSET%) ELSE (SET B2_TOOLCXX=toolset=%B2_TOOLSET% cxxstd=%B2_CXXSTD%)
|
|
||||||
cd %BOOST_ROOT%
|
|
||||||
ECHO b2 libs/%SELF:\=/% %B2_TOOLCXX% %B2_CXXFLAGS% %B2_DEFINES% %B2_THREADING% %B2_ADDRESS_MODEL% %B2_LINK% %B2_THREADING% %B2_VARIANT% -j3
|
|
||||||
b2 libs/%SELF:\=/% %B2_TOOLCXX% %B2_CXXFLAGS% %B2_DEFINES% %B2_THREADING% %B2_ADDRESS_MODEL% %B2_LINK% %B2_THREADING% %B2_VARIANT% -j3
|
|
||||||
displayName: 'Build'
|
|
||||||
|
|
||||||
- job: 'macOS'
|
|
||||||
pool:
|
|
||||||
vmImage: 'macOS-10.14'
|
|
||||||
strategy:
|
|
||||||
matrix:
|
|
||||||
Xcode_11_3_1:
|
|
||||||
B2_TOOLSET: clang
|
|
||||||
B2_CXXSTD: 14,17,2a
|
|
||||||
XCODE_APP: /Applications/Xcode_11.3.1.app
|
|
||||||
Xcode_11_2_1:
|
|
||||||
B2_TOOLSET: clang
|
|
||||||
B2_CXXSTD: 14,17,2a
|
|
||||||
XCODE_APP: /Applications/Xcode_11.2.1.app
|
|
||||||
Xcode_11_2:
|
|
||||||
B2_TOOLSET: clang
|
|
||||||
B2_CXXSTD: 14,17,2a
|
|
||||||
XCODE_APP: /Applications/Xcode_11.2.app
|
|
||||||
Xcode_11_1:
|
|
||||||
B2_TOOLSET: clang
|
|
||||||
B2_CXXSTD: 14,17,2a
|
|
||||||
XCODE_APP: /Applications/Xcode_11.1.app
|
|
||||||
Xcode_10_3:
|
|
||||||
B2_TOOLSET: clang
|
|
||||||
B2_CXXSTD: 11,14,17,2a
|
|
||||||
XCODE_APP: /Applications/Xcode_10.3.app
|
|
||||||
Xcode_10_2_1:
|
|
||||||
B2_TOOLSET: clang
|
|
||||||
B2_CXXSTD: 11,14,17,2a
|
|
||||||
XCODE_APP: /Applications/Xcode_10.2.1.app
|
|
||||||
Xcode_10_2:
|
|
||||||
B2_TOOLSET: clang
|
|
||||||
B2_CXXSTD: 11,14,17,2a
|
|
||||||
XCODE_APP: /Applications/Xcode_10.2.app
|
|
||||||
Xcode_10_1:
|
|
||||||
B2_TOOLSET: clang
|
|
||||||
B2_CXXSTD: 11,14,17,2a
|
|
||||||
XCODE_APP: /Applications/Xcode_10.1.app
|
|
||||||
Xcode_10_0:
|
|
||||||
B2_TOOLSET: clang
|
|
||||||
B2_CXXSTD: 11,14,17,2a
|
|
||||||
XCODE_APP: /Applications/Xcode_10.app
|
|
||||||
steps:
|
|
||||||
- bash: |
|
|
||||||
set -e
|
|
||||||
git clone --branch master https://github.com/boostorg/boost-ci.git boost-ci-cloned
|
|
||||||
cp -prf boost-ci-cloned/ci .
|
|
||||||
rm -rf boost-ci-cloned
|
|
||||||
source ci/azure-pipelines/install.sh
|
|
||||||
displayName: Install
|
|
||||||
- bash: |
|
|
||||||
set -e
|
|
||||||
echo "SELF=$SELF"
|
|
||||||
echo "BOOST_ROOT=$BOOST_ROOT"
|
|
||||||
cd $BOOST_ROOT/libs/$SELF
|
|
||||||
ci/azure-pipelines/build.sh
|
|
||||||
displayName: 'Build'
|
|
||||||
25
.codecov.yml
Normal file
25
.codecov.yml
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
# Copyright 2019 - 2021 Alexander Grund
|
||||||
|
# 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)
|
||||||
|
#
|
||||||
|
# Sample codecov configuration file. Edit as required
|
||||||
|
|
||||||
|
codecov:
|
||||||
|
max_report_age: off
|
||||||
|
require_ci_to_pass: yes
|
||||||
|
notify:
|
||||||
|
# Increase this if you have multiple coverage collection jobs
|
||||||
|
after_n_builds: 1
|
||||||
|
wait_for_ci: yes
|
||||||
|
|
||||||
|
# Change how pull request comments look
|
||||||
|
comment:
|
||||||
|
layout: "reach,diff,flags,files,footer"
|
||||||
|
|
||||||
|
# Ignore specific files or folders. Glob patterns are supported.
|
||||||
|
# See https://docs.codecov.com/docs/ignoring-paths
|
||||||
|
ignore:
|
||||||
|
- extra/*
|
||||||
|
- extra/**/*
|
||||||
|
- test/*
|
||||||
|
- test/**/*
|
||||||
117
.drone.star
Normal file
117
.drone.star
Normal file
@@ -0,0 +1,117 @@
|
|||||||
|
# Use, modification, and distribution are
|
||||||
|
# subject to the Boost Software License, Version 1.0. (See accompanying
|
||||||
|
# file LICENSE.txt)
|
||||||
|
#
|
||||||
|
# Copyright (c) 2020 Rene Rivera
|
||||||
|
# Copyright (c) 2022 Alan de Freitas
|
||||||
|
# Copyright (c) 2022-2025 Alexander Grund
|
||||||
|
|
||||||
|
# For Drone CI we use the Starlark scripting language to reduce duplication.
|
||||||
|
# As the yaml syntax for Drone CI is rather limited.
|
||||||
|
|
||||||
|
# Base environment for all jobs
|
||||||
|
globalenv={'B2_VARIANT': 'release'}
|
||||||
|
|
||||||
|
# Wrapper function to apply the globalenv to all jobs
|
||||||
|
def job(
|
||||||
|
# job specific environment options
|
||||||
|
env={},
|
||||||
|
**kwargs):
|
||||||
|
real_env = dict(globalenv)
|
||||||
|
real_env.update(env)
|
||||||
|
return job_impl(env=real_env, **kwargs)
|
||||||
|
|
||||||
|
def main(ctx):
|
||||||
|
return [
|
||||||
|
job(compiler='clang-3.8', cxxstd='11,14', os='ubuntu-16.04'),
|
||||||
|
job(compiler='clang-3.9', cxxstd='11,14', os='ubuntu-18.04'),
|
||||||
|
job(compiler='clang-4.0', cxxstd='11,14', os='ubuntu-18.04'),
|
||||||
|
job(compiler='clang-5.0', cxxstd='11,14,1z', os='ubuntu-18.04'),
|
||||||
|
job(compiler='clang-6.0', cxxstd='11,14,17', os='ubuntu-18.04'),
|
||||||
|
job(compiler='clang-7', cxxstd='11,14,17', os='ubuntu-18.04'),
|
||||||
|
job(compiler='clang-8', cxxstd='11,14,17,2a', os='ubuntu-18.04'),
|
||||||
|
job(compiler='clang-9', cxxstd='11,14,17,2a', os='ubuntu-18.04'),
|
||||||
|
job(compiler='clang-10', cxxstd='11,14,17,2a', os='ubuntu-18.04'),
|
||||||
|
job(compiler='clang-11', cxxstd='11,14,17,2a', os='ubuntu-22.04'),
|
||||||
|
job(compiler='clang-12', cxxstd='11,14,17,20', os='ubuntu-22.04'),
|
||||||
|
job(compiler='clang-13', cxxstd='11,14,17,20,2b', os='ubuntu-22.04'),
|
||||||
|
job(compiler='clang-14', cxxstd='11,14,17,20,2b', os='ubuntu-22.04'),
|
||||||
|
job(compiler='clang-15', cxxstd='11,14,17,20,2b', os='ubuntu-22.04', add_llvm=True,
|
||||||
|
env={'B2_CXXFLAGS': '-Werror'}),
|
||||||
|
job(name='Clang 15 standalone', compiler='clang-15', cxxstd='17,20,2b', os='ubuntu-22.04', add_llvm=True,
|
||||||
|
env={'B2_CXXFLAGS': '-Werror', 'B2_DEFINES': 'BOOST_STATIC_STRING_STANDALONE'}),
|
||||||
|
|
||||||
|
job(compiler='gcc-4.8', cxxstd='11', os='ubuntu-16.04'),
|
||||||
|
job(compiler='gcc-4.9', cxxstd='11', os='ubuntu-16.04'),
|
||||||
|
job(compiler='gcc-5', cxxstd='11,14,1z', os='ubuntu-18.04'),
|
||||||
|
job(compiler='gcc-6', cxxstd='11,14,1z', os='ubuntu-18.04'),
|
||||||
|
job(compiler='gcc-7', cxxstd='11,14,1z', os='ubuntu-18.04'),
|
||||||
|
job(compiler='gcc-8', cxxstd='11,14,17,2a', os='ubuntu-18.04'),
|
||||||
|
job(compiler='gcc-9', cxxstd='11,14,17,2a', os='ubuntu-18.04'),
|
||||||
|
job(compiler='gcc-10', cxxstd='11,14,17,20', os='ubuntu-22.04'),
|
||||||
|
job(compiler='gcc-11', cxxstd='11,14,17,20,2b', os='ubuntu-22.04'),
|
||||||
|
job(compiler='gcc-12', cxxstd='11,14,17,20,2b', os='ubuntu-22.04'),
|
||||||
|
|
||||||
|
job(name='Coverage', buildtype='codecov', buildscript='codecov_coveralls', env={'LCOV_BRANCH_COVERAGE': 1, "COVERALLS_REPO_TOKEN": {"from_secret": "coveralls_repo_token"}},
|
||||||
|
compiler='gcc-8', cxxstd='11,14,17,2a', os='ubuntu-18.04'),
|
||||||
|
# Sanitizers
|
||||||
|
job(name='ASAN', asan=True,
|
||||||
|
compiler='gcc-12', cxxstd='11,14,17,20', os='ubuntu-22.04'),
|
||||||
|
job(name='UBSAN', ubsan=True,
|
||||||
|
compiler='gcc-12', cxxstd='11,14,17,20', os='ubuntu-22.04'),
|
||||||
|
job(name='TSAN', tsan=True,
|
||||||
|
compiler='gcc-12', cxxstd='11,14,17,20', os='ubuntu-22.04'),
|
||||||
|
job(name='Clang 14 w/ sanitizers', asan=True, ubsan=True,
|
||||||
|
compiler='clang-14', cxxstd='11,14,17,20', os='ubuntu-22.04'),
|
||||||
|
job(name='Clang 11 libc++ w/ sanitizers', asan=True, ubsan=True, # libc++-11 is the latest working with ASAN: https://github.com/llvm/llvm-project/issues/59432
|
||||||
|
compiler='clang-11', cxxstd='11,14,17,20', os='ubuntu-20.04', stdlib='libc++', install='libc++-11-dev libc++abi-11-dev'),
|
||||||
|
job(name='Valgrind', valgrind=True,
|
||||||
|
compiler='clang-6.0', cxxstd='11,14,1z', os='ubuntu-18.04', install='libc6-dbg libc++-dev libstdc++-8-dev'),
|
||||||
|
|
||||||
|
# libc++
|
||||||
|
job(compiler='clang-6.0', cxxstd='11,14,17,2a', os='ubuntu-18.04', stdlib='libc++', install='libc++-dev libc++abi-dev'),
|
||||||
|
job(compiler='clang-7', cxxstd='11,14,17,2a', os='ubuntu-20.04', stdlib='libc++', install='libc++-7-dev libc++abi-7-dev'),
|
||||||
|
job(compiler='clang-8', cxxstd='11,14,17,2a', os='ubuntu-20.04', stdlib='libc++', install='libc++-8-dev libc++abi-8-dev'),
|
||||||
|
job(compiler='clang-9', cxxstd='11,14,17,2a', os='ubuntu-20.04', stdlib='libc++', install='libc++-9-dev libc++abi-9-dev'),
|
||||||
|
job(compiler='clang-10', cxxstd='11,14,17,20', os='ubuntu-20.04', stdlib='libc++', install='libc++-10-dev libc++abi-10-dev'),
|
||||||
|
job(compiler='clang-11', cxxstd='11,14,17,20', os='ubuntu-20.04', stdlib='libc++', install='libc++-11-dev libc++abi-11-dev'),
|
||||||
|
job(compiler='clang-12', cxxstd='11,14,17,20', os='ubuntu-22.04', stdlib='libc++', install='libc++-12-dev libc++abi-12-dev libunwind-12-dev'),
|
||||||
|
job(compiler='clang-13', cxxstd='11,14,17,20', os='ubuntu-22.04', stdlib='libc++', install='libc++-13-dev libc++abi-13-dev'),
|
||||||
|
job(compiler='clang-14', cxxstd='11,14,17,20', os='ubuntu-22.04', stdlib='libc++', install='libc++-14-dev libc++abi-14-dev'),
|
||||||
|
job(compiler='clang-15', cxxstd='11,14,17,20', os='ubuntu-22.04', stdlib='libc++', install='libc++-15-dev libc++abi-15-dev', add_llvm=True),
|
||||||
|
|
||||||
|
# FreeBSD
|
||||||
|
job(compiler='clang-10', cxxstd='11,14,17,20', os='freebsd-13.1'),
|
||||||
|
job(compiler='clang-15', cxxstd='11,14,17,20', os='freebsd-13.1'),
|
||||||
|
job(compiler='gcc-11', cxxstd='11,14,17,20', os='freebsd-13.1', linkflags='-Wl,-rpath=/usr/local/lib/gcc11'),
|
||||||
|
# OSX
|
||||||
|
job(compiler='clang', cxxstd='11,14,17,2a', os='osx-xcode-10.1'),
|
||||||
|
job(compiler='clang', cxxstd='11,14,17,2a', os='osx-xcode-10.3'),
|
||||||
|
job(compiler='clang', cxxstd='11,14,17,2a', os='osx-xcode-11.1'),
|
||||||
|
job(compiler='clang', cxxstd='11,14,17,2a', os='osx-xcode-11.7'),
|
||||||
|
job(compiler='clang', cxxstd='11,14,17,2a', os='osx-xcode-12'),
|
||||||
|
job(compiler='clang', cxxstd='11,14,17,20', os='osx-xcode-12.5.1'),
|
||||||
|
job(compiler='clang', cxxstd='11,14,17,20', os='osx-xcode-13.0'),
|
||||||
|
job(compiler='clang', cxxstd='11,14,17,20', os='osx-xcode-13.4.1'),
|
||||||
|
job(compiler='clang', cxxstd='11,14,17,20,2b', os='osx-xcode-14.0'),
|
||||||
|
job(compiler='clang', cxxstd='11,14,17,20,2b', os='osx-xcode-14.3.1'),
|
||||||
|
job(compiler='clang', cxxstd='11,14,17,20,2b', os='osx-xcode-15.0.1'),
|
||||||
|
# ARM64
|
||||||
|
job(compiler='clang-12', cxxstd='11,14,17,20', os='ubuntu-20.04', arch='arm64', add_llvm=True),
|
||||||
|
job(compiler='gcc-11', cxxstd='11,14,17,20', os='ubuntu-20.04', arch='arm64'),
|
||||||
|
# S390x
|
||||||
|
job(compiler='clang-12', cxxstd='11,14,17,20', os='ubuntu-20.04', arch='s390x', add_llvm=True),
|
||||||
|
job(compiler='gcc-11', cxxstd='11,14,17,20', os='ubuntu-20.04', arch='s390x'),
|
||||||
|
# Windows
|
||||||
|
job(compiler='msvc-14.0', cxxstd=None, os='windows', env={'B2_DONT_EMBED_MANIFEST': 1}),
|
||||||
|
job(compiler='msvc-14.1', cxxstd=None, os='windows'),
|
||||||
|
job(compiler='msvc-14.2', cxxstd=None, os='windows'),
|
||||||
|
job(compiler='msvc-14.3', cxxstd=None, os='windows'),
|
||||||
|
job(compiler='msvc-14.0', cxxstd='14,17,20', os='windows', env={'B2_DONT_EMBED_MANIFEST': 1}),
|
||||||
|
job(compiler='msvc-14.1', cxxstd='14,17,20', os='windows'),
|
||||||
|
job(compiler='msvc-14.2', cxxstd='14,17,20', os='windows'),
|
||||||
|
job(compiler='msvc-14.3', cxxstd='14,17,20,latest', os='windows'),
|
||||||
|
]
|
||||||
|
|
||||||
|
# from https://github.com/boostorg/boost-ci
|
||||||
|
load("@boost_ci//ci/drone/:functions.star", "linux_cxx", "windows_cxx", "osx_cxx", "freebsd_cxx", "job_impl")
|
||||||
28
.drone/codecov_coveralls.sh
Normal file
28
.drone/codecov_coveralls.sh
Normal file
@@ -0,0 +1,28 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# Copyright 2020 Rene Rivera, Sam Darwin
|
||||||
|
# Copyright 2025 Alexander Grund
|
||||||
|
# Distributed under the Boost Software License, Version 1.0.
|
||||||
|
# (See accompanying file LICENSE.txt or copy at http://boost.org/LICENSE_1_0.txt)
|
||||||
|
|
||||||
|
|
||||||
|
set -xe
|
||||||
|
|
||||||
|
# Run the regular Boost CI script which does the test & upload to codecov.io
|
||||||
|
wget https://github.com/boostorg/boost-ci/raw/refs/heads/master/.drone/drone.sh
|
||||||
|
. drone.sh
|
||||||
|
|
||||||
|
# coveralls
|
||||||
|
# uses multiple lcov steps from boost-ci codecov.sh script
|
||||||
|
if [ -n "${COVERALLS_REPO_TOKEN}" ]; then
|
||||||
|
echo "processing coveralls"
|
||||||
|
pip3 install --user cpp-coveralls
|
||||||
|
cd "$BOOST_CI_SRC_FOLDER"
|
||||||
|
|
||||||
|
export PATH=/tmp/lcov/bin:$PATH
|
||||||
|
command -v lcov
|
||||||
|
lcov --version
|
||||||
|
|
||||||
|
lcov --remove coverage.info -o coverage_filtered.info '*/test/*' '*/extra/*'
|
||||||
|
cpp-coveralls --verbose -l coverage_filtered.info
|
||||||
|
fi
|
||||||
50
.github/workflows/ci.yml
vendored
Normal file
50
.github/workflows/ci.yml
vendored
Normal file
@@ -0,0 +1,50 @@
|
|||||||
|
#
|
||||||
|
# Copyright 2020-2021 Peter Dimov
|
||||||
|
# Copyright 2021 Andrey Semashev
|
||||||
|
# Copyright 2021-2025 Alexander Grund
|
||||||
|
# Copyright 2022-2025 James E. King III
|
||||||
|
#
|
||||||
|
# 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)
|
||||||
|
#
|
||||||
|
# This workflow uses the Boost.CI reusable workflow which builds a variety of
|
||||||
|
# configurations of your project, runs tests, and generates code coverage reports.
|
||||||
|
#
|
||||||
|
# To use it, copy this file into your repository as `.github/workflows/ci.yml` and
|
||||||
|
# customize it appropriately.
|
||||||
|
#
|
||||||
|
---
|
||||||
|
name: CI
|
||||||
|
|
||||||
|
on:
|
||||||
|
pull_request:
|
||||||
|
push:
|
||||||
|
branches:
|
||||||
|
- master
|
||||||
|
- develop
|
||||||
|
- bugfix/**
|
||||||
|
- feature/**
|
||||||
|
- fix/**
|
||||||
|
- github/**
|
||||||
|
- pr/**
|
||||||
|
paths-ignore:
|
||||||
|
- LICENSE
|
||||||
|
- meta/**
|
||||||
|
- README.md
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
call-boost-ci:
|
||||||
|
name: Run Boost.CI
|
||||||
|
uses: boostorg/boost-ci/.github/workflows/reusable.yml@master
|
||||||
|
with:
|
||||||
|
exclude_cxxstd: '98,03,0x'
|
||||||
|
enable_pr_coverage: false
|
||||||
|
enable_multiarch: false
|
||||||
|
# Example of customization:
|
||||||
|
# with:
|
||||||
|
# enable_reflection: true
|
||||||
|
# enable_windows: false
|
||||||
|
# secrets:
|
||||||
|
# CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }}
|
||||||
|
# COVERITY_SCAN_NOTIFICATION_EMAIL: ${{ secrets.COVERITY_SCAN_NOTIFICATION_EMAIL }}
|
||||||
|
# COVERITY_SCAN_TOKEN: ${{ secrets.COVERITY_SCAN_TOKEN }}
|
||||||
156
.github/workflows/example.yml
vendored
Normal file
156
.github/workflows/example.yml
vendored
Normal file
@@ -0,0 +1,156 @@
|
|||||||
|
#
|
||||||
|
# Copyright (c) 2025 Gennaro Prota (gennaro dot prota at gmail dot com)
|
||||||
|
#
|
||||||
|
# Distributed under the Boost Software License, Version 1.0. (See accompanying
|
||||||
|
# file LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt)
|
||||||
|
#
|
||||||
|
# Official repository: https://github.com/boostorg/static_string
|
||||||
|
#
|
||||||
|
|
||||||
|
name: Example (basic_static_cstring)
|
||||||
|
|
||||||
|
on:
|
||||||
|
pull_request:
|
||||||
|
push:
|
||||||
|
branches:
|
||||||
|
- master
|
||||||
|
- develop
|
||||||
|
- bugfix/**
|
||||||
|
- feature/**
|
||||||
|
- fix/**
|
||||||
|
- github/**
|
||||||
|
- pr/**
|
||||||
|
paths-ignore:
|
||||||
|
- LICENSE
|
||||||
|
- meta/**
|
||||||
|
- README.md
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
linux:
|
||||||
|
runs-on: ubuntu-24.04
|
||||||
|
strategy:
|
||||||
|
fail-fast: false
|
||||||
|
matrix:
|
||||||
|
include:
|
||||||
|
- { toolset: gcc-13, cxxstd: '20,23' }
|
||||||
|
- { toolset: gcc-14, cxxstd: '20,23,26' }
|
||||||
|
- { toolset: clang-17, cxxstd: '20,23' }
|
||||||
|
- { toolset: clang-18, cxxstd: '20,23,26' }
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: Checkout Boost super-project
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
with:
|
||||||
|
repository: boostorg/boost
|
||||||
|
ref: develop
|
||||||
|
fetch-depth: 0
|
||||||
|
|
||||||
|
- name: Checkout this library
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
with:
|
||||||
|
path: libs/static_string
|
||||||
|
fetch-depth: 0
|
||||||
|
|
||||||
|
- name: Initialize Boost submodules
|
||||||
|
run: |
|
||||||
|
git submodule update --init tools/boostdep
|
||||||
|
python tools/boostdep/depinst/depinst.py --git_args '--jobs 4' static_string
|
||||||
|
|
||||||
|
- name: Bootstrap b2
|
||||||
|
run: ./bootstrap.sh
|
||||||
|
|
||||||
|
- name: Generate Boost headers
|
||||||
|
run: ./b2 headers
|
||||||
|
|
||||||
|
- name: Build and run example tests
|
||||||
|
run: |
|
||||||
|
./b2 libs/static_string/example/static_cstring \
|
||||||
|
toolset=${{ matrix.toolset }} \
|
||||||
|
cxxstd=${{ matrix.cxxstd }} \
|
||||||
|
variant=debug,release \
|
||||||
|
-j$(nproc)
|
||||||
|
|
||||||
|
macos:
|
||||||
|
runs-on: macos-14
|
||||||
|
strategy:
|
||||||
|
fail-fast: false
|
||||||
|
matrix:
|
||||||
|
include:
|
||||||
|
- { toolset: clang, cxxstd: '20,23' }
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: Checkout Boost super-project
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
with:
|
||||||
|
repository: boostorg/boost
|
||||||
|
ref: develop
|
||||||
|
fetch-depth: 0
|
||||||
|
|
||||||
|
- name: Checkout this library
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
with:
|
||||||
|
path: libs/static_string
|
||||||
|
fetch-depth: 0
|
||||||
|
|
||||||
|
- name: Initialize Boost submodules
|
||||||
|
run: |
|
||||||
|
git submodule update --init tools/boostdep
|
||||||
|
python3 tools/boostdep/depinst/depinst.py --git_args '--jobs 4' static_string
|
||||||
|
|
||||||
|
- name: Bootstrap b2
|
||||||
|
run: ./bootstrap.sh
|
||||||
|
|
||||||
|
- name: Generate Boost headers
|
||||||
|
run: ./b2 headers
|
||||||
|
|
||||||
|
- name: Build and run example tests
|
||||||
|
run: |
|
||||||
|
./b2 libs/static_string/example/static_cstring \
|
||||||
|
toolset=${{ matrix.toolset }} \
|
||||||
|
cxxstd=${{ matrix.cxxstd }} \
|
||||||
|
variant=debug,release \
|
||||||
|
-j$(sysctl -n hw.ncpu)
|
||||||
|
|
||||||
|
windows:
|
||||||
|
runs-on: windows-2022
|
||||||
|
strategy:
|
||||||
|
fail-fast: false
|
||||||
|
matrix:
|
||||||
|
include:
|
||||||
|
- { toolset: msvc-14.3, cxxstd: '20,latest' }
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: Checkout Boost super-project
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
with:
|
||||||
|
repository: boostorg/boost
|
||||||
|
ref: develop
|
||||||
|
fetch-depth: 0
|
||||||
|
|
||||||
|
- name: Checkout this library
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
with:
|
||||||
|
path: libs/static_string
|
||||||
|
fetch-depth: 0
|
||||||
|
|
||||||
|
- name: Initialize Boost submodules
|
||||||
|
run: |
|
||||||
|
git submodule update --init tools/boostdep
|
||||||
|
python tools/boostdep/depinst/depinst.py --git_args '--jobs 4' static_string
|
||||||
|
|
||||||
|
- name: Bootstrap b2
|
||||||
|
run: .\bootstrap.bat
|
||||||
|
shell: cmd
|
||||||
|
|
||||||
|
- name: Generate Boost headers
|
||||||
|
run: .\b2 headers
|
||||||
|
shell: cmd
|
||||||
|
|
||||||
|
- name: Build and run example tests
|
||||||
|
run: |
|
||||||
|
.\b2 libs/static_string/example/static_cstring ^
|
||||||
|
toolset=${{ matrix.toolset }} ^
|
||||||
|
cxxstd=${{ matrix.cxxstd }} ^
|
||||||
|
variant=debug,release ^
|
||||||
|
address-model=64
|
||||||
|
shell: cmd
|
||||||
7
.gitignore
vendored
7
.gitignore
vendored
@@ -1,8 +1,15 @@
|
|||||||
bin/
|
bin/
|
||||||
bin64/
|
bin64/
|
||||||
|
build/
|
||||||
|
|
||||||
# Because of CMake and VS2017
|
# Because of CMake and VS2017
|
||||||
Win32/
|
Win32/
|
||||||
x64/
|
x64/
|
||||||
.vs/
|
.vs/
|
||||||
out/
|
out/
|
||||||
|
|
||||||
|
# VS CMake settings
|
||||||
|
/CMakeSettings.json
|
||||||
|
# CMake presets
|
||||||
|
/CMakePresets.json
|
||||||
|
/CMakeUserPresets.json
|
||||||
|
|||||||
275
.travis.yml
275
.travis.yml
@@ -1,275 +0,0 @@
|
|||||||
# Copyright 2016 Peter Dimov
|
|
||||||
# Copyright 2017 - 2019 James E. King III
|
|
||||||
# Copyright 2020 Krystian Stasiowski
|
|
||||||
# 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)
|
|
||||||
|
|
||||||
#
|
|
||||||
# Generic Travis CI build script for boostorg repositories
|
|
||||||
# See: https://github.com/boostorg/boost-ci
|
|
||||||
#
|
|
||||||
# Instructions for customizing this script for your library:
|
|
||||||
#
|
|
||||||
# 1. Customize the compilers and language levels you want in the 'jobs'.
|
|
||||||
# 2. If you have more than include/, src/, test/, example/, examples/, or
|
|
||||||
# tools/ directories, modify your Travis CI project and add the environment
|
|
||||||
# variable DEPINST. For example if your build uses code in "bench/" and
|
|
||||||
# "fog/" directories, then set DEPINST to the following:
|
|
||||||
# --include bench --include fog
|
|
||||||
# 3. If you want to enable Coverity Scan, you need to provide the environment
|
|
||||||
# variables COVERITY_SCAN_TOKEN and COVERITY_SCAN_NOTIFICATION_EMAIL in
|
|
||||||
# your github settings.
|
|
||||||
# 4. If you want to enable a big-endian build, you need to uncomment the
|
|
||||||
# big-endian build job.
|
|
||||||
# 5. Enable pull request builds in your boostorg/<library> account.
|
|
||||||
#
|
|
||||||
# That's it - the scripts will do everything else for you.
|
|
||||||
|
|
||||||
dist: xenial
|
|
||||||
language: cpp
|
|
||||||
|
|
||||||
env:
|
|
||||||
global:
|
|
||||||
# see: http://www.boost.org/build/doc/html/bbv2/overview/invocation.html#bbv2.overview.invocation.properties
|
|
||||||
# - B2_ADDRESS_MODEL=address-model=64,32
|
|
||||||
# - B2_LINK=link=shared,static
|
|
||||||
# - B2_THREADING=threading=multi,single
|
|
||||||
- B2_VARIANT=variant=release
|
|
||||||
|
|
||||||
install:
|
|
||||||
- git clone https://github.com/boostorg/boost-ci.git boost-ci
|
|
||||||
- cp -pr boost-ci/ci boost-ci/.codecov.yml .
|
|
||||||
- source ci/travis/install.sh
|
|
||||||
|
|
||||||
addons:
|
|
||||||
apt:
|
|
||||||
packages:
|
|
||||||
- binutils-gold
|
|
||||||
- gdb
|
|
||||||
- libc6-dbg
|
|
||||||
- qemu-user-static
|
|
||||||
|
|
||||||
services:
|
|
||||||
- docker
|
|
||||||
|
|
||||||
branches:
|
|
||||||
only:
|
|
||||||
- master
|
|
||||||
- develop
|
|
||||||
- /bugfix\/.*/
|
|
||||||
- /feature\/.*/
|
|
||||||
- /fix\/.*/
|
|
||||||
- /pr\/.*/
|
|
||||||
|
|
||||||
script:
|
|
||||||
- cd $BOOST_ROOT/libs/$SELF
|
|
||||||
- ci/travis/build.sh
|
|
||||||
|
|
||||||
#
|
|
||||||
# Default toolsets in Ubuntu
|
|
||||||
#
|
|
||||||
# trusty xenial bionic
|
|
||||||
# 14.04 16.04 18.04
|
|
||||||
# ------ ------ ------
|
|
||||||
# clang 3.4 3.8 6.0
|
|
||||||
# gcc 4.8.2 5.3.1 7.3.0
|
|
||||||
#
|
|
||||||
|
|
||||||
anchors:
|
|
||||||
clang-38: &clang-38 { apt: { packages: [ "clang-3.8",
|
|
||||||
"libstdc++-6-dev" ], sources: [ "llvm-toolchain-xenial-3.8",
|
|
||||||
"ubuntu-toolchain-r-test" ] } }
|
|
||||||
clang-4: &clang-4 { apt: { packages: [ "clang-4.0",
|
|
||||||
"libstdc++-6-dev" ], sources: [ "llvm-toolchain-xenial-4.0",
|
|
||||||
"ubuntu-toolchain-r-test" ] } }
|
|
||||||
clang-5: &clang-5 { apt: { packages: [ "clang-5.0",
|
|
||||||
"libstdc++-7-dev" ], sources: [ "llvm-toolchain-xenial-5.0",
|
|
||||||
"ubuntu-toolchain-r-test" ] } }
|
|
||||||
clang-6: &clang-6 { apt: { packages: [ "clang-6.0",
|
|
||||||
"libc6-dbg",
|
|
||||||
"libc++-dev",
|
|
||||||
"libstdc++-8-dev" ], sources: [ "llvm-toolchain-xenial-6.0",
|
|
||||||
"ubuntu-toolchain-r-test" ] } }
|
|
||||||
clang-7: &clang-7 { apt: { packages: [ "clang-7",
|
|
||||||
"libc6-dbg",
|
|
||||||
"libc++-dev",
|
|
||||||
"libstdc++-8-dev" ], sources: [ "llvm-toolchain-xenial-7",
|
|
||||||
"ubuntu-toolchain-r-test" ] } }
|
|
||||||
clang-8: &clang-8 { apt: { packages: [ "clang-8",
|
|
||||||
"libc6-dbg",
|
|
||||||
"libc++-dev",
|
|
||||||
"libstdc++-8-dev" ], sources: [ "llvm-toolchain-xenial-8",
|
|
||||||
"ubuntu-toolchain-r-test" ] } }
|
|
||||||
|
|
||||||
gcc-48: &gcc-48 { apt: { packages: [ "g++-4.8" ] } }
|
|
||||||
gcc-49: &gcc-49 { apt: { packages: [ "g++-4.9" ], sources: [ "ubuntu-toolchain-r-test" ] } }
|
|
||||||
gcc-5: &gcc-5 { apt: { packages: [ "g++-5" ] } }
|
|
||||||
gcc-6: &gcc-6 { apt: { packages: [ "g++-6" ], sources: [ "ubuntu-toolchain-r-test" ] } }
|
|
||||||
gcc-7: &gcc-7 { apt: { packages: [ "g++-7" ], sources: [ "ubuntu-toolchain-r-test" ] } }
|
|
||||||
gcc-8: &gcc-8 { apt: { packages: [ "g++-8" ], sources: [ "ubuntu-toolchain-r-test" ] } }
|
|
||||||
gcc-9: &gcc-9 { apt: { packages: [ "g++-9" ], sources: [ "ubuntu-toolchain-r-test" ] } }
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
allow_failures:
|
|
||||||
- env:
|
|
||||||
- COPY="all the environment settings from your job"
|
|
||||||
|
|
||||||
include:
|
|
||||||
# coverage
|
|
||||||
- os: linux
|
|
||||||
env:
|
|
||||||
- COMMENT=codecov.io
|
|
||||||
- B2_CXXSTD=11
|
|
||||||
- B2_TOOLSET=gcc-8
|
|
||||||
- B2_DEFINES="define=BOOST_NO_STRESS_TEST=1"
|
|
||||||
addons: *gcc-8
|
|
||||||
script:
|
|
||||||
- cd $BOOST_ROOT/libs/$SELF
|
|
||||||
- tools/codecov.sh
|
|
||||||
|
|
||||||
- os: linux
|
|
||||||
env:
|
|
||||||
- COMMENT=asan
|
|
||||||
- B2_VARIANT=variant=debug
|
|
||||||
- B2_TOOLSET=gcc-8
|
|
||||||
- B2_CXXSTD=11,14
|
|
||||||
- B2_CXXFLAGS="address-sanitizer=norecover"
|
|
||||||
- B2_DEFINES="define=BOOST_NO_STRESS_TEST=1"
|
|
||||||
addons: *gcc-8
|
|
||||||
|
|
||||||
- os: linux
|
|
||||||
env:
|
|
||||||
- COMMENT=tsan
|
|
||||||
- B2_VARIANT=variant=debug
|
|
||||||
- B2_TOOLSET=gcc-8
|
|
||||||
- B2_CXXSTD=11,14
|
|
||||||
- B2_CXXFLAGS="thread-sanitizer=norecover"
|
|
||||||
- B2_DEFINES="define=BOOST_NO_STRESS_TEST=1"
|
|
||||||
addons: *gcc-8
|
|
||||||
|
|
||||||
- os: linux
|
|
||||||
env:
|
|
||||||
- COMMENT=ubsan
|
|
||||||
- B2_VARIANT=variant=debug
|
|
||||||
- B2_TOOLSET=gcc-8
|
|
||||||
- B2_CXXSTD=11,14
|
|
||||||
- B2_CXXFLAGS="undefined-sanitizer=norecover"
|
|
||||||
- B2_DEFINES="define=BOOST_NO_STRESS_TEST=1"
|
|
||||||
- B2_LINKFLAGS="linkflags=-fuse-ld=gold"
|
|
||||||
- UBSAN_OPTIONS=print_stacktrace=1
|
|
||||||
addons: *gcc-8
|
|
||||||
|
|
||||||
- os: linux
|
|
||||||
env:
|
|
||||||
- COMMENT=valgrind
|
|
||||||
- B2_TOOLSET=clang-6.0
|
|
||||||
- B2_CXXSTD=11,14
|
|
||||||
- B2_DEFINES="define=BOOST_NO_STRESS_TEST=1"
|
|
||||||
- B2_VARIANT=variant=debug
|
|
||||||
- B2_TESTFLAGS=testing.launcher=valgrind
|
|
||||||
- VALGRIND_OPTS=--error-exitcode=1
|
|
||||||
addons: *clang-6
|
|
||||||
script:
|
|
||||||
- cd $BOOST_ROOT/libs/$SELF
|
|
||||||
- ci/travis/valgrind.sh
|
|
||||||
|
|
||||||
# libstdc++
|
|
||||||
- { os: "linux", dist: "trusty", # xenial has libstdc++ from gcc 5.4.0 with newer ABI
|
|
||||||
env: [ "B2_TOOLSET=gcc-4.8", "B2_CXXSTD=11" ], addons: *gcc-48 }
|
|
||||||
- { os: "linux", dist: "trusty", # xenial has libstdc++ from gcc 5.4.0 with newer ABI
|
|
||||||
env: [ "B2_TOOLSET=gcc-4.9", "B2_CXXSTD=11" ], addons: *gcc-49 }
|
|
||||||
- { os: "linux", env: [ "B2_TOOLSET=gcc-5", "B2_CXXSTD=11,14" ], addons: *gcc-5 }
|
|
||||||
- { os: "linux", env: [ "B2_TOOLSET=gcc-6", "B2_CXXSTD=11,14" ], addons: *gcc-6 }
|
|
||||||
- { os: "linux", env: [ "B2_TOOLSET=gcc-7", "B2_CXXSTD=14,17" ], addons: *gcc-7 }
|
|
||||||
- { os: "linux", env: [ "B2_TOOLSET=gcc-8", "B2_CXXSTD=17" ], addons: *gcc-8 }
|
|
||||||
- { os: "linux", env: [ "B2_TOOLSET=gcc-9", "B2_CXXSTD=17" ], addons: *gcc-9 }
|
|
||||||
- { os: "linux", dist: "trusty", # xenial has libstdc++ from gcc 5.4.0 with newer ABI
|
|
||||||
env: [ "B2_TOOLSET=clang-3.8", "B2_CXXSTD=11" ], addons: *clang-38 }
|
|
||||||
- { os: "linux", env: [ "B2_TOOLSET=clang-4.0", "B2_CXXSTD=11,14" ], addons: *clang-4 }
|
|
||||||
- { os: "linux", env: [ "B2_TOOLSET=clang-5.0", "B2_CXXSTD=11,14" ], addons: *clang-5 }
|
|
||||||
- { os: "linux", env: [ "B2_TOOLSET=clang-6.0", "B2_CXXSTD=14,17" ], addons: *clang-6 }
|
|
||||||
- { os: "linux", env: [ "B2_TOOLSET=clang-7", "B2_CXXSTD=17" ], addons: *clang-7 }
|
|
||||||
- { os: "linux", env: [ "B2_TOOLSET=clang-8", "B2_CXXSTD=17" ], addons: *clang-8 }
|
|
||||||
|
|
||||||
- os: "linux"
|
|
||||||
env: ["B2_TOOLSET=clang-9", "B2_CXXSTD=11,14,17"]
|
|
||||||
addons:
|
|
||||||
apt:
|
|
||||||
sources:
|
|
||||||
- ubuntu-toolchain-r-test
|
|
||||||
- sourceline: 'deb https://apt.llvm.org/xenial/ llvm-toolchain-xenial-9 main'
|
|
||||||
key_url: 'https://apt.llvm.org/llvm-snapshot.gpg.key'
|
|
||||||
packages:
|
|
||||||
- clang-9
|
|
||||||
- libc6-dbg
|
|
||||||
- libc++-dev
|
|
||||||
- libstdc++-8-dev
|
|
||||||
|
|
||||||
# libc++
|
|
||||||
- { os: "linux", env: [ "B2_TOOLSET=clang-6.0", "B2_CXXSTD=11,14",
|
|
||||||
"B2_CXXFLAGS=-stdlib=libc++" ], addons: *clang-6 }
|
|
||||||
- { os: "osx" , env: [ "B2_TOOLSET=clang", "B2_CXXSTD=11,17" ] }
|
|
||||||
|
|
||||||
# to enable Intel ICC define INTEL_ICC_SERIAL_NUMBER and the following (under development):
|
|
||||||
# - { os: "linux", env: [ "B2_TOOLSET=intel-linux", "B2_CXXSTD=11,14,17" ], addons: *gcc-7,
|
|
||||||
# script: cd $BOOST_ROOT/libs/$SELF && ci/travis/intelicc.sh }
|
|
||||||
|
|
||||||
# uncomment to enable a big-endian build job, just note that it is 5-10 times slower
|
|
||||||
# than a regular build and travis has a 50 minute time limit per job
|
|
||||||
# - os: linux
|
|
||||||
# env:
|
|
||||||
# - COMMENT=big-endian
|
|
||||||
# - B2_CXXSTD=03
|
|
||||||
# - B2_TOOLSET=gcc
|
|
||||||
# - B2_DEFINES="define=BOOST_NO_STRESS_TEST=1"
|
|
||||||
# - BDDE_OS=red
|
|
||||||
# - BDDE_ARCH=ppc64
|
|
||||||
# script:
|
|
||||||
# - cd $BOOST_ROOT/libs/$SELF
|
|
||||||
# - ci/travis/bdde.sh
|
|
||||||
|
|
||||||
# - os: linux
|
|
||||||
# env:
|
|
||||||
# - COMMENT=cppcheck
|
|
||||||
# script:
|
|
||||||
# - cd $BOOST_ROOT/libs/$SELF
|
|
||||||
# - ci/travis/cppcheck.sh
|
|
||||||
|
|
||||||
#################### Jobs to run on pushes to master, develop ###################
|
|
||||||
|
|
||||||
# Coverity Scan
|
|
||||||
- os: linux
|
|
||||||
if: (env(COVERITY_SCAN_NOTIFICATION_EMAIL) IS present) AND (branch IN (develop, master)) AND (type IN (cron, push))
|
|
||||||
env:
|
|
||||||
- COMMENT="Coverity Scan"
|
|
||||||
- B2_TOOLSET=clang
|
|
||||||
script:
|
|
||||||
- cd $BOOST_ROOT/libs/$SELF
|
|
||||||
- ci/travis/coverity.sh
|
|
||||||
|
|
||||||
# Standalone tests for StaticString
|
|
||||||
- { os: "linux", env: [ "COMMENT=STANDALONE", "B2_TOOLSET=gcc-7", "B2_DEFINES=define=BOOST_STATIC_STRING_STANDALONE", "B2_CXXSTD=17" ], addons: *gcc-7 }
|
|
||||||
- { os: "linux", env: [ "COMMENT=STANDALONE", "B2_TOOLSET=gcc-8", "B2_DEFINES=define=BOOST_STATIC_STRING_STANDALONE", "B2_CXXSTD=17" ], addons: *gcc-8 }
|
|
||||||
- { os: "linux", env: [ "COMMENT=STANDALONE", "B2_TOOLSET=gcc-9", "B2_DEFINES=define=BOOST_STATIC_STRING_STANDALONE", "B2_CXXSTD=17" ], addons: *gcc-9 }
|
|
||||||
- { os: "linux", env: [ "COMMENT=STANDALONE", "B2_TOOLSET=clang-6.0", "B2_DEFINES=define=BOOST_STATIC_STRING_STANDALONE", "B2_CXXSTD=17" ], addons: *clang-6 }
|
|
||||||
- { os: "linux", env: [ "COMMENT=STANDALONE", "B2_TOOLSET=clang-7", "B2_DEFINES=define=BOOST_STATIC_STRING_STANDALONE", "B2_CXXSTD=17" ], addons: *clang-7 }
|
|
||||||
- { os: "linux", env: [ "COMMENT=STANDALONE", "B2_TOOLSET=clang-8", "B2_DEFINES=define=BOOST_STATIC_STRING_STANDALONE", "B2_CXXSTD=17" ], addons: *clang-8 }
|
|
||||||
- os: "linux"
|
|
||||||
env: ["COMMENT=STANDALONE", "B2_TOOLSET=clang-9", "B2_DEFINES=define=BOOST_STATIC_STRING_STANDALONE", "B2_CXXSTD=17"]
|
|
||||||
addons:
|
|
||||||
apt:
|
|
||||||
sources:
|
|
||||||
- ubuntu-toolchain-r-test
|
|
||||||
- sourceline: 'deb https://apt.llvm.org/xenial/ llvm-toolchain-xenial-9 main'
|
|
||||||
key_url: 'https://apt.llvm.org/llvm-snapshot.gpg.key'
|
|
||||||
packages:
|
|
||||||
- clang-9
|
|
||||||
- libc6-dbg
|
|
||||||
- libc++-dev
|
|
||||||
- libstdc++-8-dev
|
|
||||||
|
|
||||||
- { os: "osx" , env: [ "COMMENT=STANDALONE", "B2_TOOLSET=clang", "B2_DEFINES=define=BOOST_STATIC_STRING_STANDALONE", "B2_CXXSTD=17" ] }
|
|
||||||
|
|
||||||
notifications:
|
|
||||||
email:
|
|
||||||
false
|
|
||||||
240
CMakeLists.txt
240
CMakeLists.txt
@@ -1,32 +1,5 @@
|
|||||||
# Generated by `boostdep --cmake static_string`
|
|
||||||
# Copyright 2020 Peter Dimov
|
|
||||||
# Distributed under the Boost Software License, Version 1.0.
|
|
||||||
# https://www.boost.org/LICENSE_1_0.txt
|
|
||||||
|
|
||||||
cmake_minimum_required(VERSION 3.5...3.16)
|
|
||||||
|
|
||||||
project(boost_static_string VERSION "${BOOST_SUPERPROJECT_VERSION}" LANGUAGES CXX)
|
|
||||||
|
|
||||||
if(NOT CMAKE_SOURCE_DIR STREQUAL CMAKE_CURRENT_SOURCE_DIR)
|
|
||||||
|
|
||||||
add_library(boost_static_string INTERFACE)
|
|
||||||
add_library(Boost::static_string ALIAS boost_static_string)
|
|
||||||
|
|
||||||
target_include_directories(boost_static_string INTERFACE include)
|
|
||||||
|
|
||||||
target_link_libraries(boost_static_string
|
|
||||||
INTERFACE
|
|
||||||
Boost::assert
|
|
||||||
Boost::container_hash
|
|
||||||
Boost::static_assert
|
|
||||||
Boost::throw_exception
|
|
||||||
Boost::utility
|
|
||||||
)
|
|
||||||
|
|
||||||
else()
|
|
||||||
|
|
||||||
#
|
#
|
||||||
# Copyright (c) 2016-2017 Vinnie Falco (vinnie dot falco at gmail dot com)
|
# Copyright (c) 2022 Alan de Freitas (alandefreitas@gmail.com)
|
||||||
#
|
#
|
||||||
# Distributed under the Boost Software License, Version 1.0. (See accompanying
|
# 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 LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
||||||
@@ -34,140 +7,111 @@ else()
|
|||||||
# Official repository: https://github.com/boostorg/static_string
|
# Official repository: https://github.com/boostorg/static_string
|
||||||
#
|
#
|
||||||
|
|
||||||
#-------------------------------------------------------------------------------
|
cmake_minimum_required(VERSION 3.8...3.16)
|
||||||
|
|
||||||
function (DoGroupSources curdir rootdir folder)
|
project(boost_static_string VERSION "${BOOST_SUPERPROJECT_VERSION}" LANGUAGES CXX)
|
||||||
file (GLOB children RELATIVE ${PROJECT_SOURCE_DIR}/${curdir} ${PROJECT_SOURCE_DIR}/${curdir}/*)
|
|
||||||
foreach (child ${children})
|
|
||||||
if (IS_DIRECTORY ${PROJECT_SOURCE_DIR}/${curdir}/${child})
|
|
||||||
DoGroupSources (${curdir}/${child} ${rootdir} ${folder})
|
|
||||||
elseif (${child} STREQUAL "CMakeLists.txt")
|
|
||||||
source_group("" FILES ${PROJECT_SOURCE_DIR}/${curdir}/${child})
|
|
||||||
else()
|
|
||||||
string (REGEX REPLACE ^${rootdir} ${folder} groupname ${curdir})
|
|
||||||
string (REPLACE "/" "\\" groupname ${groupname})
|
|
||||||
source_group (${groupname} FILES ${PROJECT_SOURCE_DIR}/${curdir}/${child})
|
|
||||||
endif()
|
|
||||||
endforeach()
|
|
||||||
endfunction()
|
|
||||||
|
|
||||||
function (GroupSources curdir folder)
|
set(BOOST_STATIC_STRING_IS_ROOT OFF)
|
||||||
DoGroupSources (${curdir} ${curdir} ${folder})
|
if (CMAKE_SOURCE_DIR STREQUAL CMAKE_CURRENT_SOURCE_DIR)
|
||||||
endfunction()
|
set(BOOST_STATIC_STRING_IS_ROOT ON)
|
||||||
|
endif ()
|
||||||
|
|
||||||
#-------------------------------------------------------------------------------
|
if (BOOST_STATIC_STRING_IS_ROOT)
|
||||||
#
|
include(CTest)
|
||||||
# StaticString
|
endif ()
|
||||||
#
|
|
||||||
#-------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
set_property (GLOBAL PROPERTY USE_FOLDERS ON)
|
# Options
|
||||||
|
if (NOT BOOST_SUPERPROJECT_VERSION)
|
||||||
|
option(BOOST_STATIC_STRING_INSTALL "Install boost::static_string files" ${BOOST_STATIC_STRING_IS_ROOT})
|
||||||
|
option(BOOST_STATIC_STRING_BUILD_TESTS "Build boost::static_string tests" OFF)
|
||||||
|
else ()
|
||||||
|
set(BOOST_STATIC_STRING_BUILD_TESTS ${BUILD_TESTING})
|
||||||
|
endif ()
|
||||||
|
|
||||||
if (MSVC)
|
# Find boost
|
||||||
set (CMAKE_VERBOSE_MAKEFILE FALSE)
|
if (BOOST_SUPERPROJECT_VERSION)
|
||||||
|
set(BOOST_STATIC_STRING_FIND_PACKAGE_BOOST OFF)
|
||||||
|
elseif (EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/../../CMakeLists.txt" AND
|
||||||
|
EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/../../Jamroot" AND
|
||||||
|
EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/../../boost-build.jam" AND
|
||||||
|
EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/../../bootstrap.sh" AND
|
||||||
|
EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/../../libs")
|
||||||
|
set(BOOST_STATIC_STRING_FIND_PACKAGE_BOOST OFF)
|
||||||
|
else ()
|
||||||
|
set(BOOST_STATIC_STRING_FIND_PACKAGE_BOOST ON)
|
||||||
|
endif ()
|
||||||
|
|
||||||
add_definitions (
|
if (BOOST_STATIC_STRING_FIND_PACKAGE_BOOST)
|
||||||
-D_WIN32_WINNT=0x0601
|
find_package(Boost 1.78.0 REQUIRED COMPONENTS container)
|
||||||
)
|
elseif (BOOST_STATIC_STRING_IS_ROOT)
|
||||||
|
set(BOOST_STATIC_STRING_UNIT_TEST_LIBRARIES core)
|
||||||
|
set(BOOST_INCLUDE_LIBRARIES static_string assert container_hash throw_exception utility ${BOOST_STATIC_STRING_UNIT_TEST_LIBRARIES})
|
||||||
|
set(BOOST_EXCLUDE_LIBRARIES static_string)
|
||||||
|
set(CMAKE_FOLDER Dependencies)
|
||||||
|
add_subdirectory(../.. Dependencies/boost EXCLUDE_FROM_ALL)
|
||||||
|
unset(CMAKE_FOLDER)
|
||||||
|
endif ()
|
||||||
|
|
||||||
add_compile_options(
|
# Sources
|
||||||
/permissive- # strict C++
|
include(GNUInstallDirs)
|
||||||
/W4 # enable all warnings
|
file(GLOB_RECURSE BOOST_STATIC_STRING_HEADERS CONFIGURE_DEPENDS
|
||||||
/MP # Multi-processor compilation
|
include/boost/*.hpp
|
||||||
|
include/boost/*.ipp
|
||||||
|
include/boost/*.natvis
|
||||||
)
|
)
|
||||||
|
|
||||||
set (Boost_USE_STATIC_LIBS ON)
|
set_property(GLOBAL PROPERTY USE_FOLDERS ON)
|
||||||
set (Boost_USE_STATIC_RUNTIME ON)
|
source_group(TREE ${CMAKE_CURRENT_SOURCE_DIR}/include/boost PREFIX "" FILES ${BOOST_STATIC_STRING_HEADERS})
|
||||||
|
source_group(TREE ${CMAKE_CURRENT_SOURCE_DIR}/src PREFIX "" FILES ${BOOST_STATIC_STRING_SOURCES})
|
||||||
|
|
||||||
set (CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /MTd")
|
# Target
|
||||||
set (CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /Ob2 /Oi /Ot /GL /MT")
|
add_library(boost_static_string INTERFACE)
|
||||||
set (CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_RELWITHDEBINFO} /Oi /Ot /MT")
|
add_library(Boost::static_string ALIAS boost_static_string)
|
||||||
|
|
||||||
set (CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /SAFESEH:NO")
|
target_compile_features(boost_static_string INTERFACE cxx_constexpr)
|
||||||
set (CMAKE_EXE_LINKER_FLAGS_RELEASE "${CMAKE_EXE_LINKER_FLAGS_RELEASE} /LTCG")
|
if (BOOST_SUPERPROJECT_VERSION)
|
||||||
|
target_include_directories(boost_static_string INTERFACE "${PROJECT_SOURCE_DIR}/include")
|
||||||
|
else ()
|
||||||
|
target_include_directories(boost_static_string
|
||||||
|
INTERFACE
|
||||||
|
"$<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}/include>"
|
||||||
|
"$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>"
|
||||||
|
)
|
||||||
|
endif ()
|
||||||
|
|
||||||
# for RelWithDebInfo builds, disable incremental linking
|
if (BOOST_STATIC_STRING_FIND_PACKAGE_BOOST)
|
||||||
# since CMake sets it ON by default for that build type and it
|
target_link_libraries(boost_static_string
|
||||||
# causes warnings
|
INTERFACE
|
||||||
#
|
Boost::headers
|
||||||
string (REPLACE "/INCREMENTAL" "/INCREMENTAL:NO" replacement_flags
|
)
|
||||||
${CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO})
|
else ()
|
||||||
set (CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO ${replacement_flags})
|
target_link_libraries(boost_static_string
|
||||||
|
INTERFACE
|
||||||
|
Boost::assert
|
||||||
|
Boost::container_hash
|
||||||
|
Boost::core
|
||||||
|
Boost::throw_exception
|
||||||
|
Boost::utility
|
||||||
|
)
|
||||||
|
endif ()
|
||||||
|
|
||||||
else()
|
if (BOOST_STATIC_STRING_INSTALL AND NOT BOOST_SUPERPROJECT_VERSION)
|
||||||
set (THREADS_PREFER_PTHREAD_FLAG ON)
|
install(TARGETS boost_static_string
|
||||||
find_package (Threads)
|
RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}"
|
||||||
|
LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}"
|
||||||
|
ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}"
|
||||||
|
)
|
||||||
|
|
||||||
set( CMAKE_CXX_FLAGS
|
install(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/include/boost
|
||||||
"${CMAKE_CXX_FLAGS} -std=c++11 -Wall -Wextra -Wpedantic -Wno-unused-parameter")
|
DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}
|
||||||
|
FILES_MATCHING
|
||||||
|
PATTERN "*.hpp"
|
||||||
|
PATTERN "*.ipp"
|
||||||
|
)
|
||||||
|
endif ()
|
||||||
|
|
||||||
if ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang")
|
|
||||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wrange-loop-analysis")
|
|
||||||
endif ()
|
|
||||||
endif()
|
|
||||||
|
|
||||||
# Must come before Boost includes, otherwise the
|
if (BUILD_TESTING OR BOOST_STATIC_STRING_BUILD_TESTS)
|
||||||
# IDE sees the wrong file due to boost/ symlinks.
|
add_subdirectory(test)
|
||||||
include_directories (include)
|
endif ()
|
||||||
|
|
||||||
#-------------------------------------------------------------------------------
|
|
||||||
#
|
|
||||||
# Boost
|
|
||||||
#
|
|
||||||
#-------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
get_filename_component (BOOST_ROOT ../../ ABSOLUTE)
|
|
||||||
|
|
||||||
# VFALCO I want static but "b2 stage" builds a minimal set which excludes static
|
|
||||||
add_definitions (-DBOOST_ALL_STATIC_LINK=1)
|
|
||||||
|
|
||||||
include_directories (${BOOST_ROOT})
|
|
||||||
|
|
||||||
link_directories(${BOOST_ROOT}/stage/lib)
|
|
||||||
|
|
||||||
#-------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
if ("${VARIANT}" STREQUAL "coverage")
|
|
||||||
if (MSVC)
|
|
||||||
else()
|
|
||||||
set (CMAKE_BUILD_TYPE DEBUG)
|
|
||||||
set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -msse4.2 --coverage")
|
|
||||||
set (CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} --coverage")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
elseif ("${VARIANT}" STREQUAL "ubasan")
|
|
||||||
if (MSVC)
|
|
||||||
else()
|
|
||||||
set (CMAKE_BUILD_TYPE RELWITHDEBINFO)
|
|
||||||
set (CMAKE_CXX_FLAGS
|
|
||||||
"${CMAKE_CXX_FLAGS} -msse4.2 -funsigned-char -fno-omit-frame-pointer -fsanitize=address,undefined -fno-sanitize-recover=address,undefined -fsanitize-blacklist=${PROJECT_SOURCE_DIR}/tools/blacklist.supp")
|
|
||||||
set (CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -fsanitize=address,undefined -fno-sanitize-recover=address,undefined")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
elseif ("${VARIANT}" STREQUAL "debug")
|
|
||||||
set (CMAKE_BUILD_TYPE DEBUG)
|
|
||||||
|
|
||||||
elseif ("${VARIANT}" STREQUAL "release")
|
|
||||||
set (CMAKE_BUILD_TYPE RELEASE)
|
|
||||||
|
|
||||||
endif()
|
|
||||||
|
|
||||||
#-------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
#GroupSources (test "/")
|
|
||||||
|
|
||||||
#-------------------------------------------------------------------------------
|
|
||||||
#
|
|
||||||
# Tests and examples
|
|
||||||
#
|
|
||||||
|
|
||||||
#include_directories (.)
|
|
||||||
|
|
||||||
file (GLOB_RECURSE PROJECT_FILES
|
|
||||||
${PROJECT_SOURCE_DIR}/include/boost/static_string/*.hpp
|
|
||||||
${PROJECT_SOURCE_DIR}/include/boost/static_string/*.ipp
|
|
||||||
)
|
|
||||||
|
|
||||||
add_subdirectory (test)
|
|
||||||
|
|
||||||
endif()
|
|
||||||
|
|||||||
10
Jamfile
10
Jamfile
@@ -1,10 +0,0 @@
|
|||||||
#
|
|
||||||
# Copyright (c) 2019 Vinnie Falco (vinnie dot falco at gmail dot com)
|
|
||||||
#
|
|
||||||
# Distributed under the Boost Software License, Version 1.0. (See accompanying
|
|
||||||
# file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
|
||||||
#
|
|
||||||
# Official repository: https://github.com/boostorg/static_string
|
|
||||||
#
|
|
||||||
|
|
||||||
build-project test ;
|
|
||||||
@@ -1,9 +1,9 @@
|
|||||||
# Boost.StaticString
|
# Boost.StaticString
|
||||||
|
|
||||||
Branch | Travis | Appveyor | Azure Pipelines | codecov.io | Docs | Matrix |
|
Branch | GHA CI | Appveyor | Azure Pipelines | codecov.io | Docs | Matrix |
|
||||||
:-------------: | ------ | -------- | --------------- | ---------- | ---- | ------ |
|
:-------------: | ------ | -------- | --------------- | ---------- | ---- | ------ |
|
||||||
[`master`](https://github.com/boostorg/static_string/tree/master) | [](https://travis-ci.org/boostorg/static_string) | [](https://ci.appveyor.com/project/sdkrystian/static-string/branch/master) | [](https://krystiands.visualstudio.com/static_string/_build/latest?definitionId=3&branchName=master) | [](https://codecov.io/gh/boostorg/static_string/branch/master) | [](http://www.boost.org/doc/libs/release/libs/static_string) | [](http://www.boost.org/development/tests/master/developer/static_string.html)
|
[`master`](https://github.com/boostorg/static_string/tree/master) | [](https://github.com/boostorg/static_string/actions?query=branch:master) | [](https://ci.appveyor.com/project/sdkrystian/static-string/branch/master) | [](https://krystiands.visualstudio.com/static_string/_build/latest?definitionId=3&branchName=master) | [](https://codecov.io/gh/boostorg/static_string/branch/master) | [](http://www.boost.org/doc/libs/release/libs/static_string) | [](https://regression.boost.org/master/developer/static_string.html)
|
||||||
[`develop`](https://github.com/boostorg/static_string/tree/develop) | [](https://travis-ci.org/boostorg/static_string) | [](https://ci.appveyor.com/project/sdkrystian/static-string/branch/develop) | [](https://krystiands.visualstudio.com/static_string/_build/latest?definitionId=3&branchName=develop) | [](https://codecov.io/gh/boostorg/static_string/branch/develop) | [](http://www.boost.org/doc/libs/develop/libs/static_string) | [](http://www.boost.org/development/tests/develop/developer/static_string.html)
|
[`develop`](https://github.com/boostorg/static_string/tree/develop) | [](https://github.com/boostorg/static_string/actions?query=branch:develop) | [](https://ci.appveyor.com/project/sdkrystian/static-string/branch/develop) | [](https://krystiands.visualstudio.com/static_string/_build/latest?definitionId=3&branchName=develop) | [](https://codecov.io/gh/boostorg/static_string/branch/develop) | [](http://www.boost.org/doc/libs/develop/libs/static_string) | [](https://regression.boost.org/develop/developer/static_string.html)
|
||||||
|
|
||||||
## Introduction
|
## Introduction
|
||||||
|
|
||||||
|
|||||||
27
build.jam
Normal file
27
build.jam
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
# Copyright René Ferdinand Rivera Morell 2023-2024
|
||||||
|
# Distributed under the Boost Software License, Version 1.0.
|
||||||
|
# (See accompanying file LICENSE_1_0.txt or copy at
|
||||||
|
# http://www.boost.org/LICENSE_1_0.txt)
|
||||||
|
|
||||||
|
require-b2 5.2 ;
|
||||||
|
|
||||||
|
constant boost_dependencies :
|
||||||
|
/boost/assert//boost_assert
|
||||||
|
/boost/config//boost_config
|
||||||
|
/boost/container_hash//boost_container_hash
|
||||||
|
/boost/core//boost_core
|
||||||
|
/boost/throw_exception//boost_throw_exception
|
||||||
|
/boost/utility//boost_utility ;
|
||||||
|
|
||||||
|
project /boost/static_string
|
||||||
|
;
|
||||||
|
|
||||||
|
explicit
|
||||||
|
[ alias boost_static_string : : :
|
||||||
|
: <include>include <library>$(boost_dependencies) ]
|
||||||
|
[ alias all : boost_static_string test ]
|
||||||
|
;
|
||||||
|
|
||||||
|
call-if : boost-library static_string
|
||||||
|
;
|
||||||
|
|
||||||
274
doc/Jamfile
274
doc/Jamfile
@@ -1,6 +1,7 @@
|
|||||||
#
|
#
|
||||||
# Copyright (c) 2013-2017 Vinnie Falco (vinnie dot falco at gmail dot com)
|
# Copyright (c) 2013-2017 Vinnie Falco (vinnie dot falco at gmail dot com)
|
||||||
# Copyright (c) 2020 Krystian Stasiowski (sdkrystian at gmail dot com)
|
# Copyright (c) 2020 Krystian Stasiowski (sdkrystian at gmail dot com)
|
||||||
|
# Copyright (c) 2022 Alan de Freitas (alandefreitas@gmail.com)
|
||||||
#
|
#
|
||||||
# Distributed under the Boost Software License, Version 1.0. (See accompanying
|
# 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 LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
||||||
@@ -8,245 +9,50 @@
|
|||||||
|
|
||||||
project static_string/doc ;
|
project static_string/doc ;
|
||||||
|
|
||||||
import os ;
|
import-search /boost/docca ;
|
||||||
|
|
||||||
|
import docca ;
|
||||||
import path ;
|
import path ;
|
||||||
import boostbook ;
|
import os ;
|
||||||
import quickbook ;
|
|
||||||
import xsltproc ;
|
|
||||||
import doxygen ;
|
|
||||||
import modules ;
|
|
||||||
import saxonhe ;
|
|
||||||
import common ;
|
|
||||||
|
|
||||||
#-------------------------------------------------------------------------------
|
local include-prefix = [ path.root $(__file__:D) [ path.pwd ] ] ;
|
||||||
#
|
include-prefix = [ path.native $(include-prefix:D)/include ] ;
|
||||||
# Build the list of header files that Doxygen will scan. We need
|
|
||||||
# this list to inform the build system of the dependencies so the
|
|
||||||
# docs can be rebuild if any of the header files change.
|
|
||||||
#
|
|
||||||
|
|
||||||
local sources = [ path.glob-tree ../include/boost/static_string : *.hpp *.ipp : detail impl ] ;
|
docca.pyreference reference.qbk
|
||||||
|
|
||||||
# Get the configured paths to doxygen and xsltproc
|
|
||||||
|
|
||||||
.doxygen = [ doxygen.name ] ;
|
|
||||||
.doxygen ?= doxygen ;
|
|
||||||
|
|
||||||
#ECHO Using doxygen from "$(.doxygen)" ;
|
|
||||||
|
|
||||||
.xsltproc = [ xsltproc.name ] ;
|
|
||||||
.xsltproc ?= xsltproc ;
|
|
||||||
|
|
||||||
#ECHO Using xsltproc from "$(.xsltproc)" ;
|
|
||||||
|
|
||||||
#-------------------------------------------------------------------------------
|
|
||||||
#
|
|
||||||
# Invoke Doxygen to process the header files and produce the XML
|
|
||||||
# containing the description of the C++ declarations and extracted
|
|
||||||
# Javadoc comments.
|
|
||||||
#
|
|
||||||
make index.xml
|
|
||||||
:
|
:
|
||||||
./source.dox
|
[ glob-tree-ex ../include/boost/static_string : *.hpp *.ipp : detail impl ]
|
||||||
|
externals.hpp
|
||||||
:
|
:
|
||||||
@make_doxygen_xml
|
<doxygen:param>ALIASES="esafe=\"@par Exception Safety\""
|
||||||
:
|
<doxygen:param>DISTRIBUTE_GROUP_DOC=YES
|
||||||
<dependency>$(sources)
|
<doxygen:param>MACRO_EXPANSION=YES
|
||||||
|
<doxygen:param>EXPAND_ONLY_PREDEF=YES
|
||||||
|
<doxygen:param>PREDEFINED="\\
|
||||||
|
BOOST_STATIC_STRING_DOCS \\
|
||||||
|
\"BOOST_STATIC_STRING_CPP11_CONSTEXPR=constexpr\" \\
|
||||||
|
\"BOOST_STATIC_STRING_CPP14_CONSTEXPR=constexpr\" \\
|
||||||
|
\"BOOST_STATIC_STRING_CPP17_CONSTEXPR=constexpr\" \\
|
||||||
|
\"BOOST_STATIC_STRING_CPP20_CONSTEXPR=constexpr\""
|
||||||
|
<doxygen:param>ABBREVIATE_BRIEF=
|
||||||
|
<doxygen:param>INLINE_INHERITED_MEMB=YES
|
||||||
|
<doxygen:param>JAVADOC_AUTOBRIEF=YES
|
||||||
|
<doxygen:param>AUTOLINK_SUPPORT=NO
|
||||||
|
<doxygen:param>EXTRACT_ALL=YES
|
||||||
|
<doxygen:param>EXTRACT_PRIVATE=YES
|
||||||
|
<doxygen:param>EXTRACT_LOCAL_CLASSES=NO
|
||||||
|
<doxygen:param>INLINE_INFO=NO
|
||||||
|
<doxygen:param>SORT_MEMBER_DOCS=NO
|
||||||
|
<doxygen:param>SORT_MEMBERS_CTORS_1ST=YES
|
||||||
|
<doxygen:param>STRIP_FROM_PATH=$(include-prefix)
|
||||||
|
|
||||||
|
# <doxygen:param>ALLOW_UNICODE_NAMES=NO
|
||||||
|
# <doxygen:param>GROUP_NESTED_COMPOUNDS=NO
|
||||||
|
# <doxygen:param>HIDE_COMPOUND_REFERENCE=NO
|
||||||
|
# <doxygen:param>WARN_AS_ERROR=NO
|
||||||
|
|
||||||
|
<docca:config>config.json
|
||||||
;
|
;
|
||||||
|
|
||||||
rule make_doxygen_xml ( targets * : sources * : properties * )
|
|
||||||
{
|
|
||||||
LIB_DIR on $(targets) =
|
|
||||||
[ path.native [ path.parent [ path.root
|
|
||||||
[ on $(sources[1]) return $(SEARCH) ] [ path.pwd ] ] ] ] ;
|
|
||||||
}
|
|
||||||
|
|
||||||
if [ os.name ] = NT
|
|
||||||
{
|
|
||||||
actions make_doxygen_xml
|
|
||||||
{
|
|
||||||
SET LIB_DIR=$(LIB_DIR)
|
|
||||||
SET XML_OUTPUT=$(1:D)
|
|
||||||
"$(.doxygen)" $(2)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
actions make_doxygen_xml
|
|
||||||
{
|
|
||||||
export LIB_DIR=$(LIB_DIR)
|
|
||||||
export XML_OUTPUT=$(1:D)
|
|
||||||
"$(.doxygen)" $(2)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#-------------------------------------------------------------------------------
|
|
||||||
#
|
|
||||||
# Copy all the XSLT modules to the target directory.
|
|
||||||
#
|
|
||||||
# FIXME: Change this so we can just specify a directory,
|
|
||||||
# rather than every file individually.
|
|
||||||
#
|
|
||||||
# Also, somehow force dependencies in a general way
|
|
||||||
# such that the XSLT has to be executed again
|
|
||||||
# if any of the modules change. For example,
|
|
||||||
# if base-extract-xml-pages.xml changes, then
|
|
||||||
# an invocation of extract-xml-pages.xsl (which
|
|
||||||
# imports the former) must be run again.
|
|
||||||
#
|
|
||||||
path-constant docca : ../../../tools/docca ;
|
|
||||||
make extract-xml-pages.xsl : $(docca)/include/docca/extract-xml-pages.xsl : @copy_script ;
|
|
||||||
make base-extract-xml-pages.xsl : $(docca)/include/docca/base-extract-xml-pages.xsl : @copy_script ;
|
|
||||||
make common.xsl : $(docca)/include/docca/common.xsl : @copy_script ;
|
|
||||||
make stage1.xsl : $(docca)/include/docca/stage1.xsl : @copy_script ;
|
|
||||||
make base-stage1.xsl : $(docca)/include/docca/base-stage1.xsl : @copy_script ;
|
|
||||||
make stage2.xsl : $(docca)/include/docca/stage2.xsl : @copy_script ;
|
|
||||||
make base-stage2.xsl : $(docca)/include/docca/base-stage2.xsl : @copy_script ;
|
|
||||||
make assemble-quickbook.xsl : $(docca)/include/docca/assemble-quickbook.xsl : @copy_script ;
|
|
||||||
make emphasized-types.xsl : $(docca)/include/docca/emphasized-types.xsl : @copy_script ;
|
|
||||||
make base-config.xsl : $(docca)/include/docca/base-config.xsl : @copy_script ;
|
|
||||||
|
|
||||||
# Copy the project-specific config XSLT
|
|
||||||
make custom-overrides.xsl : xsl/custom-overrides.xsl : @copy_script ;
|
|
||||||
|
|
||||||
# Make a copy of the given file.
|
|
||||||
#
|
|
||||||
actions copy_script
|
|
||||||
{
|
|
||||||
cp $(2[1]) $(1)
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
# This is to initially create the directory as a side effect; I'm sure there's a better way...
|
|
||||||
make xml-pages/directory/placeholder : index.xml : @null_action ;
|
|
||||||
|
|
||||||
#-------------------------------------------------------------------------------
|
|
||||||
#
|
|
||||||
# Run index.xml through the first transformation stage
|
|
||||||
# (assembling and splitting the XML into page-specific files).
|
|
||||||
#
|
|
||||||
make xml-pages.xml
|
|
||||||
:
|
|
||||||
index.xml
|
|
||||||
extract-xml-pages.xsl
|
|
||||||
|
|
||||||
# Make bjam aware of additional dependencies
|
|
||||||
base-extract-xml-pages.xsl
|
|
||||||
base-config.xsl
|
|
||||||
custom-overrides.xsl
|
|
||||||
common.xsl
|
|
||||||
:
|
|
||||||
saxonhe.saxonhe
|
|
||||||
;
|
|
||||||
|
|
||||||
# This is just to make the directory eligible as a source
|
|
||||||
make xml-pages : index.xml : @null_action ;
|
|
||||||
|
|
||||||
# Not ready for prime time until I figure out how to get the xslt-visualizer code in place
|
|
||||||
#make stage1/code-trace-enabled/stage1.xsl
|
|
||||||
# :
|
|
||||||
# stage1.xsl
|
|
||||||
# xslt-visualizer/xsl/trace-enable.xsl
|
|
||||||
# :
|
|
||||||
# saxonhe.saxonhe
|
|
||||||
# ;
|
|
||||||
|
|
||||||
# This is to initially create the directory as a side effect; I'm sure there's a better way...
|
|
||||||
make stage1/results/directory/placeholder : xml-pages.xml : @null_action ;
|
|
||||||
make stage2/results/directory/placeholder : xml-pages.xml : @null_action ;
|
|
||||||
|
|
||||||
# TODO: figure out why this (and the following stage) get built every time
|
|
||||||
make stage1/results
|
|
||||||
:
|
|
||||||
xml-pages
|
|
||||||
stage1.xsl
|
|
||||||
|
|
||||||
# additional dependencies
|
|
||||||
xml-pages.xml
|
|
||||||
base-stage1.xsl
|
|
||||||
base-config.xsl
|
|
||||||
custom-overrides.xsl
|
|
||||||
common.xsl
|
|
||||||
:
|
|
||||||
saxonhe.saxonhe_dir
|
|
||||||
;
|
|
||||||
|
|
||||||
make stage2/results
|
|
||||||
:
|
|
||||||
stage1/results
|
|
||||||
stage2.xsl
|
|
||||||
|
|
||||||
# additional dependencies
|
|
||||||
emphasized-types.xsl
|
|
||||||
base-stage2.xsl
|
|
||||||
base-config.xsl
|
|
||||||
custom-overrides.xsl
|
|
||||||
common.xsl
|
|
||||||
:
|
|
||||||
saxonhe.saxonhe_dir
|
|
||||||
;
|
|
||||||
|
|
||||||
make reference.qbk
|
|
||||||
:
|
|
||||||
xml-pages.xml
|
|
||||||
assemble-quickbook.xsl
|
|
||||||
|
|
||||||
# TODO: make this input to the XSLT somehow
|
|
||||||
# rather than relying on it being hard-coded
|
|
||||||
# in the XSLT (which it is!)
|
|
||||||
stage2/results
|
|
||||||
:
|
|
||||||
saxonhe.saxonhe
|
|
||||||
;
|
|
||||||
|
|
||||||
actions make_dir
|
|
||||||
{
|
|
||||||
mkdir $(1)
|
|
||||||
}
|
|
||||||
|
|
||||||
make combine.xslt : index.xml : @null_action ;
|
|
||||||
|
|
||||||
actions touch_file
|
|
||||||
{
|
|
||||||
touch $(1) ;
|
|
||||||
}
|
|
||||||
|
|
||||||
actions null_action
|
|
||||||
{
|
|
||||||
touch -c $(1) ;
|
|
||||||
}
|
|
||||||
|
|
||||||
make reference.xml
|
|
||||||
:
|
|
||||||
combine.xslt
|
|
||||||
index.xml
|
|
||||||
:
|
|
||||||
@call-xsltproc
|
|
||||||
;
|
|
||||||
|
|
||||||
actions call-xsltproc
|
|
||||||
{
|
|
||||||
"$(.xsltproc)" $(2) > $(1)
|
|
||||||
}
|
|
||||||
|
|
||||||
#-------------------------------------------------------------------------------
|
|
||||||
#
|
|
||||||
# Produce the reference.qbk file by running
|
|
||||||
# the reference xml through the transform.
|
|
||||||
#
|
|
||||||
#make reference.qbk
|
|
||||||
# :
|
|
||||||
# reference.xml
|
|
||||||
# transform.xsl
|
|
||||||
# :
|
|
||||||
# saxonhe.saxonhe
|
|
||||||
# ;
|
|
||||||
|
|
||||||
# We have to make a copy of reference.qbk and put it
|
|
||||||
# in a place where the static .qbk files can find it
|
|
||||||
#
|
|
||||||
install qbk : reference.qbk ;
|
|
||||||
|
|
||||||
#-------------------------------------------------------------------------------
|
#-------------------------------------------------------------------------------
|
||||||
#
|
#
|
||||||
# Produce the Boost.Book XML from the QuickBook
|
# Produce the Boost.Book XML from the QuickBook
|
||||||
@@ -265,7 +71,7 @@ xml static_string_doc
|
|||||||
qbk/main.qbk
|
qbk/main.qbk
|
||||||
:
|
:
|
||||||
<dependency>images
|
<dependency>images
|
||||||
<dependency>qbk
|
<dependency>reference.qbk
|
||||||
;
|
;
|
||||||
|
|
||||||
explicit static_string_doc ;
|
explicit static_string_doc ;
|
||||||
@@ -284,7 +90,7 @@ boostbook static_string
|
|||||||
<xsl:param>chapter.autolabel=0
|
<xsl:param>chapter.autolabel=0
|
||||||
<xsl:param>chunk.section.depth=8 # Depth to which sections should be chunked
|
<xsl:param>chunk.section.depth=8 # Depth to which sections should be chunked
|
||||||
<xsl:param>chunk.first.sections=1 # Chunk the first top-level section?
|
<xsl:param>chunk.first.sections=1 # Chunk the first top-level section?
|
||||||
<xsl:param>generate.toc=""
|
<xsl:param>generate.toc="chapter toc,title section nop reference nop"
|
||||||
<include>../../../tools/boostbook/dtd
|
<include>../../../tools/boostbook/dtd
|
||||||
:
|
:
|
||||||
<dependency>images
|
<dependency>images
|
||||||
|
|||||||
12
doc/config.json
Normal file
12
doc/config.json
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
{
|
||||||
|
"include_private": false,
|
||||||
|
"legacy_behavior": false,
|
||||||
|
"external_marker": "!EXTERNAL!",
|
||||||
|
"link_prefix": "static_string.ref.",
|
||||||
|
"default_namespace": "boost::static_strings",
|
||||||
|
"allowed_prefixes": ["boost::static_strings::", "std::"],
|
||||||
|
"convenience_header": "boost/static_string.hpp",
|
||||||
|
"replace_strings": {
|
||||||
|
"__see_below__": "``['see-below]``"
|
||||||
|
}
|
||||||
|
}
|
||||||
64
doc/externals.hpp
Normal file
64
doc/externals.hpp
Normal file
@@ -0,0 +1,64 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
namespace boost {
|
||||||
|
|
||||||
|
/// !EXTERNAL!
|
||||||
|
///
|
||||||
|
/// @see https://www.boost.org/doc/libs/release/libs/utility/doc/html/utility/utilities/string_view.html
|
||||||
|
template <class T, class Traits>
|
||||||
|
struct basic_string_view {};
|
||||||
|
|
||||||
|
} // namespace boost
|
||||||
|
|
||||||
|
namespace std {
|
||||||
|
|
||||||
|
/// !EXTERNAL!
|
||||||
|
///
|
||||||
|
/// @see https://en.cppreference.com/w/cpp/iterator/reverse_iterator
|
||||||
|
template <class T>
|
||||||
|
struct reverse_iterator {};
|
||||||
|
|
||||||
|
/// !EXTERNAL!
|
||||||
|
///
|
||||||
|
/// @see https://en.cppreference.com/w/cpp/types/size_t
|
||||||
|
struct size_t {};
|
||||||
|
|
||||||
|
/// !EXTERNAL!
|
||||||
|
///
|
||||||
|
/// @see https://en.cppreference.com/w/cpp/types/integer
|
||||||
|
struct uint64_t {};
|
||||||
|
|
||||||
|
/// !EXTERNAL!
|
||||||
|
///
|
||||||
|
/// @see https://en.cppreference.com/w/cpp/types/integer
|
||||||
|
struct int64_t {};
|
||||||
|
|
||||||
|
/// !EXTERNAL!
|
||||||
|
///
|
||||||
|
/// @see https://en.cppreference.com/w/cpp/types/nullptr_t
|
||||||
|
struct nullptr_t {};
|
||||||
|
|
||||||
|
/// !EXTERNAL!
|
||||||
|
///
|
||||||
|
/// @see https://en.cppreference.com/w/cpp/types/ptrdiff_t
|
||||||
|
struct ptrdiff_t {};
|
||||||
|
|
||||||
|
/// !EXTERNAL!
|
||||||
|
///
|
||||||
|
/// @see https://en.cppreference.com/w/cpp/utility/initializer_list
|
||||||
|
template <class T>
|
||||||
|
struct initializer_list {};
|
||||||
|
|
||||||
|
/// !EXTERNAL!
|
||||||
|
///
|
||||||
|
/// @see https://en.cppreference.com/w/cpp/io/basic_ostream
|
||||||
|
template <class T, class Traits>
|
||||||
|
struct basic_ostream {};
|
||||||
|
|
||||||
|
/// !EXTERNAL!
|
||||||
|
///
|
||||||
|
/// @see https://en.cppreference.com/w/cpp/types/numeric_limits
|
||||||
|
template <class T>
|
||||||
|
struct numeric_limits {};
|
||||||
|
|
||||||
|
} // namespace std
|
||||||
252
doc/source.dox
252
doc/source.dox
@@ -1,252 +0,0 @@
|
|||||||
#---------------------------------------------------------------------------
|
|
||||||
# Configuration options related to the input files
|
|
||||||
#---------------------------------------------------------------------------
|
|
||||||
|
|
||||||
INPUT = \
|
|
||||||
$(LIB_DIR)/include/boost/static_string
|
|
||||||
|
|
||||||
ALIASES += esafe="@par Exception Safety"
|
|
||||||
|
|
||||||
INPUT_ENCODING = UTF-8
|
|
||||||
FILE_PATTERNS =
|
|
||||||
RECURSIVE = NO
|
|
||||||
EXCLUDE =
|
|
||||||
EXCLUDE_SYMLINKS = NO
|
|
||||||
EXCLUDE_PATTERNS =
|
|
||||||
EXCLUDE_SYMBOLS =
|
|
||||||
EXAMPLE_PATH =
|
|
||||||
EXAMPLE_PATTERNS =
|
|
||||||
EXAMPLE_RECURSIVE = NO
|
|
||||||
IMAGE_PATH =
|
|
||||||
INPUT_FILTER =
|
|
||||||
FILTER_PATTERNS =
|
|
||||||
FILTER_SOURCE_FILES = NO
|
|
||||||
FILTER_SOURCE_PATTERNS =
|
|
||||||
USE_MDFILE_AS_MAINPAGE =
|
|
||||||
|
|
||||||
#---------------------------------------------------------------------------
|
|
||||||
# Configuration options related to the preprocessor
|
|
||||||
#---------------------------------------------------------------------------
|
|
||||||
ENABLE_PREPROCESSING = YES
|
|
||||||
MACRO_EXPANSION = YES
|
|
||||||
EXPAND_ONLY_PREDEF = YES
|
|
||||||
SEARCH_INCLUDES = YES
|
|
||||||
INCLUDE_PATH = ../
|
|
||||||
INCLUDE_FILE_PATTERNS =
|
|
||||||
|
|
||||||
PREDEFINED = \
|
|
||||||
BOOST_STATIC_STRING_DOCS \
|
|
||||||
"BOOST_STATIC_STRING_CPP11_CONSTEXPR=constexpr" \
|
|
||||||
"BOOST_STATIC_STRING_CPP14_CONSTEXPR=constexpr" \
|
|
||||||
"BOOST_STATIC_STRING_CPP17_CONSTEXPR=constexpr" \
|
|
||||||
"BOOST_STATIC_STRING_CPP20_CONSTEXPR=constexpr"
|
|
||||||
|
|
||||||
EXPAND_AS_DEFINED =
|
|
||||||
SKIP_FUNCTION_MACROS = YES
|
|
||||||
|
|
||||||
#---------------------------------------------------------------------------
|
|
||||||
# Project related configuration options
|
|
||||||
#---------------------------------------------------------------------------
|
|
||||||
DOXYFILE_ENCODING = UTF-8
|
|
||||||
PROJECT_NAME = "StaticString"
|
|
||||||
PROJECT_NUMBER =
|
|
||||||
PROJECT_BRIEF = String Library
|
|
||||||
PROJECT_LOGO =
|
|
||||||
OUTPUT_DIRECTORY =
|
|
||||||
CREATE_SUBDIRS = NO
|
|
||||||
#####ALLOW_UNICODE_NAMES = NO
|
|
||||||
OUTPUT_LANGUAGE = English
|
|
||||||
BRIEF_MEMBER_DESC = YES
|
|
||||||
REPEAT_BRIEF = YES
|
|
||||||
ABBREVIATE_BRIEF =
|
|
||||||
ALWAYS_DETAILED_SEC = NO
|
|
||||||
INLINE_INHERITED_MEMB = YES
|
|
||||||
FULL_PATH_NAMES = YES
|
|
||||||
#STRIP_FROM_PATH = $(LIB_DIR)/include # Requires doxygen 1.8.7+
|
|
||||||
STRIP_FROM_INC_PATH =
|
|
||||||
SHORT_NAMES = NO
|
|
||||||
JAVADOC_AUTOBRIEF = YES
|
|
||||||
QT_AUTOBRIEF = NO
|
|
||||||
MULTILINE_CPP_IS_BRIEF = NO
|
|
||||||
INHERIT_DOCS = YES
|
|
||||||
SEPARATE_MEMBER_PAGES = NO
|
|
||||||
TAB_SIZE = 4
|
|
||||||
TCL_SUBST =
|
|
||||||
OPTIMIZE_OUTPUT_FOR_C = NO
|
|
||||||
OPTIMIZE_OUTPUT_JAVA = NO
|
|
||||||
OPTIMIZE_FOR_FORTRAN = NO
|
|
||||||
OPTIMIZE_OUTPUT_VHDL = NO
|
|
||||||
EXTENSION_MAPPING =
|
|
||||||
MARKDOWN_SUPPORT = YES
|
|
||||||
AUTOLINK_SUPPORT = YES
|
|
||||||
BUILTIN_STL_SUPPORT = NO
|
|
||||||
CPP_CLI_SUPPORT = NO
|
|
||||||
SIP_SUPPORT = NO
|
|
||||||
IDL_PROPERTY_SUPPORT = YES
|
|
||||||
DISTRIBUTE_GROUP_DOC = YES
|
|
||||||
#####GROUP_NESTED_COMPOUNDS = NO
|
|
||||||
SUBGROUPING = YES
|
|
||||||
INLINE_GROUPED_CLASSES = NO
|
|
||||||
INLINE_SIMPLE_STRUCTS = NO
|
|
||||||
TYPEDEF_HIDES_STRUCT = NO
|
|
||||||
LOOKUP_CACHE_SIZE = 0
|
|
||||||
|
|
||||||
#---------------------------------------------------------------------------
|
|
||||||
# Build related configuration options
|
|
||||||
#---------------------------------------------------------------------------
|
|
||||||
EXTRACT_ALL = YES
|
|
||||||
EXTRACT_PRIVATE = YES
|
|
||||||
EXTRACT_PACKAGE = NO
|
|
||||||
EXTRACT_STATIC = NO
|
|
||||||
EXTRACT_LOCAL_CLASSES = NO
|
|
||||||
EXTRACT_LOCAL_METHODS = NO
|
|
||||||
EXTRACT_ANON_NSPACES = NO
|
|
||||||
HIDE_UNDOC_MEMBERS = NO
|
|
||||||
HIDE_UNDOC_CLASSES = NO
|
|
||||||
HIDE_FRIEND_COMPOUNDS = NO
|
|
||||||
HIDE_IN_BODY_DOCS = NO
|
|
||||||
INTERNAL_DOCS = NO
|
|
||||||
CASE_SENSE_NAMES = YES
|
|
||||||
HIDE_SCOPE_NAMES = NO
|
|
||||||
#####HIDE_COMPOUND_REFERENCE= NO
|
|
||||||
SHOW_INCLUDE_FILES = NO
|
|
||||||
SHOW_GROUPED_MEMB_INC = NO
|
|
||||||
FORCE_LOCAL_INCLUDES = NO
|
|
||||||
INLINE_INFO = NO
|
|
||||||
SORT_MEMBER_DOCS = NO
|
|
||||||
SORT_BRIEF_DOCS = NO
|
|
||||||
SORT_MEMBERS_CTORS_1ST = YES
|
|
||||||
SORT_GROUP_NAMES = NO
|
|
||||||
SORT_BY_SCOPE_NAME = NO
|
|
||||||
STRICT_PROTO_MATCHING = NO
|
|
||||||
GENERATE_TODOLIST = NO
|
|
||||||
GENERATE_TESTLIST = NO
|
|
||||||
GENERATE_BUGLIST = NO
|
|
||||||
GENERATE_DEPRECATEDLIST= NO
|
|
||||||
ENABLED_SECTIONS =
|
|
||||||
MAX_INITIALIZER_LINES = 30
|
|
||||||
SHOW_USED_FILES = NO
|
|
||||||
SHOW_FILES = NO
|
|
||||||
SHOW_NAMESPACES = NO
|
|
||||||
FILE_VERSION_FILTER =
|
|
||||||
LAYOUT_FILE =
|
|
||||||
CITE_BIB_FILES =
|
|
||||||
|
|
||||||
#---------------------------------------------------------------------------
|
|
||||||
# Configuration options related to warning and progress messages
|
|
||||||
#---------------------------------------------------------------------------
|
|
||||||
QUIET = NO
|
|
||||||
WARNINGS = YES
|
|
||||||
WARN_IF_UNDOCUMENTED = YES
|
|
||||||
WARN_IF_DOC_ERROR = YES
|
|
||||||
WARN_NO_PARAMDOC = NO
|
|
||||||
#####WARN_AS_ERROR = NO
|
|
||||||
WARN_FORMAT = "$file:$line: $text"
|
|
||||||
WARN_LOGFILE =
|
|
||||||
|
|
||||||
#---------------------------------------------------------------------------
|
|
||||||
# Configuration options related to source browsing
|
|
||||||
#---------------------------------------------------------------------------
|
|
||||||
SOURCE_BROWSER = NO
|
|
||||||
INLINE_SOURCES = NO
|
|
||||||
STRIP_CODE_COMMENTS = YES
|
|
||||||
REFERENCED_BY_RELATION = NO
|
|
||||||
REFERENCES_RELATION = NO
|
|
||||||
REFERENCES_LINK_SOURCE = YES
|
|
||||||
SOURCE_TOOLTIPS = YES
|
|
||||||
USE_HTAGS = NO
|
|
||||||
VERBATIM_HEADERS = YES
|
|
||||||
CLANG_ASSISTED_PARSING = NO
|
|
||||||
CLANG_OPTIONS =
|
|
||||||
|
|
||||||
#---------------------------------------------------------------------------
|
|
||||||
# Configuration options related to the alphabetical class index
|
|
||||||
#---------------------------------------------------------------------------
|
|
||||||
ALPHABETICAL_INDEX = YES
|
|
||||||
COLS_IN_ALPHA_INDEX = 5
|
|
||||||
IGNORE_PREFIX =
|
|
||||||
|
|
||||||
#---------------------------------------------------------------------------
|
|
||||||
# Configuration options related to the HTML output
|
|
||||||
#---------------------------------------------------------------------------
|
|
||||||
GENERATE_HTML = NO
|
|
||||||
HTML_OUTPUT = dhtm
|
|
||||||
HTML_FILE_EXTENSION = .html
|
|
||||||
HTML_HEADER =
|
|
||||||
HTML_FOOTER =
|
|
||||||
HTML_STYLESHEET =
|
|
||||||
HTML_EXTRA_STYLESHEET =
|
|
||||||
HTML_EXTRA_FILES =
|
|
||||||
HTML_COLORSTYLE_HUE = 220
|
|
||||||
HTML_COLORSTYLE_SAT = 100
|
|
||||||
HTML_COLORSTYLE_GAMMA = 80
|
|
||||||
HTML_TIMESTAMP = NO
|
|
||||||
HTML_DYNAMIC_SECTIONS = NO
|
|
||||||
HTML_INDEX_NUM_ENTRIES = 100
|
|
||||||
GENERATE_DOCSET = NO
|
|
||||||
DOCSET_FEEDNAME = "Doxygen generated docs"
|
|
||||||
DOCSET_BUNDLE_ID = org.doxygen.Project
|
|
||||||
DOCSET_PUBLISHER_ID = org.doxygen.Publisher
|
|
||||||
DOCSET_PUBLISHER_NAME = Publisher
|
|
||||||
GENERATE_HTMLHELP = NO
|
|
||||||
CHM_FILE =
|
|
||||||
HHC_LOCATION =
|
|
||||||
GENERATE_CHI = NO
|
|
||||||
CHM_INDEX_ENCODING =
|
|
||||||
BINARY_TOC = NO
|
|
||||||
TOC_EXPAND = NO
|
|
||||||
GENERATE_QHP = NO
|
|
||||||
QCH_FILE =
|
|
||||||
QHP_NAMESPACE = org.doxygen.Project
|
|
||||||
QHP_VIRTUAL_FOLDER = doc
|
|
||||||
QHP_CUST_FILTER_NAME =
|
|
||||||
QHP_CUST_FILTER_ATTRS =
|
|
||||||
QHP_SECT_FILTER_ATTRS =
|
|
||||||
QHG_LOCATION =
|
|
||||||
GENERATE_ECLIPSEHELP = NO
|
|
||||||
ECLIPSE_DOC_ID = org.doxygen.Project
|
|
||||||
DISABLE_INDEX = NO
|
|
||||||
GENERATE_TREEVIEW = NO
|
|
||||||
ENUM_VALUES_PER_LINE = 4
|
|
||||||
TREEVIEW_WIDTH = 250
|
|
||||||
EXT_LINKS_IN_WINDOW = NO
|
|
||||||
FORMULA_FONTSIZE = 10
|
|
||||||
FORMULA_TRANSPARENT = YES
|
|
||||||
USE_MATHJAX = NO
|
|
||||||
MATHJAX_FORMAT = HTML-CSS
|
|
||||||
MATHJAX_RELPATH = http://cdn.mathjax.org/mathjax/latest
|
|
||||||
MATHJAX_EXTENSIONS =
|
|
||||||
MATHJAX_CODEFILE =
|
|
||||||
SEARCHENGINE = YES
|
|
||||||
SERVER_BASED_SEARCH = NO
|
|
||||||
EXTERNAL_SEARCH = NO
|
|
||||||
SEARCHENGINE_URL =
|
|
||||||
SEARCHDATA_FILE = searchdata.xml
|
|
||||||
EXTERNAL_SEARCH_ID =
|
|
||||||
EXTRA_SEARCH_MAPPINGS =
|
|
||||||
|
|
||||||
GENERATE_LATEX = NO
|
|
||||||
GENERATE_RTF = NO
|
|
||||||
GENERATE_MAN = NO
|
|
||||||
GENERATE_DOCBOOK = NO
|
|
||||||
GENERATE_AUTOGEN_DEF = NO
|
|
||||||
GENERATE_PERLMOD = NO
|
|
||||||
CLASS_DIAGRAMS = NO
|
|
||||||
HAVE_DOT = NO
|
|
||||||
|
|
||||||
#---------------------------------------------------------------------------
|
|
||||||
# Configuration options related to the XML output
|
|
||||||
#---------------------------------------------------------------------------
|
|
||||||
GENERATE_XML = YES
|
|
||||||
XML_OUTPUT = $(XML_OUTPUT)
|
|
||||||
XML_PROGRAMLISTING = YES
|
|
||||||
|
|
||||||
#---------------------------------------------------------------------------
|
|
||||||
# Configuration options related to external references
|
|
||||||
#---------------------------------------------------------------------------
|
|
||||||
TAGFILES =
|
|
||||||
GENERATE_TAGFILE =
|
|
||||||
ALLEXTERNALS = NO
|
|
||||||
EXTERNAL_GROUPS = YES
|
|
||||||
EXTERNAL_PAGES = YES
|
|
||||||
PERL_PATH = /usr/bin/perl
|
|
||||||
@@ -1,11 +0,0 @@
|
|||||||
<xsl:stylesheet version="3.0"
|
|
||||||
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
|
|
||||||
xmlns:xs="http://www.w3.org/2001/XMLSchema"
|
|
||||||
exclude-result-prefixes="xs"
|
|
||||||
expand-text="yes">
|
|
||||||
|
|
||||||
<xsl:variable name="doc-ref" select="'static_string.ref'"/>
|
|
||||||
<xsl:variable name="doc-ns" select="'boost::static_strings'"/>
|
|
||||||
<xsl:variable name="include-private-members" select="false()"/>
|
|
||||||
|
|
||||||
</xsl:stylesheet>
|
|
||||||
19
example/static_cstring/Jamfile
Normal file
19
example/static_cstring/Jamfile
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
#
|
||||||
|
# Copyright (c) 2025 Gennaro Prota (gennaro dot prota at gmail dot com)
|
||||||
|
#
|
||||||
|
# Distributed under the Boost Software License, Version 1.0. (See accompanying
|
||||||
|
# file LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt)
|
||||||
|
#
|
||||||
|
# Official repository: https://github.com/boostorg/static_string
|
||||||
|
#
|
||||||
|
|
||||||
|
import testing ;
|
||||||
|
|
||||||
|
project
|
||||||
|
: requirements
|
||||||
|
<include>../../include
|
||||||
|
<warnings>extra
|
||||||
|
<cxxstd>20
|
||||||
|
;
|
||||||
|
|
||||||
|
run static_cstring_test.cpp ;
|
||||||
13
example/static_cstring/README.md
Normal file
13
example/static_cstring/README.md
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
This directory contains an experimental implementation of `basic_static_cstring`, which differs from `basic_static_string` in the following ways:
|
||||||
|
|
||||||
|
| | `basic_static_cstring` | `basic_static_string` |
|
||||||
|
|---------------------|------------------------|-----------------------|
|
||||||
|
| Layout | `sizeof == N + 1` | Has size member |
|
||||||
|
| Embedded NULs | Not supported | Supported |
|
||||||
|
| Trivially copyable | Yes | No |
|
||||||
|
|
||||||
|
Additionally, when `N <= UCHAR_MAX`, `basic_static_cstring` employs an optimization that avoids calling `std::strlen()` to compute the size.
|
||||||
|
|
||||||
|
This work stems from [boostorg/static_string#23](https://github.com/boostorg/static_string/issues/23).
|
||||||
|
|
||||||
|
If you believe `basic_static_cstring` should become part of the public API, please share your feedback on the Boost mailing list.
|
||||||
441
example/static_cstring/static_cstring.hpp
Normal file
441
example/static_cstring/static_cstring.hpp
Normal file
@@ -0,0 +1,441 @@
|
|||||||
|
//
|
||||||
|
// Copyright (c) 2025 Gennaro Prota (gennaro dot prota at gmail dot com)
|
||||||
|
//
|
||||||
|
// Distributed under the Boost Software License, Version 1.0. (See accompanying
|
||||||
|
// file LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt)
|
||||||
|
//
|
||||||
|
// Official repository: https://github.com/boostorg/static_string
|
||||||
|
//
|
||||||
|
|
||||||
|
#ifndef BOOST_STATIC_STRING_STATIC_CSTRING_HPP
|
||||||
|
#define BOOST_STATIC_STRING_STATIC_CSTRING_HPP
|
||||||
|
|
||||||
|
#include <boost/static_string/config.hpp>
|
||||||
|
#include <algorithm>
|
||||||
|
#include <climits>
|
||||||
|
#include <cstddef>
|
||||||
|
#include <ostream>
|
||||||
|
#include <string>
|
||||||
|
#include <string_view>
|
||||||
|
#include <stdexcept>
|
||||||
|
#include <type_traits>
|
||||||
|
|
||||||
|
namespace boost {
|
||||||
|
namespace static_strings {
|
||||||
|
|
||||||
|
namespace detail {
|
||||||
|
|
||||||
|
// Primary template: No remaining-capacity trick; uses traits::length() for length.
|
||||||
|
template<std::size_t N, typename CharT, typename Traits, bool UseRemaining>
|
||||||
|
class static_cstring_base
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
using traits_type = Traits;
|
||||||
|
using value_type = CharT;
|
||||||
|
using size_type = std::size_t;
|
||||||
|
|
||||||
|
value_type data_[N + 1]{};
|
||||||
|
|
||||||
|
constexpr size_type get_size() const noexcept
|
||||||
|
{
|
||||||
|
return traits_type::length(data_);
|
||||||
|
}
|
||||||
|
|
||||||
|
constexpr void set_size(size_type sz) noexcept
|
||||||
|
{
|
||||||
|
data_[sz] = value_type{};
|
||||||
|
}
|
||||||
|
|
||||||
|
// Defaulted comparisons for structural type support.
|
||||||
|
constexpr bool operator==(const static_cstring_base&) const noexcept = default;
|
||||||
|
constexpr auto operator<=>(const static_cstring_base&) const noexcept = default;
|
||||||
|
};
|
||||||
|
|
||||||
|
// Specialization for N <= UCHAR_MAX: Uses remaining-capacity trick.
|
||||||
|
template<std::size_t N, typename CharT, typename Traits>
|
||||||
|
class static_cstring_base<N, CharT, Traits, true>
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
using traits_type = Traits;
|
||||||
|
using value_type = CharT;
|
||||||
|
using size_type = std::size_t;
|
||||||
|
|
||||||
|
value_type data_[N + 1]{};
|
||||||
|
|
||||||
|
constexpr size_type get_size() const noexcept
|
||||||
|
{
|
||||||
|
return N - static_cast<unsigned char>(data_[N]);
|
||||||
|
}
|
||||||
|
|
||||||
|
constexpr void set_size(size_type sz) noexcept
|
||||||
|
{
|
||||||
|
data_[sz] = value_type{};
|
||||||
|
data_[N] = static_cast<value_type>(N - sz);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Defaulted comparisons for structural type support.
|
||||||
|
constexpr bool operator==(const static_cstring_base&) const noexcept = default;
|
||||||
|
constexpr auto operator<=>(const static_cstring_base&) const noexcept = default;
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace detail
|
||||||
|
|
||||||
|
template<std::size_t N, typename CharT = char, typename Traits = std::char_traits<CharT>>
|
||||||
|
class basic_static_cstring
|
||||||
|
: public detail::static_cstring_base<N, CharT, Traits, (N <= UCHAR_MAX)>
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
using base = detail::static_cstring_base<N, CharT, Traits, (N <= UCHAR_MAX)>;
|
||||||
|
using base::data_;
|
||||||
|
using base::get_size;
|
||||||
|
using base::set_size;
|
||||||
|
|
||||||
|
// Member types
|
||||||
|
using traits_type = Traits;
|
||||||
|
using value_type = CharT;
|
||||||
|
using size_type = std::size_t;
|
||||||
|
using difference_type = std::ptrdiff_t;
|
||||||
|
using reference = value_type&;
|
||||||
|
using const_reference = const value_type&;
|
||||||
|
using pointer = value_type*;
|
||||||
|
using const_pointer = const value_type*;
|
||||||
|
using iterator = pointer;
|
||||||
|
using const_iterator = const_pointer;
|
||||||
|
|
||||||
|
static constexpr size_type npos = static_cast<size_type>(-1);
|
||||||
|
static constexpr size_type static_capacity = N;
|
||||||
|
|
||||||
|
// Constructors.
|
||||||
|
constexpr basic_static_cstring() noexcept
|
||||||
|
{
|
||||||
|
set_size(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
constexpr basic_static_cstring(const CharT* s)
|
||||||
|
{
|
||||||
|
assign(s);
|
||||||
|
}
|
||||||
|
|
||||||
|
constexpr basic_static_cstring(const CharT* s, size_type count)
|
||||||
|
{
|
||||||
|
assign(s, count);
|
||||||
|
}
|
||||||
|
|
||||||
|
constexpr basic_static_cstring(size_type count, CharT ch)
|
||||||
|
{
|
||||||
|
assign(count, ch);
|
||||||
|
}
|
||||||
|
|
||||||
|
template<std::size_t M>
|
||||||
|
constexpr basic_static_cstring(const CharT (&arr)[M])
|
||||||
|
{
|
||||||
|
static_assert(M <= N + 1, "String literal too long for static_cstring");
|
||||||
|
assign(arr, M - 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
constexpr size_type size() const noexcept
|
||||||
|
{
|
||||||
|
return get_size();
|
||||||
|
}
|
||||||
|
|
||||||
|
constexpr size_type length() const noexcept
|
||||||
|
{
|
||||||
|
return size();
|
||||||
|
}
|
||||||
|
|
||||||
|
constexpr bool empty() const noexcept
|
||||||
|
{
|
||||||
|
return data_[0] == value_type{};
|
||||||
|
}
|
||||||
|
|
||||||
|
static constexpr size_type max_size() noexcept
|
||||||
|
{
|
||||||
|
return N;
|
||||||
|
}
|
||||||
|
|
||||||
|
static constexpr size_type capacity() noexcept
|
||||||
|
{
|
||||||
|
return N;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Element access.
|
||||||
|
constexpr reference operator[](size_type pos) noexcept
|
||||||
|
{
|
||||||
|
return data_[pos];
|
||||||
|
}
|
||||||
|
|
||||||
|
constexpr const_reference operator[](size_type pos) const noexcept
|
||||||
|
{
|
||||||
|
return data_[pos];
|
||||||
|
}
|
||||||
|
|
||||||
|
constexpr reference at(size_type pos)
|
||||||
|
{
|
||||||
|
if (pos >= size())
|
||||||
|
{
|
||||||
|
throw std::out_of_range("static_cstring::at");
|
||||||
|
}
|
||||||
|
return data_[pos];
|
||||||
|
}
|
||||||
|
|
||||||
|
constexpr const_reference at(size_type pos) const
|
||||||
|
{
|
||||||
|
if (pos >= size())
|
||||||
|
{
|
||||||
|
throw std::out_of_range("static_cstring::at");
|
||||||
|
}
|
||||||
|
return data_[pos];
|
||||||
|
}
|
||||||
|
|
||||||
|
constexpr reference front() noexcept
|
||||||
|
{
|
||||||
|
BOOST_STATIC_STRING_ASSERT(!empty());
|
||||||
|
return data_[0];
|
||||||
|
}
|
||||||
|
|
||||||
|
constexpr const_reference front() const noexcept
|
||||||
|
{
|
||||||
|
BOOST_STATIC_STRING_ASSERT(!empty());
|
||||||
|
return data_[0];
|
||||||
|
}
|
||||||
|
|
||||||
|
constexpr reference back() noexcept
|
||||||
|
{
|
||||||
|
BOOST_STATIC_STRING_ASSERT(!empty());
|
||||||
|
return data_[size() - 1];
|
||||||
|
}
|
||||||
|
|
||||||
|
constexpr const_reference back() const noexcept
|
||||||
|
{
|
||||||
|
BOOST_STATIC_STRING_ASSERT(!empty());
|
||||||
|
return data_[size() - 1];
|
||||||
|
}
|
||||||
|
|
||||||
|
constexpr pointer data() noexcept
|
||||||
|
{
|
||||||
|
return data_;
|
||||||
|
}
|
||||||
|
|
||||||
|
constexpr const_pointer data() const noexcept
|
||||||
|
{
|
||||||
|
return data_;
|
||||||
|
}
|
||||||
|
|
||||||
|
constexpr const_pointer c_str() const noexcept
|
||||||
|
{
|
||||||
|
return data_;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Iterators.
|
||||||
|
constexpr iterator begin() noexcept
|
||||||
|
{
|
||||||
|
return data_;
|
||||||
|
}
|
||||||
|
|
||||||
|
constexpr const_iterator begin() const noexcept
|
||||||
|
{
|
||||||
|
return data_;
|
||||||
|
}
|
||||||
|
|
||||||
|
constexpr const_iterator cbegin() const noexcept
|
||||||
|
{
|
||||||
|
return data_;
|
||||||
|
}
|
||||||
|
|
||||||
|
constexpr iterator end() noexcept
|
||||||
|
{
|
||||||
|
return data_ + size();
|
||||||
|
}
|
||||||
|
|
||||||
|
constexpr const_iterator end() const noexcept
|
||||||
|
{
|
||||||
|
return data_ + size();
|
||||||
|
}
|
||||||
|
|
||||||
|
constexpr const_iterator cend() const noexcept
|
||||||
|
{
|
||||||
|
return data_ + size();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Modifiers.
|
||||||
|
constexpr void clear() noexcept
|
||||||
|
{
|
||||||
|
set_size(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
constexpr basic_static_cstring& assign(const CharT* s)
|
||||||
|
{
|
||||||
|
return assign(s, traits_type::length(s));
|
||||||
|
}
|
||||||
|
|
||||||
|
constexpr basic_static_cstring& assign(const CharT* s, size_type count)
|
||||||
|
{
|
||||||
|
if (count > N)
|
||||||
|
{
|
||||||
|
throw std::length_error("static_cstring::assign");
|
||||||
|
}
|
||||||
|
traits_type::copy(data_, s, count);
|
||||||
|
set_size(count);
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
constexpr basic_static_cstring& assign(size_type count, CharT ch)
|
||||||
|
{
|
||||||
|
if (count > N)
|
||||||
|
{
|
||||||
|
throw std::length_error("static_cstring::assign");
|
||||||
|
}
|
||||||
|
traits_type::assign(data_, count, ch);
|
||||||
|
set_size(count);
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
constexpr basic_static_cstring& operator=(const CharT* s)
|
||||||
|
{
|
||||||
|
return assign(s);
|
||||||
|
}
|
||||||
|
|
||||||
|
constexpr void push_back(CharT ch)
|
||||||
|
{
|
||||||
|
const size_type sz = size();
|
||||||
|
if (sz >= N)
|
||||||
|
{
|
||||||
|
throw std::length_error("static_cstring::push_back");
|
||||||
|
}
|
||||||
|
data_[sz] = ch;
|
||||||
|
set_size(sz + 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
constexpr void pop_back() noexcept
|
||||||
|
{
|
||||||
|
BOOST_STATIC_STRING_ASSERT(!empty());
|
||||||
|
set_size(size() - 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
constexpr basic_static_cstring& append(const CharT* s)
|
||||||
|
{
|
||||||
|
return append(s, traits_type::length(s));
|
||||||
|
}
|
||||||
|
|
||||||
|
constexpr basic_static_cstring& append(const CharT* s, size_type count)
|
||||||
|
{
|
||||||
|
const size_type sz = size();
|
||||||
|
if (sz + count > N)
|
||||||
|
{
|
||||||
|
throw std::length_error("static_cstring::append");
|
||||||
|
}
|
||||||
|
traits_type::copy(data_ + sz, s, count);
|
||||||
|
set_size(sz + count);
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
constexpr basic_static_cstring& append(size_type count, CharT ch)
|
||||||
|
{
|
||||||
|
const size_type sz = size();
|
||||||
|
if (sz + count > N)
|
||||||
|
{
|
||||||
|
throw std::length_error("static_cstring::append");
|
||||||
|
}
|
||||||
|
traits_type::assign(data_ + sz, count, ch);
|
||||||
|
set_size(sz + count);
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
constexpr basic_static_cstring& operator+=(const CharT* s)
|
||||||
|
{
|
||||||
|
return append(s);
|
||||||
|
}
|
||||||
|
|
||||||
|
constexpr basic_static_cstring& operator+=(CharT ch)
|
||||||
|
{
|
||||||
|
push_back(ch);
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Comparisons.
|
||||||
|
constexpr int compare(const basic_static_cstring& other) const noexcept
|
||||||
|
{
|
||||||
|
const size_type lhs_sz = size();
|
||||||
|
const size_type rhs_sz = other.size();
|
||||||
|
const int result = traits_type::compare(data_, other.data_, (std::min)(lhs_sz, rhs_sz));
|
||||||
|
|
||||||
|
return result != 0
|
||||||
|
? result
|
||||||
|
: lhs_sz < rhs_sz
|
||||||
|
? -1
|
||||||
|
: lhs_sz > rhs_sz
|
||||||
|
? 1
|
||||||
|
: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
constexpr int compare(const CharT* s) const noexcept
|
||||||
|
{
|
||||||
|
return compare(basic_static_cstring(s));
|
||||||
|
}
|
||||||
|
|
||||||
|
// Conversions.
|
||||||
|
constexpr operator std::basic_string_view<CharT, Traits>() const noexcept
|
||||||
|
{
|
||||||
|
return {data_, size()};
|
||||||
|
}
|
||||||
|
|
||||||
|
std::basic_string<CharT, Traits> str() const
|
||||||
|
{
|
||||||
|
return {data_, size()};
|
||||||
|
}
|
||||||
|
|
||||||
|
// Swap.
|
||||||
|
constexpr void swap(basic_static_cstring& other) noexcept
|
||||||
|
{
|
||||||
|
basic_static_cstring tmp = *this;
|
||||||
|
*this = other;
|
||||||
|
other = tmp;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Defaulted comparisons for structural type (C++20).
|
||||||
|
constexpr bool operator==(const basic_static_cstring&) const noexcept = default;
|
||||||
|
constexpr auto operator<=>(const basic_static_cstring&) const noexcept = default;
|
||||||
|
};
|
||||||
|
|
||||||
|
#if defined(BOOST_STATIC_STRING_USE_DEDUCT)
|
||||||
|
|
||||||
|
// Deduction guide.
|
||||||
|
template<std::size_t N, typename CharT>
|
||||||
|
basic_static_cstring(const CharT(&)[N]) -> basic_static_cstring<N - 1, CharT>;
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// Comparison with const CharT*.
|
||||||
|
template<std::size_t N, typename CharT, typename Traits>
|
||||||
|
constexpr bool operator==(const basic_static_cstring<N, CharT, Traits>& lhs,
|
||||||
|
const CharT* rhs) noexcept
|
||||||
|
{
|
||||||
|
return lhs.compare(rhs) == 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
template<std::size_t N, typename CharT, typename Traits>
|
||||||
|
constexpr bool operator==(const CharT* lhs,
|
||||||
|
const basic_static_cstring<N, CharT, Traits>& rhs) noexcept
|
||||||
|
{
|
||||||
|
return rhs.compare(lhs) == 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Stream output.
|
||||||
|
template<std::size_t N, typename CharT, typename Traits>
|
||||||
|
std::basic_ostream<CharT, Traits>& operator<<(std::basic_ostream<CharT, Traits>& os,
|
||||||
|
const basic_static_cstring<N, CharT, Traits>& str)
|
||||||
|
{
|
||||||
|
return os << str.c_str();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Alias templates.
|
||||||
|
template<std::size_t N>
|
||||||
|
using static_cstring = basic_static_cstring<N, char>;
|
||||||
|
|
||||||
|
template<std::size_t N>
|
||||||
|
using static_wcstring = basic_static_cstring<N, wchar_t>;
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
671
example/static_cstring/static_cstring_test.cpp
Normal file
671
example/static_cstring/static_cstring_test.cpp
Normal file
@@ -0,0 +1,671 @@
|
|||||||
|
//
|
||||||
|
// Copyright (c) 2025 Gennaro Prota (gennaro dot prota at gmail dot com)
|
||||||
|
//
|
||||||
|
// Distributed under the Boost Software License, Version 1.0. (See accompanying
|
||||||
|
// file LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt)
|
||||||
|
//
|
||||||
|
// Official repository: https://github.com/boostorg/static_string
|
||||||
|
//
|
||||||
|
|
||||||
|
#include "static_cstring.hpp"
|
||||||
|
|
||||||
|
#include <boost/core/lightweight_test.hpp>
|
||||||
|
#include <climits>
|
||||||
|
#include <cstring>
|
||||||
|
#include <sstream>
|
||||||
|
#include <string>
|
||||||
|
#include <string_view>
|
||||||
|
#include <type_traits>
|
||||||
|
|
||||||
|
namespace boost {
|
||||||
|
namespace static_strings {
|
||||||
|
|
||||||
|
static
|
||||||
|
void
|
||||||
|
testCStringSizeGuarantee()
|
||||||
|
{
|
||||||
|
// Core guarantee: sizeof is exactly N + 1 (no size member).
|
||||||
|
static_assert(sizeof(static_cstring<0>) == 1, "");
|
||||||
|
static_assert(sizeof(static_cstring<1>) == 2, "");
|
||||||
|
static_assert(sizeof(static_cstring<10>) == 11, "");
|
||||||
|
static_assert(sizeof(static_cstring<63>) == 64, "");
|
||||||
|
static_assert(sizeof(static_cstring<64>) == 65, "");
|
||||||
|
static_assert(sizeof(static_cstring<127>) == 128, "");
|
||||||
|
static_assert(sizeof(static_cstring<UCHAR_MAX>) == (UCHAR_MAX + 1), "");
|
||||||
|
static_assert(sizeof(static_cstring<UCHAR_MAX + 1>) == (UCHAR_MAX + 2), "");
|
||||||
|
static_assert(sizeof(static_cstring<1000>) == 1001, "");
|
||||||
|
}
|
||||||
|
|
||||||
|
static
|
||||||
|
void
|
||||||
|
testCStringRemainingCapacityTrick()
|
||||||
|
{
|
||||||
|
// Test the remaining-capacity optimization for N <= UCHAR_MAX.
|
||||||
|
|
||||||
|
// Full capacity: Last byte is both null terminator AND remaining == 0.
|
||||||
|
{
|
||||||
|
static_cstring<5> full("12345");
|
||||||
|
BOOST_TEST(full.size() == 5);
|
||||||
|
BOOST_TEST(full.capacity() == 5);
|
||||||
|
BOOST_TEST(full.data()[5] == '\0');
|
||||||
|
BOOST_TEST(std::strcmp(full.c_str(), "12345") == 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Partial fill: Null terminator at position size, remaining at position N.
|
||||||
|
{
|
||||||
|
static_cstring<10> partial("Hi");
|
||||||
|
BOOST_TEST(partial.size() == 2);
|
||||||
|
BOOST_TEST(partial.capacity() == 10);
|
||||||
|
BOOST_TEST(partial.data()[2] == '\0');
|
||||||
|
BOOST_TEST(static_cast<unsigned char>(partial.data()[10]) == 8);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Empty string.
|
||||||
|
{
|
||||||
|
static_cstring<10> empty;
|
||||||
|
BOOST_TEST(empty.size() == 0);
|
||||||
|
BOOST_TEST(empty.capacity() == 10);
|
||||||
|
BOOST_TEST(empty.data()[0] == '\0');
|
||||||
|
BOOST_TEST(static_cast<unsigned char>(empty.data()[10]) == 10);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Edge case: N == UCHAR_MAX (max for our trick).
|
||||||
|
{
|
||||||
|
static_cstring<UCHAR_MAX> large;
|
||||||
|
large.assign(100, 'x');
|
||||||
|
BOOST_TEST(large.size() == 100);
|
||||||
|
BOOST_TEST(large.capacity() == UCHAR_MAX);
|
||||||
|
BOOST_TEST(static_cast<unsigned char>(large.data()[UCHAR_MAX]) == (UCHAR_MAX - large.size()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename S>
|
||||||
|
struct CStringTypeTraits
|
||||||
|
{
|
||||||
|
static_assert(std::is_trivially_copyable<S>::value);
|
||||||
|
static_assert(std::is_trivially_copy_constructible<S>::value);
|
||||||
|
static_assert(std::is_trivially_move_constructible<S>::value);
|
||||||
|
static_assert(std::is_trivially_copy_assignable<S>::value);
|
||||||
|
static_assert(std::is_trivially_move_assignable<S>::value);
|
||||||
|
static_assert(std::is_trivially_destructible<S>::value);
|
||||||
|
};
|
||||||
|
|
||||||
|
static
|
||||||
|
void
|
||||||
|
testCStringTypeTraits()
|
||||||
|
{
|
||||||
|
{
|
||||||
|
using S = static_cstring<0>;
|
||||||
|
CStringTypeTraits< S > check;
|
||||||
|
static_cast<void>(check);
|
||||||
|
}
|
||||||
|
{
|
||||||
|
using S = static_cstring<63>;
|
||||||
|
CStringTypeTraits< S > check;
|
||||||
|
static_cast<void>(check);
|
||||||
|
}
|
||||||
|
{
|
||||||
|
using S = static_cstring<300>;
|
||||||
|
CStringTypeTraits< S > check;
|
||||||
|
static_cast<void>(check);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static
|
||||||
|
void
|
||||||
|
testCStringConstruct()
|
||||||
|
{
|
||||||
|
// Default construction.
|
||||||
|
{
|
||||||
|
static_cstring<1> s;
|
||||||
|
BOOST_TEST(s.empty());
|
||||||
|
BOOST_TEST(s.size() == 0);
|
||||||
|
BOOST_TEST(s == "");
|
||||||
|
BOOST_TEST(*s.end() == 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Construct with count and char.
|
||||||
|
{
|
||||||
|
static_cstring<4> s1(3, 'x');
|
||||||
|
BOOST_TEST(!s1.empty());
|
||||||
|
BOOST_TEST(s1.size() == 3);
|
||||||
|
BOOST_TEST(s1 == "xxx");
|
||||||
|
BOOST_TEST(*s1.end() == 0);
|
||||||
|
BOOST_TEST_THROWS(
|
||||||
|
(static_cstring<2>(3, 'x')),
|
||||||
|
std::length_error);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Construct from a C string.
|
||||||
|
{
|
||||||
|
static_cstring<5> s1("12345");
|
||||||
|
BOOST_TEST(s1.size() == 5);
|
||||||
|
BOOST_TEST(s1 == "12345");
|
||||||
|
BOOST_TEST(*s1.end() == 0);
|
||||||
|
BOOST_TEST_THROWS(
|
||||||
|
(static_cstring<4>("12345")),
|
||||||
|
std::length_error);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Construct from a C string with count.
|
||||||
|
{
|
||||||
|
static_cstring<5> s1("UVXYZ", 3);
|
||||||
|
BOOST_TEST(s1 == "UVX");
|
||||||
|
BOOST_TEST(*s1.end() == 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Copy construction.
|
||||||
|
{
|
||||||
|
static_cstring<5> s1("12345");
|
||||||
|
static_cstring<5> s2(s1);
|
||||||
|
BOOST_TEST(s2 == "12345");
|
||||||
|
BOOST_TEST(*s2.end() == 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static
|
||||||
|
void
|
||||||
|
testCStringAssignment()
|
||||||
|
{
|
||||||
|
// assign(size_type count, CharT ch).
|
||||||
|
BOOST_TEST(static_cstring<3>{}.assign(1, '*') == "*");
|
||||||
|
BOOST_TEST(static_cstring<3>{}.assign(3, '*') == "***");
|
||||||
|
BOOST_TEST(static_cstring<3>{"abc"}.assign(3, '*') == "***");
|
||||||
|
BOOST_TEST_THROWS(static_cstring<1>{"a"}.assign(2, '*'), std::length_error);
|
||||||
|
|
||||||
|
// assign(CharT const* s, size_type count).
|
||||||
|
BOOST_TEST(static_cstring<3>{}.assign("abc", 3) == "abc");
|
||||||
|
BOOST_TEST(static_cstring<3>{"*"}.assign("abc", 3) == "abc");
|
||||||
|
BOOST_TEST_THROWS(static_cstring<1>{}.assign("abc", 3), std::length_error);
|
||||||
|
|
||||||
|
// assign(CharT const* s).
|
||||||
|
BOOST_TEST(static_cstring<3>{}.assign("abc") == "abc");
|
||||||
|
BOOST_TEST(static_cstring<3>{"*"}.assign("abc") == "abc");
|
||||||
|
BOOST_TEST_THROWS(static_cstring<1>{}.assign("abc"), std::length_error);
|
||||||
|
|
||||||
|
// operator=(const CharT* s).
|
||||||
|
{
|
||||||
|
static_cstring<3> s1;
|
||||||
|
s1 = "123";
|
||||||
|
BOOST_TEST(s1 == "123");
|
||||||
|
BOOST_TEST(*s1.end() == 0);
|
||||||
|
static_cstring<1> s2;
|
||||||
|
BOOST_TEST_THROWS(
|
||||||
|
s2 = "123",
|
||||||
|
std::length_error);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Copy assignment.
|
||||||
|
{
|
||||||
|
static_cstring<3> s1("123");
|
||||||
|
static_cstring<3> s2;
|
||||||
|
s2 = s1;
|
||||||
|
BOOST_TEST(s2 == "123");
|
||||||
|
BOOST_TEST(*s2.end() == 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static
|
||||||
|
void
|
||||||
|
testCStringElements()
|
||||||
|
{
|
||||||
|
using ccs3 = static_cstring<3> const;
|
||||||
|
|
||||||
|
// at(size_type pos).
|
||||||
|
BOOST_TEST(static_cstring<3>{"abc"}.at(0) == 'a');
|
||||||
|
BOOST_TEST(static_cstring<3>{"abc"}.at(2) == 'c');
|
||||||
|
BOOST_TEST_THROWS(static_cstring<3>{""}.at(0), std::out_of_range);
|
||||||
|
BOOST_TEST_THROWS(static_cstring<3>{"abc"}.at(4), std::out_of_range);
|
||||||
|
|
||||||
|
// at(size_type pos) const.
|
||||||
|
BOOST_TEST(ccs3{"abc"}.at(0) == 'a');
|
||||||
|
BOOST_TEST(ccs3{"abc"}.at(2) == 'c');
|
||||||
|
BOOST_TEST_THROWS(ccs3{""}.at(0), std::out_of_range);
|
||||||
|
|
||||||
|
// operator[](size_type pos).
|
||||||
|
BOOST_TEST(static_cstring<3>{"abc"}[0] == 'a');
|
||||||
|
BOOST_TEST(static_cstring<3>{"abc"}[2] == 'c');
|
||||||
|
BOOST_TEST(static_cstring<3>{"abc"}[3] == 0);
|
||||||
|
BOOST_TEST(static_cstring<3>{""}[0] == 0);
|
||||||
|
|
||||||
|
// front() / back().
|
||||||
|
BOOST_TEST(static_cstring<3>{"abc"}.front() == 'a');
|
||||||
|
BOOST_TEST(static_cstring<3>{"abc"}.back() == 'c');
|
||||||
|
|
||||||
|
// data() / c_str().
|
||||||
|
{
|
||||||
|
static_cstring<3> s("123");
|
||||||
|
BOOST_TEST(std::memcmp(s.data(), "123", 3) == 0);
|
||||||
|
BOOST_TEST(std::memcmp(s.c_str(), "123\0", 4) == 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Modification through element access.
|
||||||
|
{
|
||||||
|
static_cstring<5> s("12345");
|
||||||
|
s[1] = '_';
|
||||||
|
BOOST_TEST(s == "1_345");
|
||||||
|
s.front() = 'A';
|
||||||
|
BOOST_TEST(s == "A_345");
|
||||||
|
s.back() = 'Z';
|
||||||
|
BOOST_TEST(s == "A_34Z");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static
|
||||||
|
void
|
||||||
|
testCStringIterators()
|
||||||
|
{
|
||||||
|
{
|
||||||
|
static_cstring<3> s;
|
||||||
|
BOOST_TEST(std::distance(s.begin(), s.end()) == 0);
|
||||||
|
s = "123";
|
||||||
|
BOOST_TEST(std::distance(s.begin(), s.end()) == 3);
|
||||||
|
}
|
||||||
|
{
|
||||||
|
static_cstring<3> const s("123");
|
||||||
|
BOOST_TEST(std::distance(s.begin(), s.end()) == 3);
|
||||||
|
BOOST_TEST(std::distance(s.cbegin(), s.cend()) == 3);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Iteration.
|
||||||
|
{
|
||||||
|
static_cstring<5> s("hello");
|
||||||
|
std::string result;
|
||||||
|
for (const char c : s)
|
||||||
|
{
|
||||||
|
result += c;
|
||||||
|
}
|
||||||
|
BOOST_TEST(result == "hello");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static
|
||||||
|
void
|
||||||
|
testCStringCapacity()
|
||||||
|
{
|
||||||
|
// empty().
|
||||||
|
BOOST_TEST(static_cstring<0>{}.empty());
|
||||||
|
BOOST_TEST(static_cstring<1>{}.empty());
|
||||||
|
BOOST_TEST(!static_cstring<1>{"a"}.empty());
|
||||||
|
|
||||||
|
// size().
|
||||||
|
BOOST_TEST(static_cstring<0>{}.size() == 0);
|
||||||
|
BOOST_TEST(static_cstring<1>{"a"}.size() == 1);
|
||||||
|
BOOST_TEST(static_cstring<5>{"abc"}.size() == 3);
|
||||||
|
|
||||||
|
// length().
|
||||||
|
BOOST_TEST(static_cstring<0>{}.length() == 0);
|
||||||
|
BOOST_TEST(static_cstring<3>{"abc"}.length() == 3);
|
||||||
|
|
||||||
|
// max_size().
|
||||||
|
BOOST_TEST(static_cstring<0>{}.max_size() == 0);
|
||||||
|
BOOST_TEST(static_cstring<5>{"abc"}.max_size() == 5);
|
||||||
|
|
||||||
|
// capacity().
|
||||||
|
BOOST_TEST(static_cstring<0>{}.capacity() == 0);
|
||||||
|
BOOST_TEST(static_cstring<5>{"abc"}.capacity() == 5);
|
||||||
|
}
|
||||||
|
|
||||||
|
static
|
||||||
|
void
|
||||||
|
testCStringClear()
|
||||||
|
{
|
||||||
|
static_cstring<3> s("123");
|
||||||
|
BOOST_TEST(!s.empty());
|
||||||
|
s.clear();
|
||||||
|
BOOST_TEST(s.empty());
|
||||||
|
BOOST_TEST(s.size() == 0);
|
||||||
|
BOOST_TEST(*s.end() == 0);
|
||||||
|
BOOST_TEST(s == "");
|
||||||
|
}
|
||||||
|
|
||||||
|
static
|
||||||
|
void
|
||||||
|
testCStringPushPop()
|
||||||
|
{
|
||||||
|
// push_back().
|
||||||
|
{
|
||||||
|
static_cstring<5> s("abc");
|
||||||
|
s.push_back('d');
|
||||||
|
BOOST_TEST(s == "abcd");
|
||||||
|
BOOST_TEST(s.size() == 4);
|
||||||
|
BOOST_TEST(*s.end() == 0);
|
||||||
|
|
||||||
|
s.push_back('e');
|
||||||
|
BOOST_TEST(s == "abcde");
|
||||||
|
BOOST_TEST(s.size() == 5);
|
||||||
|
|
||||||
|
BOOST_TEST_THROWS(s.push_back('f'), std::length_error);
|
||||||
|
}
|
||||||
|
|
||||||
|
// pop_back().
|
||||||
|
{
|
||||||
|
static_cstring<5> s("abcde");
|
||||||
|
s.pop_back();
|
||||||
|
BOOST_TEST(s == "abcd");
|
||||||
|
BOOST_TEST(s.size() == 4);
|
||||||
|
BOOST_TEST(*s.end() == 0);
|
||||||
|
|
||||||
|
s.pop_back();
|
||||||
|
s.pop_back();
|
||||||
|
s.pop_back();
|
||||||
|
s.pop_back();
|
||||||
|
BOOST_TEST(s.empty());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static
|
||||||
|
void
|
||||||
|
testCStringAppend()
|
||||||
|
{
|
||||||
|
// append(const CharT* s).
|
||||||
|
{
|
||||||
|
static_cstring<12> s("Hello");
|
||||||
|
s.append(", World");
|
||||||
|
BOOST_TEST(s == "Hello, World");
|
||||||
|
BOOST_TEST(*s.end() == 0);
|
||||||
|
}
|
||||||
|
{
|
||||||
|
static_cstring<5> s("abc");
|
||||||
|
BOOST_TEST_THROWS(s.append("def"), std::length_error);
|
||||||
|
}
|
||||||
|
|
||||||
|
// append(const CharT* s, size_type count)
|
||||||
|
{
|
||||||
|
static_cstring<10> s("abc");
|
||||||
|
s.append("defgh", 3);
|
||||||
|
BOOST_TEST(s == "abcdef");
|
||||||
|
BOOST_TEST(*s.end() == 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
// append(size_type count, CharT ch)
|
||||||
|
{
|
||||||
|
static_cstring<10> s("abc");
|
||||||
|
s.append(3, 'x');
|
||||||
|
BOOST_TEST(s == "abcxxx");
|
||||||
|
BOOST_TEST(*s.end() == 0);
|
||||||
|
BOOST_TEST_THROWS(s.append(5, 'y'), std::length_error);
|
||||||
|
}
|
||||||
|
|
||||||
|
// operator+=()
|
||||||
|
{
|
||||||
|
static_cstring<10> s("abc");
|
||||||
|
s += "def";
|
||||||
|
BOOST_TEST(s == "abcdef");
|
||||||
|
s += 'g';
|
||||||
|
BOOST_TEST(s == "abcdefg");
|
||||||
|
BOOST_TEST(*s.end() == 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static
|
||||||
|
void
|
||||||
|
testCStringComparison()
|
||||||
|
{
|
||||||
|
// operator==() / operator!=().
|
||||||
|
{
|
||||||
|
static_cstring<10> a("abc");
|
||||||
|
static_cstring<10> b("abc");
|
||||||
|
static_cstring<10> c("abd");
|
||||||
|
|
||||||
|
BOOST_TEST(a == b);
|
||||||
|
BOOST_TEST(!(a == c));
|
||||||
|
BOOST_TEST(a != c);
|
||||||
|
BOOST_TEST(!(a != b));
|
||||||
|
}
|
||||||
|
|
||||||
|
// operator<(), <=(), >(), >=().
|
||||||
|
{
|
||||||
|
static_cstring<10> a("abc");
|
||||||
|
static_cstring<10> b("abd");
|
||||||
|
|
||||||
|
BOOST_TEST(a < b);
|
||||||
|
BOOST_TEST(a <= b);
|
||||||
|
BOOST_TEST(a <= a);
|
||||||
|
BOOST_TEST(b > a);
|
||||||
|
BOOST_TEST(b >= a);
|
||||||
|
BOOST_TEST(b >= b);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Comparison with CharT const*.
|
||||||
|
{
|
||||||
|
static_cstring<10> s("hello");
|
||||||
|
BOOST_TEST(s == "hello");
|
||||||
|
BOOST_TEST("hello" == s);
|
||||||
|
BOOST_TEST(s != "world");
|
||||||
|
BOOST_TEST("world" != s);
|
||||||
|
}
|
||||||
|
|
||||||
|
// compare().
|
||||||
|
{
|
||||||
|
static_cstring<10> s("abc");
|
||||||
|
BOOST_TEST(s.compare("abc") == 0);
|
||||||
|
BOOST_TEST(s.compare("abd") < 0);
|
||||||
|
BOOST_TEST(s.compare("abb") > 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static
|
||||||
|
void
|
||||||
|
testCStringConversion()
|
||||||
|
{
|
||||||
|
// operator string_view().
|
||||||
|
{
|
||||||
|
static_cstring<10> s("hello");
|
||||||
|
std::string_view sv = s;
|
||||||
|
BOOST_TEST(sv == "hello");
|
||||||
|
BOOST_TEST(sv.size() == 5);
|
||||||
|
}
|
||||||
|
|
||||||
|
// str().
|
||||||
|
{
|
||||||
|
static_cstring<10> s("hello");
|
||||||
|
std::string str = s.str();
|
||||||
|
BOOST_TEST(str == "hello");
|
||||||
|
BOOST_TEST(str.size() == 5);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static
|
||||||
|
void
|
||||||
|
testCStringStream()
|
||||||
|
{
|
||||||
|
static_cstring<10> s("hello");
|
||||||
|
std::ostringstream oss;
|
||||||
|
oss << s;
|
||||||
|
BOOST_TEST(oss.str() == "hello");
|
||||||
|
}
|
||||||
|
|
||||||
|
static
|
||||||
|
void
|
||||||
|
testCStringSwap()
|
||||||
|
{
|
||||||
|
static_cstring<10> a("hello");
|
||||||
|
static_cstring<10> b("world");
|
||||||
|
|
||||||
|
a.swap(b);
|
||||||
|
|
||||||
|
BOOST_TEST(a == "world");
|
||||||
|
BOOST_TEST(b == "hello");
|
||||||
|
}
|
||||||
|
|
||||||
|
static
|
||||||
|
void
|
||||||
|
testCStringConstexpr()
|
||||||
|
{
|
||||||
|
// constexpr construction and operations.
|
||||||
|
constexpr static_cstring<10> ce("test");
|
||||||
|
static_assert(ce.size() == 4, "");
|
||||||
|
static_assert(ce[0] == 't', "");
|
||||||
|
static_assert(ce[1] == 'e', "");
|
||||||
|
static_assert(ce[2] == 's', "");
|
||||||
|
static_assert(ce[3] == 't', "");
|
||||||
|
static_assert(!ce.empty(), "");
|
||||||
|
static_assert(ce.max_size() == 10, "");
|
||||||
|
static_assert(ce.capacity() == 10, "");
|
||||||
|
|
||||||
|
constexpr static_cstring<5> ce_empty;
|
||||||
|
static_assert(ce_empty.empty(), "");
|
||||||
|
static_assert(ce_empty.size() == 0, "");
|
||||||
|
}
|
||||||
|
|
||||||
|
// Helper struct to test NTTP.
|
||||||
|
template<basic_static_cstring S>
|
||||||
|
struct NTTPHelper
|
||||||
|
{
|
||||||
|
static constexpr std::size_t size() noexcept
|
||||||
|
{
|
||||||
|
return S.size();
|
||||||
|
}
|
||||||
|
|
||||||
|
static constexpr const char* c_str() noexcept
|
||||||
|
{
|
||||||
|
return S.c_str();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
static
|
||||||
|
void
|
||||||
|
testCStringNTTP()
|
||||||
|
{
|
||||||
|
// Test non-type template parameter usage (C++20).
|
||||||
|
|
||||||
|
// Test size deduction from string literals.
|
||||||
|
BOOST_TEST(NTTPHelper<"hello">::size() == 5);
|
||||||
|
BOOST_TEST(NTTPHelper<"">::size() == 0);
|
||||||
|
BOOST_TEST(NTTPHelper<"test">::size() == 4);
|
||||||
|
|
||||||
|
// Test that different strings create different types
|
||||||
|
constexpr bool same_type = std::is_same_v<
|
||||||
|
NTTPHelper<"hello">,
|
||||||
|
NTTPHelper<"hello">>;
|
||||||
|
BOOST_TEST(same_type);
|
||||||
|
|
||||||
|
constexpr bool different_type = !std::is_same_v<
|
||||||
|
NTTPHelper<"hello">,
|
||||||
|
NTTPHelper<"world">>;
|
||||||
|
BOOST_TEST(different_type);
|
||||||
|
|
||||||
|
// Test constexpr access.
|
||||||
|
constexpr std::size_t len = NTTPHelper<"constexpr">::size();
|
||||||
|
static_assert(len == 9, "");
|
||||||
|
}
|
||||||
|
|
||||||
|
static
|
||||||
|
void
|
||||||
|
testCStringPODUsage()
|
||||||
|
{
|
||||||
|
// Test usage in POD types (the original motivation).
|
||||||
|
struct UserRecord
|
||||||
|
{
|
||||||
|
int id;
|
||||||
|
static_cstring<63> name;
|
||||||
|
unsigned int flags;
|
||||||
|
};
|
||||||
|
|
||||||
|
static_assert(sizeof(static_cstring<63>) == 64, "");
|
||||||
|
static_assert(std::is_trivially_copyable<UserRecord>::value, "");
|
||||||
|
|
||||||
|
UserRecord user{};
|
||||||
|
user.id = 42;
|
||||||
|
user.name = "Alice";
|
||||||
|
user.flags = 0xFF;
|
||||||
|
|
||||||
|
BOOST_TEST(user.id == 42);
|
||||||
|
BOOST_TEST(user.name.size() == 5);
|
||||||
|
BOOST_TEST(user.name == "Alice");
|
||||||
|
BOOST_TEST(user.flags == 0xFF);
|
||||||
|
|
||||||
|
// Copy the struct.
|
||||||
|
UserRecord copy = user;
|
||||||
|
BOOST_TEST(copy.name == "Alice");
|
||||||
|
|
||||||
|
// memcpy() should work.
|
||||||
|
UserRecord memcpy_dest;
|
||||||
|
std::memcpy(&memcpy_dest, &user, sizeof(UserRecord));
|
||||||
|
BOOST_TEST(memcpy_dest.name == "Alice");
|
||||||
|
}
|
||||||
|
|
||||||
|
static
|
||||||
|
void
|
||||||
|
testCStringLargeCapacity()
|
||||||
|
{
|
||||||
|
// Test strings with N > UCHAR_MAX (no remaining-capacity trick).
|
||||||
|
{
|
||||||
|
static_cstring<300> s;
|
||||||
|
BOOST_TEST(s.empty());
|
||||||
|
BOOST_TEST(s.size() == 0);
|
||||||
|
|
||||||
|
s = "This is a test string";
|
||||||
|
BOOST_TEST(s.size() == 21);
|
||||||
|
BOOST_TEST(s == "This is a test string");
|
||||||
|
|
||||||
|
s.clear();
|
||||||
|
BOOST_TEST(s.empty());
|
||||||
|
}
|
||||||
|
|
||||||
|
// Large string operations.
|
||||||
|
{
|
||||||
|
static_cstring<500> s;
|
||||||
|
s.assign(400, 'x');
|
||||||
|
BOOST_TEST(s.size() == 400);
|
||||||
|
BOOST_TEST(s[0] == 'x');
|
||||||
|
BOOST_TEST(s[399] == 'x');
|
||||||
|
BOOST_TEST(*s.end() == 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static
|
||||||
|
void
|
||||||
|
testCStringWideChar()
|
||||||
|
{
|
||||||
|
// Test with wchar_t.
|
||||||
|
{
|
||||||
|
static_wcstring<10> ws;
|
||||||
|
BOOST_TEST(ws.empty());
|
||||||
|
BOOST_TEST(ws.size() == 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
static_wcstring<10> ws(L"hello");
|
||||||
|
BOOST_TEST(ws.size() == 5);
|
||||||
|
BOOST_TEST(ws[0] == L'h');
|
||||||
|
BOOST_TEST(ws[4] == L'o');
|
||||||
|
BOOST_TEST(*ws.end() == 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
runTests()
|
||||||
|
{
|
||||||
|
testCStringSizeGuarantee();
|
||||||
|
testCStringRemainingCapacityTrick();
|
||||||
|
testCStringTypeTraits();
|
||||||
|
testCStringConstruct();
|
||||||
|
testCStringAssignment();
|
||||||
|
testCStringElements();
|
||||||
|
testCStringIterators();
|
||||||
|
testCStringCapacity();
|
||||||
|
testCStringClear();
|
||||||
|
testCStringPushPop();
|
||||||
|
testCStringAppend();
|
||||||
|
testCStringComparison();
|
||||||
|
testCStringConversion();
|
||||||
|
testCStringStream();
|
||||||
|
testCStringSwap();
|
||||||
|
testCStringConstexpr();
|
||||||
|
testCStringNTTP();
|
||||||
|
testCStringPODUsage();
|
||||||
|
testCStringLargeCapacity();
|
||||||
|
testCStringWideChar();
|
||||||
|
|
||||||
|
return report_errors();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
main()
|
||||||
|
{
|
||||||
|
return boost::static_strings::runTests();
|
||||||
|
}
|
||||||
@@ -14,6 +14,17 @@
|
|||||||
// Are we dependent on Boost?
|
// Are we dependent on Boost?
|
||||||
// #define BOOST_STATIC_STRING_STANDALONE
|
// #define BOOST_STATIC_STRING_STANDALONE
|
||||||
|
|
||||||
|
#include <cstdint>
|
||||||
|
|
||||||
|
// detect 32/64 bit
|
||||||
|
#if UINTPTR_MAX == UINT64_MAX
|
||||||
|
#define BOOST_STATIC_STRING_ARCH 64
|
||||||
|
#elif UINTPTR_MAX == UINT32_MAX
|
||||||
|
#define BOOST_STATIC_STRING_ARCH 32
|
||||||
|
#else
|
||||||
|
#error Unknown or unsupported architecture, please open an issue
|
||||||
|
#endif
|
||||||
|
|
||||||
// Can we have deduction guides?
|
// Can we have deduction guides?
|
||||||
#if __cpp_deduction_guides >= 201703L
|
#if __cpp_deduction_guides >= 201703L
|
||||||
#define BOOST_STATIC_STRING_USE_DEDUCT
|
#define BOOST_STATIC_STRING_USE_DEDUCT
|
||||||
@@ -128,9 +139,6 @@
|
|||||||
#ifndef BOOST_STATIC_STRING_THROW
|
#ifndef BOOST_STATIC_STRING_THROW
|
||||||
#define BOOST_STATIC_STRING_THROW(ex) BOOST_THROW_EXCEPTION(ex)
|
#define BOOST_STATIC_STRING_THROW(ex) BOOST_THROW_EXCEPTION(ex)
|
||||||
#endif
|
#endif
|
||||||
#ifndef BOOST_STATIC_STRING_STATIC_ASSERT
|
|
||||||
#define BOOST_STATIC_STRING_STATIC_ASSERT(cond, msg) BOOST_STATIC_ASSERT_MSG(cond, msg)
|
|
||||||
#endif
|
|
||||||
#ifndef BOOST_STATIC_STRING_ASSERT
|
#ifndef BOOST_STATIC_STRING_ASSERT
|
||||||
#define BOOST_STATIC_STRING_ASSERT(cond) BOOST_ASSERT(cond)
|
#define BOOST_STATIC_STRING_ASSERT(cond) BOOST_ASSERT(cond)
|
||||||
#endif
|
#endif
|
||||||
@@ -138,24 +146,60 @@
|
|||||||
#ifndef BOOST_STATIC_STRING_THROW
|
#ifndef BOOST_STATIC_STRING_THROW
|
||||||
#define BOOST_STATIC_STRING_THROW(ex) throw ex
|
#define BOOST_STATIC_STRING_THROW(ex) throw ex
|
||||||
#endif
|
#endif
|
||||||
#ifndef BOOST_STATIC_STRING_STATIC_ASSERT
|
|
||||||
#define BOOST_STATIC_STRING_STATIC_ASSERT(cond, msg) static_assert(cond, msg)
|
|
||||||
#endif
|
|
||||||
#ifndef BOOST_STATIC_STRING_ASSERT
|
#ifndef BOOST_STATIC_STRING_ASSERT
|
||||||
#define BOOST_STATIC_STRING_ASSERT(cond) assert(cond)
|
#define BOOST_STATIC_STRING_ASSERT(cond) assert(cond)
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef BOOST_STATIC_STRING_STANDALONE
|
#ifndef BOOST_STATIC_STRING_STANDALONE
|
||||||
|
#include <boost/config.hpp>
|
||||||
#include <boost/assert.hpp>
|
#include <boost/assert.hpp>
|
||||||
#include <boost/container_hash/hash.hpp>
|
#include <boost/container_hash/hash.hpp>
|
||||||
#include <boost/static_assert.hpp>
|
|
||||||
#include <boost/utility/string_view.hpp>
|
#include <boost/utility/string_view.hpp>
|
||||||
|
#include <boost/core/detail/string_view.hpp>
|
||||||
#include <boost/throw_exception.hpp>
|
#include <boost/throw_exception.hpp>
|
||||||
|
|
||||||
|
#if !defined(BOOST_NO_CXX17_HDR_STRING_VIEW) || \
|
||||||
|
defined(BOOST_STATIC_STRING_CXX17_STRING_VIEW)
|
||||||
|
#include <string_view>
|
||||||
|
#define BOOST_STATIC_STRING_HAS_STD_STRING_VIEW
|
||||||
|
#endif
|
||||||
#else
|
#else
|
||||||
#include <cassert>
|
#include <cassert>
|
||||||
#include <stdexcept>
|
#include <stdexcept>
|
||||||
|
|
||||||
|
#if defined(__has_include)
|
||||||
|
# if !__has_include(<string_view>)
|
||||||
|
# define BOOST_STATIC_STRING_NO_CXX17_HDR_STRING_VIEW
|
||||||
|
# endif
|
||||||
|
/*
|
||||||
|
* Replicate the logic from Boost.Config
|
||||||
|
*/
|
||||||
|
// GNU libstdc++3:
|
||||||
|
#elif defined(__GLIBCPP__) || defined(__GLIBCXX__)
|
||||||
|
# if ((__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__) < 70100) || (__cplusplus <= 201402L)
|
||||||
|
# define BOOST_STATIC_STRING_NO_CXX17_HDR_STRING_VIEW
|
||||||
|
# endif
|
||||||
|
// libc++:
|
||||||
|
#elif defined(_LIBCPP_VERSION)
|
||||||
|
# if (_LIBCPP_VERSION < 4000) || (__cplusplus <= 201402L)
|
||||||
|
# define BOOST_STATIC_STRING_NO_CXX17_HDR_STRING_VIEW
|
||||||
|
# endif
|
||||||
|
// MSVC uses logic from catch all for BOOST_NO_CXX17_HDR_STRING_VIEW
|
||||||
|
// catch all:
|
||||||
|
#elif !defined(_YVALS) && !defined(_CPPLIB_VER)
|
||||||
|
# if (!defined(__has_include) || (__cplusplus < 201700))
|
||||||
|
# define BOOST_STATIC_STRING_NO_CXX17_HDR_STRING_VIEW
|
||||||
|
# elif !__has_include(<string_view>)
|
||||||
|
# define BOOST_STATIC_STRING_NO_CXX17_HDR_STRING_VIEW
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if !defined(BOOST_STATIC_STRING_NO_CXX17_HDR_STRING_VIEW) || \
|
||||||
|
defined(BOOST_STATIC_STRING_CXX17_STRING_VIEW)
|
||||||
#include <string_view>
|
#include <string_view>
|
||||||
|
#define BOOST_STATIC_STRING_HAS_STD_STRING_VIEW
|
||||||
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// Compiler bug prevents constexpr from working with clang 4.x and 5.x
|
// Compiler bug prevents constexpr from working with clang 4.x and 5.x
|
||||||
@@ -192,6 +236,30 @@ defined(BOOST_STATIC_STRING_CPP14)
|
|||||||
#define BOOST_STATIC_STRING_GCC5_BAD_CONSTEXPR
|
#define BOOST_STATIC_STRING_GCC5_BAD_CONSTEXPR
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifndef BOOST_STATIC_STRING_STANDALONE
|
||||||
|
#if ! defined(BOOST_NO_CWCHAR) && ! defined(BOOST_NO_SWPRINTF)
|
||||||
|
#define BOOST_STATIC_STRING_HAS_WCHAR
|
||||||
|
#endif
|
||||||
|
#else
|
||||||
|
#ifndef __has_include
|
||||||
|
// If we don't have __has_include in standalone,
|
||||||
|
// we will assume that <cwchar> exists.
|
||||||
|
#define BOOST_STATIC_STRING_HAS_WCHAR
|
||||||
|
#elif __has_include(<cwchar>)
|
||||||
|
#define BOOST_STATIC_STRING_HAS_WCHAR
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef BOOST_STATIC_STRING_HAS_WCHAR
|
||||||
|
#include <cwchar>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// Define the basic string_view type used by the library
|
||||||
|
// Conversions to and from other available string_view types
|
||||||
|
// are still defined.
|
||||||
|
#if !defined(BOOST_STATIC_STRING_STANDALONE) || \
|
||||||
|
defined(BOOST_STATIC_STRING_HAS_STD_STRING_VIEW)
|
||||||
|
#define BOOST_STATIC_STRING_HAS_ANY_STRING_VIEW
|
||||||
namespace boost {
|
namespace boost {
|
||||||
namespace static_strings {
|
namespace static_strings {
|
||||||
|
|
||||||
@@ -206,3 +274,26 @@ using basic_string_view =
|
|||||||
} // static_strings
|
} // static_strings
|
||||||
} // boost
|
} // boost
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if defined(__cpp_lib_to_string) && __cpp_lib_to_string >= 202306L // std::to_[w]string() redefined in terms of std::format()
|
||||||
|
#define BOOST_STATIC_STRING_USE_STD_FORMAT
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(__GNUC__) && (__GNUC__ >= 5) && (__GNUC__ <= 10) && !defined(__clang__)
|
||||||
|
// Workaround for GCC complaining about nested classes being private.
|
||||||
|
#define BOOST_STATIC_STRING_GCC_NESTED_CLASS_WORKAROUND public:
|
||||||
|
#else
|
||||||
|
#define BOOST_STATIC_STRING_GCC_NESTED_CLASS_WORKAROUND
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// GCC 9 incorrectly rejects the pointer equality comparison in
|
||||||
|
// ptr_in_range() in constant expressions. GCC 10 and later handle
|
||||||
|
// it correctly.
|
||||||
|
//
|
||||||
|
// Clang 3.7 and 9-19 have the same issue.
|
||||||
|
#if (defined(__GNUC__) && !defined(__clang__) && (__GNUC__ == 9)) \
|
||||||
|
|| (defined(__clang__) && ((__clang_major__ == 3 && __clang_minor__ == 7) || ((__clang_major__ >= 9) && (__clang_major__ <= 19))))
|
||||||
|
#define BOOST_STATIC_STRING_CONSTEXPR_PTR_CMP_BROKEN
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@@ -7,12 +7,13 @@
|
|||||||
],
|
],
|
||||||
"description": "A fixed capacity dynamically sized string.",
|
"description": "A fixed capacity dynamically sized string.",
|
||||||
"category": [
|
"category": [
|
||||||
"Container",
|
"Containers",
|
||||||
"String"
|
"String"
|
||||||
],
|
],
|
||||||
"maintainers": [
|
"maintainers": [
|
||||||
"Krystian Stasiowski <sdkrystian@gmail.com>",
|
"Alan de Freitas <alandefreitas@gmail.com>",
|
||||||
"Vinnie Falco <vinnie.falco@gmail.com>"
|
"Vinnie Falco <vinnie.falco@gmail.com>",
|
||||||
|
"Gennaro Prota <gennaro.prota@gmail.com>"
|
||||||
],
|
],
|
||||||
"cxxstd": "11"
|
"cxxstd": "11"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
#
|
#
|
||||||
# Copyright (c) 2016-2017 Vinnie Falco (vinnie dot falco at gmail dot com)
|
# Copyright (c) 2022 Alan de Freitas (alandefreitas@gmail.com)
|
||||||
#
|
#
|
||||||
# Distributed under the Boost Software License, Version 1.0. (See accompanying
|
# 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 LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
||||||
@@ -7,16 +7,26 @@
|
|||||||
# Official repository: https://github.com/boostorg/static_string
|
# Official repository: https://github.com/boostorg/static_string
|
||||||
#
|
#
|
||||||
|
|
||||||
GroupSources (include/boost/static_string static_string)
|
# Custom target used by the boost super-project
|
||||||
GroupSources (test "/")
|
if(NOT TARGET tests)
|
||||||
|
add_custom_target(tests)
|
||||||
|
set_property(TARGET tests PROPERTY FOLDER _deps)
|
||||||
|
endif()
|
||||||
|
|
||||||
add_executable (tests
|
set(BOOST_STATIC_STRING_TESTS_FILES
|
||||||
${PROJECT_FILES}
|
CMakeLists.txt
|
||||||
Jamfile
|
Jamfile
|
||||||
static_string.cpp
|
constexpr_tests.hpp
|
||||||
)
|
compile_fail.hpp
|
||||||
|
static_string.cpp
|
||||||
|
)
|
||||||
|
|
||||||
target_link_libraries(tests
|
source_group(TREE ${CMAKE_CURRENT_SOURCE_DIR} FILES ${BOOST_STATIC_STRING_TESTS_FILES})
|
||||||
)
|
add_executable(boost_static_string_tests ${BOOST_STATIC_STRING_TESTS_FILES})
|
||||||
|
|
||||||
set_property(TARGET tests PROPERTY FOLDER "tests")
|
# The include dependencies are found in the CMakeLists.txt
|
||||||
|
# of the root project directory.
|
||||||
|
# See: BOOST_STATIC_STRING_UNIT_TEST_LIBRARIES
|
||||||
|
target_link_libraries(boost_static_string_tests PRIVATE Boost::static_string)
|
||||||
|
add_test(NAME boost_static_string_tests COMMAND boost_static_string_tests)
|
||||||
|
add_dependencies(tests boost_static_string_tests)
|
||||||
|
|||||||
@@ -8,18 +8,21 @@
|
|||||||
#
|
#
|
||||||
|
|
||||||
import testing ;
|
import testing ;
|
||||||
import ../../config/checks/config : requires ;
|
import-search /boost/config/checks ;
|
||||||
|
import config : requires ;
|
||||||
|
|
||||||
local defines =
|
local defines =
|
||||||
[ requires
|
[ requires
|
||||||
cxx11_constexpr
|
cxx11_constexpr
|
||||||
cxx11_decltype
|
cxx11_decltype
|
||||||
cxx11_hdr_tuple
|
cxx11_hdr_tuple
|
||||||
|
cxx11_hdr_type_traits
|
||||||
cxx11_template_aliases
|
cxx11_template_aliases
|
||||||
cxx11_variadic_templates
|
cxx11_variadic_templates
|
||||||
]
|
]
|
||||||
;
|
;
|
||||||
|
|
||||||
project : requirements $(defines) ;
|
project : requirements $(defines)
|
||||||
|
<library>/boost/static_string//boost_static_string ;
|
||||||
|
|
||||||
run static_string.cpp ;
|
run static_string.cpp ;
|
||||||
|
|||||||
24
test/cmake_test/CMakeLists.txt
Normal file
24
test/cmake_test/CMakeLists.txt
Normal file
@@ -0,0 +1,24 @@
|
|||||||
|
# Copyright 2021-2025 Alexander Grund
|
||||||
|
# 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.8...3.16)
|
||||||
|
|
||||||
|
project(cmake_subdir_test LANGUAGES CXX)
|
||||||
|
|
||||||
|
# Those 2 should work the same
|
||||||
|
# while using find_package for the installed Boost avoids the need to manually specify dependencies
|
||||||
|
if(BOOST_CI_INSTALL_TEST)
|
||||||
|
find_package(boost_static_string REQUIRED)
|
||||||
|
else()
|
||||||
|
set(BOOST_INCLUDE_LIBRARIES static_string)
|
||||||
|
add_subdirectory(../../../.. deps/boost EXCLUDE_FROM_ALL)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
add_executable(main main.cpp)
|
||||||
|
target_link_libraries(main Boost::static_string)
|
||||||
|
|
||||||
|
enable_testing()
|
||||||
|
add_test(NAME main COMMAND main)
|
||||||
|
|
||||||
|
add_custom_target(check COMMAND ${CMAKE_CTEST_COMMAND} --output-on-failure -C $<CONFIG>)
|
||||||
18
test/cmake_test/main.cpp
Normal file
18
test/cmake_test/main.cpp
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
//
|
||||||
|
// Copyright (c) 2025 Alexander Grund
|
||||||
|
//
|
||||||
|
// 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)
|
||||||
|
//
|
||||||
|
// Official repository: https://github.com/boostorg/static_string
|
||||||
|
//
|
||||||
|
|
||||||
|
#include <boost/static_string.hpp>
|
||||||
|
|
||||||
|
int main()
|
||||||
|
{
|
||||||
|
// Smoke test only
|
||||||
|
boost::static_string<1> s_empty;
|
||||||
|
boost::static_string<4> s_3(3, 'x');
|
||||||
|
return (s_empty.empty() && s_3.size() == 3) ? 0 : 1;
|
||||||
|
}
|
||||||
@@ -4,16 +4,6 @@
|
|||||||
namespace boost {
|
namespace boost {
|
||||||
namespace static_strings {
|
namespace static_strings {
|
||||||
|
|
||||||
static_assert(std::is_base_of<
|
|
||||||
detail::static_string_base<0, char, std::char_traits<char>>,
|
|
||||||
static_string<0>>::value,
|
|
||||||
"the zero size optimization shall be used for N = 0");
|
|
||||||
|
|
||||||
static_assert(std::is_base_of<
|
|
||||||
detail::static_string_base<(std::numeric_limits<char>::max)() + 1, char, std::char_traits<char>>,
|
|
||||||
static_string<(std::numeric_limits<char>::max)() + 1>>::value,
|
|
||||||
"the minimum size type optimization shall be used for N > 0");
|
|
||||||
|
|
||||||
static_assert(!detail::is_input_iterator<int>::value, "is_input_iterator is incorrect");
|
static_assert(!detail::is_input_iterator<int>::value, "is_input_iterator is incorrect");
|
||||||
static_assert(!detail::is_input_iterator<double>::value, "is_input_iterator is incorrect");
|
static_assert(!detail::is_input_iterator<double>::value, "is_input_iterator is incorrect");
|
||||||
static_assert(detail::is_input_iterator<int*>::value, "is_input_iterator is incorrect");
|
static_assert(detail::is_input_iterator<int*>::value, "is_input_iterator is incorrect");
|
||||||
|
|||||||
@@ -22,38 +22,77 @@ struct cxper_char_traits
|
|||||||
using int_type = int;
|
using int_type = int;
|
||||||
using state_type = std::mbstate_t;
|
using state_type = std::mbstate_t;
|
||||||
|
|
||||||
static constexpr void assign(char_type& a, const char_type& b) noexcept { a = b; }
|
static constexpr void assign(char_type& a, const char_type& b) noexcept
|
||||||
static constexpr bool eq(char_type a, char_type b) noexcept { return a == b; }
|
{
|
||||||
static constexpr bool lt(char_type a, char_type b) noexcept { return a < b; }
|
a = b;
|
||||||
|
}
|
||||||
|
|
||||||
|
static constexpr bool eq(char_type a, char_type b) noexcept
|
||||||
|
{
|
||||||
|
return a == b;
|
||||||
|
}
|
||||||
|
|
||||||
|
static constexpr bool lt(char_type a, char_type b) noexcept
|
||||||
|
{
|
||||||
|
return a < b;
|
||||||
|
}
|
||||||
|
|
||||||
|
static constexpr int compare(const char_type* a, const char_type* b, std::size_t n)
|
||||||
|
{
|
||||||
|
for (; n--; ++a, ++b)
|
||||||
|
{
|
||||||
|
if(lt(*a, *b))
|
||||||
|
return 1;
|
||||||
|
else if(lt(*b, *a))
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
static constexpr int compare(const char_type*, const char_type*, std::size_t) { return 0; }
|
|
||||||
static constexpr std::size_t length(const char_type* s)
|
static constexpr std::size_t length(const char_type* s)
|
||||||
{
|
{
|
||||||
std::size_t n = 0;
|
auto ptr = s;
|
||||||
while (*(s++));
|
while (!eq(*ptr, char_type()))
|
||||||
return n;
|
++ptr;
|
||||||
|
return ptr - s;
|
||||||
}
|
}
|
||||||
static constexpr const char_type* find(const char_type*, std::size_t, const char_type&){ return 0; }
|
|
||||||
|
static constexpr const char_type* find(const char_type* s, std::size_t n, const char_type& ch)
|
||||||
|
{
|
||||||
|
for (; n--; ++s)
|
||||||
|
{
|
||||||
|
if (eq(*s, ch))
|
||||||
|
return s;
|
||||||
|
}
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
static constexpr char_type* move(char_type* dest, const char_type* src, std::size_t n)
|
static constexpr char_type* move(char_type* dest, const char_type* src, std::size_t n)
|
||||||
{
|
{
|
||||||
const auto temp = dest;
|
// This implementation does not handle overlapping ranges where
|
||||||
while (n--)
|
// dest > src. A correct implementation would need to detect this
|
||||||
*(dest++) = *(src++);
|
// case and copy backwards, but detecting overlap requires pointer
|
||||||
return temp;
|
// comparisons that many of the tested compiles (incorrectly) refuse
|
||||||
|
// in constant expressions.
|
||||||
|
//
|
||||||
|
// Since cxper_char_traits is only used for testing constexpr
|
||||||
|
// functionality and the tests do not exercise overlapping moves
|
||||||
|
// where dest > src, this simple forward copy is sufficient.
|
||||||
|
return copy(dest, src, n);
|
||||||
}
|
}
|
||||||
|
|
||||||
static constexpr char_type* copy(char_type* dest, const char_type* src, std::size_t n)
|
static constexpr char_type* copy(char_type* dest, const char_type* src, std::size_t n)
|
||||||
{
|
{
|
||||||
const auto temp = dest;
|
for (auto ptr = dest; n--;)
|
||||||
while (n--)
|
assign(*ptr++, *src++);
|
||||||
*(dest++) = *(src++);
|
return dest;
|
||||||
return temp;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static constexpr char_type* assign(char_type* dest, std::size_t n, char_type ch)
|
static constexpr char_type* assign(char_type* dest, std::size_t n, char_type ch)
|
||||||
{
|
{
|
||||||
const auto temp = dest;
|
for (auto ptr = dest; n--;)
|
||||||
while (n--)
|
assign(*ptr++, ch);
|
||||||
*(dest++) = ch;
|
return dest;
|
||||||
return temp;
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
#else
|
#else
|
||||||
@@ -67,6 +106,23 @@ bool
|
|||||||
testConstantEvaluation()
|
testConstantEvaluation()
|
||||||
{
|
{
|
||||||
#ifdef BOOST_STATIC_STRING_CPP20
|
#ifdef BOOST_STATIC_STRING_CPP20
|
||||||
|
|
||||||
|
// Check construction in a constexpr context
|
||||||
|
constexpr basic_static_string s("hello");
|
||||||
|
static_assert(s.size() == 5);
|
||||||
|
static_assert(s.static_capacity == 5);
|
||||||
|
static_assert(s == "hello");
|
||||||
|
|
||||||
|
// Check assignment in a constexpr context
|
||||||
|
constexpr auto s2 =
|
||||||
|
[]()
|
||||||
|
{
|
||||||
|
basic_static_string s("hello");
|
||||||
|
s = "world";
|
||||||
|
return s;
|
||||||
|
}();
|
||||||
|
static_assert(s2 == "world");
|
||||||
|
|
||||||
// c++20 constexpr tests
|
// c++20 constexpr tests
|
||||||
cstatic_string a;
|
cstatic_string a;
|
||||||
cstatic_string b(1, 'a');
|
cstatic_string b(1, 'a');
|
||||||
@@ -171,8 +227,10 @@ testConstantEvaluation()
|
|||||||
|
|
||||||
a.substr(0);
|
a.substr(0);
|
||||||
|
|
||||||
|
#ifdef BOOST_STATIC_STRING_HAS_ANY_STRING_VIEW
|
||||||
// subview
|
// subview
|
||||||
a.subview(0);
|
a.subview(0);
|
||||||
|
#endif
|
||||||
|
|
||||||
// copy
|
// copy
|
||||||
char k[20]{};
|
char k[20]{};
|
||||||
@@ -198,7 +256,8 @@ testConstantEvaluation()
|
|||||||
a.replace(a.begin(), a.end(), a.begin(), a.end());
|
a.replace(a.begin(), a.end(), a.begin(), a.end());
|
||||||
a.replace(a.begin(), a.end(), {'a'});
|
a.replace(a.begin(), a.end(), {'a'});
|
||||||
|
|
||||||
#ifdef BOOST_STATIC_STRING_IS_CONST_EVAL
|
#if defined(BOOST_STATIC_STRING_IS_CONST_EVAL) \
|
||||||
|
&& !defined(BOOST_STATIC_STRING_CONSTEXPR_PTR_CMP_BROKEN)
|
||||||
a.clear();
|
a.clear();
|
||||||
a.replace(a.begin(), a.end(), "a");
|
a.replace(a.begin(), a.end(), "a");
|
||||||
a.replace(a.begin(), a.end(), "a", 1);
|
a.replace(a.begin(), a.end(), "a", 1);
|
||||||
@@ -357,8 +416,10 @@ testConstantEvaluation()
|
|||||||
a.substr(0);
|
a.substr(0);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef BOOST_STATIC_STRING_HAS_STRING_VIEW
|
||||||
// subview
|
// subview
|
||||||
a.subview(0);
|
a.subview(0);
|
||||||
|
#endif
|
||||||
|
|
||||||
// copy
|
// copy
|
||||||
char k[20]{};
|
char k[20]{};
|
||||||
@@ -384,7 +445,8 @@ testConstantEvaluation()
|
|||||||
a.replace(a.begin(), a.end(), a.begin(), a.end());
|
a.replace(a.begin(), a.end(), a.begin(), a.end());
|
||||||
a.replace(a.begin(), a.end(), {'a'});
|
a.replace(a.begin(), a.end(), {'a'});
|
||||||
|
|
||||||
#ifdef BOOST_STATIC_STRING_IS_CONST_EVAL
|
#if defined(BOOST_STATIC_STRING_IS_CONST_EVAL) \
|
||||||
|
&& !defined(BOOST_STATIC_STRING_CONSTEXPR_PTR_CMP_BROKEN)
|
||||||
a.clear();
|
a.clear();
|
||||||
a.replace(a.begin(), a.end(), "a");
|
a.replace(a.begin(), a.end(), "a");
|
||||||
a.replace(a.begin(), a.end(), "a", 1);
|
a.replace(a.begin(), a.end(), "a", 1);
|
||||||
@@ -556,7 +618,8 @@ testConstantEvaluation()
|
|||||||
a.replace(a.begin(), a.end(), a.begin(), a.end());
|
a.replace(a.begin(), a.end(), a.begin(), a.end());
|
||||||
a.replace(a.begin(), a.end(), {'a'});
|
a.replace(a.begin(), a.end(), {'a'});
|
||||||
|
|
||||||
#ifdef BOOST_STATIC_STRING_IS_CONST_EVAL
|
#if defined(BOOST_STATIC_STRING_IS_CONST_EVAL) \
|
||||||
|
&& !defined(BOOST_STATIC_STRING_CONSTEXPR_PTR_CMP_BROKEN)
|
||||||
a.clear();
|
a.clear();
|
||||||
a.replace(a.begin(), a.end(), "a");
|
a.replace(a.begin(), a.end(), "a");
|
||||||
a.replace(a.begin(), a.end(), "a", 1);
|
a.replace(a.begin(), a.end(), "a", 1);
|
||||||
@@ -603,5 +666,28 @@ testConstantEvaluation()
|
|||||||
cstatic_string().empty();
|
cstatic_string().empty();
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if __cpp_nontype_template_args >= 201911L
|
||||||
|
|
||||||
|
template<basic_static_string<32, char, cxper_char_traits> X>
|
||||||
|
struct nttp_primary
|
||||||
|
{
|
||||||
|
static constexpr bool value = false;
|
||||||
|
};
|
||||||
|
|
||||||
|
template<>
|
||||||
|
struct nttp_primary<"test string">
|
||||||
|
{
|
||||||
|
static constexpr bool value = true;
|
||||||
|
};
|
||||||
|
|
||||||
|
static_assert(!nttp_primary<"random string">::value,
|
||||||
|
"structural equality broken");
|
||||||
|
|
||||||
|
static_assert(nttp_primary<"test string">::value,
|
||||||
|
"structural equality broken");
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
} // static_strings
|
} // static_strings
|
||||||
} // boost
|
} // boost
|
||||||
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user