Compare commits

..

45 Commits

Author SHA1 Message Date
Gennaro Prota
c915934529 Fix four occorrences of a typo ("arugment") in the Javadoc comments 2025-11-14 12:03:00 +01:00
Gennaro Prota
10b5491104 Avoid two C4244 warnings from MSVC 2025-11-05 11:30:41 +01:00
Alexander Grund
a58319dbdd Switch boost.io to boost.org 2025-10-24 11:59:10 +02:00
Alexander Grund
4c84b61975 README: Replace travis badges by GHA badges 2025-10-24 11:59:10 +02:00
Alexander Grund
fbd6051165 Update Link to regression test matrix in README 2025-10-24 11:59:10 +02:00
Alexander Grund
db1ea76a17 Fix required CMake version
`source_group(TREE` requires CMake 3.8
2025-10-24 11:58:47 +02:00
Alexander Grund
ee172b86fd Try standalone only with >=C++17 2025-10-24 11:57:55 +02:00
Alexander Grund
bd3dd01259 Update Drone from Boost.CI 2025-10-24 11:57:55 +02:00
Gennaro Prota
a841869405 Remove a use of std::strcpy() to avoid a C4996 warning from MSVC 2025-10-24 11:00:21 +02:00
Alexander Grund
3613e9578d Fix standalone build with Clang
The config.hpp uses `BOOST_LIBSTDCXX_VERSION` which isn't defined in
standalone mode so `BOOST_STATIC_STRING_NO_CXX17_HDR_STRING_VIEW` will
be defined.
This then causes build failures for code expecting the availability of
string_view.
2025-10-24 10:11:37 +02:00
Alexander Grund
6f17b60377 Guard test requiring string_view 2025-10-24 10:11:37 +02:00
Gennaro Prota
815678e1e7 CI: Test C++26/2c again 2025-10-23 16:49:48 +02:00
Gennaro Prota
2cc22bf5a8 Align to_static_[w]string() with C++26 std::to_[w]string()
C++26 specifies that std::to_string() and std::to_wstring() format
floating point values as if using std::format(). This commit updates the
internal conversion helpers to match that behavior, using
std::format_to_n() for efficient, allocation-free formatting directly
into the static_string/static_wstring buffer.

Fallbacks using snprintf()/swprintf() remain active for pre-C++26
builds.

This ensures consistent formatting across standard and Boost APIs.
2025-10-23 16:49:48 +02:00
Gennaro Prota
d6f976a7df Fix the sizes of the strings returned by to_static_string() and to_static_wstring() for floating point values 2025-10-23 16:49:48 +02:00
Gennaro Prota
7b564d8d26 Fix two macro names in the unit tests 2025-10-22 19:18:39 +02:00
Gennaro Prota
3c37deed99 Fix the previous commit 2025-10-22 19:11:09 +02:00
Gennaro Prota
34ef5c45be Remove an unused dependency on Boost.StaticAssert
This closes issue #73.
2025-10-22 19:06:12 +02:00
Kenneth Reitz
0f34644488 Update libraries.json /s/container/containers
The other libraries reference "containers" instead of "container"
2025-10-22 18:48:18 +02:00
Dmitry Arkhipov
4c27826548 use Python version of Docca 2025-10-22 18:35:38 +02:00
Gennaro Prota
9c5d69475d Implement the arithmetic conversions in terms of resize_and_overwrite()
Reason: Performing the conversions without accessing private members,
providing a model for users to implement their own with comparable
efficiency.
2025-10-09 17:45:16 +02:00
Gennaro Prota
300781d954 Add a resize_and_overwrite() member
Reason: This is in preparation of the next commit. See its commit
message.
2025-10-09 17:45:16 +02:00
Gennaro Prota
cd1a1a41c3 Don't use an additional buffer in the arithmetic conversions
In the case of the floating point conversions, this effectively avoids a
copy of the buffer contents. In the case of the integer conversions, it
doesn't eliminate the copy, but still removes the extra buffer.

This fixes issue #65.
2025-10-09 17:45:16 +02:00
Alexander Grund
0d255f7438 Appveyor: Update MinGW 32bit job
Use the variant from Boost.CI

Fixes #68
2025-10-07 10:19:31 +02:00
Alexander Grund
17d77ef5bb Disable multi-arch CI job 2025-10-06 17:22:47 +02:00
Alexander Grund
20afd07676 Pass char arrays instead of static_string instances to testR
Avoid stack overflow in MSVC caused by huge amount of static_string instances

Fixes #70
2025-10-06 17:22:47 +02:00
Alexander Grund
7f903ef7ce Add cxx11_hdr_type_traits B2 requirement
Avoid failures with GCC < 5
2025-10-06 17:22:47 +02:00
Alexander Grund
5dfbb1f2b1 CI: Disable coverage and coverity jobs 2025-10-06 17:22:47 +02:00
Arthur O'Dwyer
37a557d937 Make static_string trivially copyable 2025-10-03 18:42:10 +02:00
Alexander Grund
cd546285c4 CI: Don't test C++26/2c 2025-10-03 12:12:05 +02:00
Alexander Grund
645bf0a27d Simplify testTS
Replace boolean by check for defaulted nullptr
2025-10-03 12:12:05 +02:00
Alexander Grund
5067dfce5f Use BOOST_TEST_EQ for to_static_string tests using floating point values 2025-10-03 12:12:05 +02:00
Alexander Grund
d37197d773 Add CMake subdir test for CI 2025-10-03 12:12:05 +02:00
Alexander Grund
a421cf742c Switch to reusable GHA workflow
Avoid the current failures due to outdated CI configs
2025-10-03 12:12:05 +02:00
Rene Rivera
7a53b7ff20 Move include to target. 2025-05-02 19:21:11 +03:00
Rene Rivera
24d62635a3 Put back whitespace. 2025-05-02 19:21:11 +03:00
Rene Rivera
a8f671ea1e Attempt to fix GHA. 2025-05-02 19:21:11 +03:00
Rene Rivera
d677c9436c Update build deps. 2025-05-02 19:21:11 +03:00
Rene Rivera
a3cc7bcf95 Move inter-lib dependencies to a project variable and into the build targets. 2025-05-02 19:21:11 +03:00
Rene Rivera
70578731e7 Update copyright dates. 2025-05-02 19:21:11 +03:00
Rene Rivera
3fb22ed769 Bump B2 require to 5.2 2025-05-02 19:21:11 +03:00
Rene Rivera
32824bfa1d Add requires-b2 check to top-level build file. 2025-05-02 19:21:11 +03:00
Rene Rivera
f15a4d0586 Add missing import-search for cconfig/predef checks. 2025-05-02 19:21:11 +03:00
Rene Rivera
cd5bc51e9e Replace relative docca refs with project based. 2025-05-02 19:21:11 +03:00
Rene Rivera
77d6a43dce Switch to library requirements instead of source. As source puts extra source in install targets. 2025-05-02 19:21:11 +03:00
Rene Rivera
8f969a62f7 Make the library modular usable. 2025-05-02 19:21:11 +03:00
22 changed files with 1669 additions and 1954 deletions

View File

@@ -107,10 +107,10 @@ environment:
B2_CXXSTD: 11,14,1z
B2_TOOLSET: gcc
- FLAVOR: mingw32
- FLAVOR: mingw64 (32-bit)
APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2019
ADDPATH: C:\mingw-w64\i686-8.1.0-posix-dwarf-rt_v6-rev0\mingw32\bin;
B2_ADDRESS_MODEL: 32
ADDPATH: C:\mingw\bin;
B2_CXXSTD: 11,14,17,2a
B2_TOOLSET: gcc

View File

@@ -2,116 +2,116 @@
# subject to the Boost Software License, Version 1.0. (See accompanying
# file LICENSE.txt)
#
# Copyright Rene Rivera 2020.
# Copyright Alan de Freitas 2022.
# 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.
#
#
globalenv={'B2_CI_VERSION': '1', 'B2_VARIANT': 'release'}
linuxglobalimage="cppalliance/droneubuntu1804:1"
windowsglobalimage="cppalliance/dronevs2019"
# 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 [
# Priorities: (no 2a, no betas)
#
# coverage
# latest gcc: 17,20
# latest clang: 17,20
# oldest gcc: 11
# oldest clang: 11
# asan
# tsan
# ubsan
# valgrind
# arm64
# s390x
# docs
# cmake superproject
# cmake install
# (...the rest)
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'}),
# Coverage
linux_cxx("Coverage", "g++-8", packages="g++-8", buildscript="drone", buildtype="codecov", image=linuxglobalimage, environment={'COMMENT': 'codecov.io', 'LCOV_BRANCH_COVERAGE': '0', 'B2_CXXSTD': '11', 'B2_TOOLSET': 'gcc-8', 'B2_DEFINES': 'BOOST_NO_STRESS_TEST=1', "CODECOV_TOKEN": {"from_secret": "codecov_token"}, "COVERALLS_REPO_TOKEN": {"from_secret": "coveralls_repo_token"}}, globalenv=globalenv),
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'),
# Latest gcc
linux_cxx("GCC 12: C++17,20", "g++-12", packages="g++-12", buildscript="drone", buildtype="boost", image="cppalliance/droneubuntu2204:1", environment={'B2_TOOLSET': 'gcc-12', 'B2_CXXFLAGS': '-Werror', 'B2_CXXSTD': '17,20'}, globalenv=globalenv),
linux_cxx("GCC 12: C++17,20 Standalone", "g++-12", packages="g++-12", buildscript="drone", buildtype="boost", image="cppalliance/droneubuntu2204:1", environment={'B2_TOOLSET': 'gcc-12', 'B2_CXXFLAGS': '-Werror', 'B2_DEFINES': 'define=BOOST_STATIC_STRING_STANDALONE', 'B2_CXXSTD': '17,20'}, globalenv=globalenv),
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'),
# Latest clang
linux_cxx("Clang 15: C++17,20", "clang++-15", packages="clang-15 libstdc++-10-dev", llvm_os="jammy", llvm_ver="15", buildscript="drone", buildtype="boost", image="cppalliance/droneubuntu2204:1", environment={'B2_TOOLSET': 'clang-15', 'B2_CXXFLAGS': '-Werror', 'B2_CXXSTD': '17,20'}, globalenv=globalenv),
linux_cxx("Clang 15: C++17,20 Standalone", "clang++-15", packages="clang-15 libstdc++-10-dev", llvm_os="jammy", llvm_ver="15", buildscript="drone", buildtype="boost", image="cppalliance/droneubuntu2204:1", environment={'B2_TOOLSET': 'clang-15', 'B2_CXXFLAGS': '-Werror', 'B2_DEFINES': 'define=BOOST_STATIC_STRING_STANDALONE', 'B2_CXXSTD': '17,20'}, globalenv=globalenv),
# 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),
# Oldest compilers
linux_cxx("GCC 4.8: C++11", "g++-4.8", packages="g++-4.8", buildscript="drone", buildtype="boost", image="cppalliance/droneubuntu1604:1", environment={'B2_TOOLSET': 'gcc-4.8', 'B2_CXXFLAGS': '-Werror', 'B2_CXXSTD': '11'}, globalenv=globalenv),
linux_cxx("GCC 4.8: C++11 Standalone", "g++-4.8", packages="g++-4.8", buildscript="drone", buildtype="boost", image="cppalliance/droneubuntu1604:1", environment={'B2_TOOLSET': 'gcc-4.8', 'B2_CXXFLAGS': '-Werror', 'B2_DEFINES': 'define=BOOST_STATIC_STRING_STANDALONE', 'B2_CXXSTD': '11'}, globalenv=globalenv),
linux_cxx("Clang 3.8: C++11", "clang++-3.8", packages="clang-3.8", buildscript="drone", buildtype="boost", image="cppalliance/droneubuntu1604:1", environment={'B2_VARIANT': 'debug', 'B2_CXXFLAGS': '-Werror', 'B2_TOOLSET': 'clang-3.8', 'B2_CXXSTD': '11'}, globalenv=globalenv),
linux_cxx("Clang 3.8: C++11 Standalone", "clang++-3.8", packages="clang-3.8", buildscript="drone", buildtype="boost", image="cppalliance/droneubuntu1604:1", environment={'B2_VARIANT': 'debug', 'B2_CXXFLAGS': '-Werror', 'B2_TOOLSET': 'clang-3.8', 'B2_DEFINES': 'define=BOOST_STATIC_STRING_STANDALONE', 'B2_CXXSTD': '11'}, globalenv=globalenv),
# Sanitizers + Valgrind
linux_cxx("ASan", "g++-12", packages="g++-12", buildscript="drone", buildtype="boost", image="cppalliance/droneubuntu2204:1", environment={'COMMENT': 'asan', 'B2_VARIANT': 'debug', 'B2_TOOLSET': 'gcc-12', 'B2_CXXSTD': '11,14,17', 'B2_ASAN': '1', 'B2_DEFINES': 'BOOST_NO_STRESS_TEST=1', 'DRONE_EXTRA_PRIVILEGED': 'True'}, globalenv=globalenv, privileged=True),
linux_cxx("TSan", "g++-12", packages="g++-12", buildscript="drone", buildtype="boost", image="cppalliance/droneubuntu2204:1", environment={'COMMENT': 'tsan', 'B2_VARIANT': 'debug', 'B2_TOOLSET': 'gcc-12', 'B2_CXXSTD': '11,14,17', 'B2_TSAN': '1', 'B2_DEFINES': 'BOOST_NO_STRESS_TEST=1'}, globalenv=globalenv),
linux_cxx("UBSan", "g++-12", packages="g++-12", buildscript="drone", buildtype="boost", image="cppalliance/droneubuntu2204:1", environment={'COMMENT': 'ubsan', 'B2_VARIANT': 'debug', 'B2_TOOLSET': 'gcc-12', 'B2_CXXSTD': '11,14,17', 'B2_UBSAN': '1', 'B2_DEFINES': 'define=BOOST_NO_STRESS_TEST=1', 'B2_LINKFLAGS': '-fuse-ld=gold'}, globalenv=globalenv),
linux_cxx("Valgrind", "clang++-14", packages="clang-14 libc6-dbg libc++-dev libstdc++-9-dev", llvm_os="jammy", llvm_ver="14", buildscript="drone", buildtype="valgrind", image="cppalliance/droneubuntu2204:1", environment={'COMMENT': 'valgrind', 'B2_TOOLSET': 'clang-14', 'B2_CXXSTD': '11,14,17', 'B2_DEFINES': 'BOOST_NO_STRESS_TEST=1', 'B2_VARIANT': 'debug', 'B2_TESTFLAGS': 'testing.launcher=valgrind', 'VALGRIND_OPTS': '--error-exitcode=1'}, globalenv=globalenv),
# arm64 (unsigned char)
linux_cxx("ARM64: GCC 11", "g++-11", packages="g++-11", buildscript="drone", buildtype="boost", image="cppalliance/droneubuntu2004:multiarch", environment={'B2_TOOLSET': 'gcc-11', 'B2_CXXFLAGS': '-Werror', 'B2_CXXSTD': '17,20'}, arch="arm64", globalenv=globalenv),
# s390x
linux_cxx("S390x: Clang 12", "clang++-12", packages="clang-12 libstdc++-9-dev", llvm_os="focal", llvm_ver="12", buildtype="boost", buildscript="drone", image="cppalliance/droneubuntu2004:multiarch", environment={'B2_TOOLSET': 'clang-12', 'B2_CXXFLAGS': '-Werror', 'B2_CXXSTD': '17,20'}, arch="s390x", globalenv=globalenv),
# Documentation
# linux_cxx("Docs", "g++", packages="docbook docbook-xml docbook-xsl xsltproc libsaxonhe-java default-jre-headless flex libfl-dev bison unzip rsync", buildtype="docs", buildscript="drone", image="cppalliance/droneubuntu1804:1", environment={'COMMENT': 'docs'}, globalenv=globalenv),
# CMake tests (https://github.com/boostorg/boost-ci)
## Compiling as part of the boost superproject
linux_cxx("CMake Superproject", "g++", packages="", buildscript="drone", buildtype="cmake-superproject", image="cppalliance/droneubuntu1804:1", globalenv=globalenv),
## Installing
# linux_cxx("CMake Install", "g++", packages="", buildscript="drone", buildtype="cmake1", image="cppalliance/droneubuntu1804:1", environment={'CMAKE_INSTALL_TEST': '1'}, globalenv=globalenv),
# ------------------------------------------------------------------
# OSX
osx_cxx("OSX: Clang", "g++", packages="", buildscript="drone", buildtype="boost", xcode_version="13.4.1", environment={'B2_TOOLSET': 'clang', 'B2_CXXFLAGS': '-Werror', 'B2_CXXSTD': '11,17'}, globalenv=globalenv),
# GCC (All other versions)
linux_cxx("GCC 4.9: C++11", "g++-4.9", packages="g++-4.9", buildscript="drone", buildtype="boost", image="cppalliance/droneubuntu1604:1", environment={'B2_TOOLSET': 'gcc-4.9', 'B2_CXXFLAGS': '-Werror', 'B2_CXXSTD': '11'}, globalenv=globalenv),
linux_cxx("GCC 5: C++11", "g++-5", packages="g++-5", buildscript="drone", buildtype="boost", image=linuxglobalimage, environment={'B2_TOOLSET': 'gcc-5', 'B2_CXXFLAGS': '-Werror', 'B2_CXXSTD': '11'}, globalenv=globalenv),
linux_cxx("GCC 6: C++11,14", "g++-6", packages="g++-6", buildscript="drone", buildtype="boost", image=linuxglobalimage, environment={'B2_TOOLSET': 'gcc-6', 'B2_CXXFLAGS': '-Werror', 'B2_CXXSTD': '11,14'}, globalenv=globalenv),
linux_cxx("GCC 7: C++14,17", "g++-7", packages="g++-7", buildscript="drone", buildtype="boost", image=linuxglobalimage, environment={'B2_TOOLSET': 'gcc-7', 'B2_CXXFLAGS': '-Werror', 'B2_CXXSTD': '14,17'}, globalenv=globalenv),
linux_cxx("GCC 8: C++17", "g++-8", packages="g++-8", buildscript="drone", buildtype="boost", image=linuxglobalimage, environment={'B2_TOOLSET': 'gcc-8', 'B2_CXXFLAGS': '-Werror', 'B2_CXXSTD': '17'}, globalenv=globalenv),
linux_cxx("GCC 9: C++17", "g++-9", packages="g++-9", buildscript="drone", buildtype="boost", image=linuxglobalimage, environment={'B2_TOOLSET': 'gcc-9', 'B2_CXXFLAGS': '-Werror', 'B2_CXXSTD': '17'}, globalenv=globalenv),
linux_cxx("GCC 10: C++17", "g++-10", packages="g++-10", buildscript="drone", buildtype="boost", image=linuxglobalimage, environment={'B2_TOOLSET': 'gcc-10', 'B2_CXXFLAGS': '-Werror', 'B2_CXXSTD': '17'}, globalenv=globalenv),
linux_cxx("GCC 11: C++17,20", "g++-11", packages="g++-11", buildscript="drone", buildtype="boost", image=linuxglobalimage, environment={'B2_TOOLSET': 'gcc-11', 'B2_CXXFLAGS': '-Werror', 'B2_CXXSTD': '17,20'}, globalenv=globalenv),
# Clang (All other versions)
linux_cxx("Clang 4.0: C++11,14", "clang++-4.0", packages="clang-4.0 libstdc++-6-dev", llvm_os="xenial", llvm_ver="4.0", buildscript="drone", buildtype="boost", image="cppalliance/droneubuntu1804:1", environment={'B2_TOOLSET': 'clang-4.0', 'B2_CXXFLAGS': '', 'B2_CXXSTD': '11,14'}, globalenv=globalenv),
linux_cxx("Clang 5.0: C++11,14", "clang++-5.0", packages="clang-5.0 libstdc++-7-dev", llvm_os="bionic", llvm_ver="5.0", buildscript="drone", buildtype="boost", image=linuxglobalimage, environment={'B2_TOOLSET': 'clang-5.0', 'B2_CXXFLAGS': '', 'B2_CXXSTD': '11,14'}, globalenv=globalenv),
linux_cxx("Clang 6.0: C++11,14", "clang++-6.0", packages="clang-6.0 libc6-dbg libc++-dev libc++abi-dev libstdc++-8-dev", llvm_os="bionic", llvm_ver="6.0", buildscript="drone", buildtype="boost", image=linuxglobalimage, environment={'B2_TOOLSET': 'clang-6.0', 'B2_CXXFLAGS': '-Werror', 'B2_CXXSTD': '11,14', 'B2_STDLIB': 'libc++'}, globalenv=globalenv),
linux_cxx("Clang 6.0: C++14,17", "clang++-6.0", packages="clang-6.0 libc6-dbg libc++-dev libc++abi-dev libstdc++-8-dev", llvm_os="bionic", llvm_ver="6.0", buildscript="drone", buildtype="boost", image=linuxglobalimage, environment={'B2_TOOLSET': 'clang-6.0', 'B2_CXXFLAGS': '-Werror', 'B2_CXXSTD': '14,17'}, globalenv=globalenv),
linux_cxx("Clang 7: C++17", "clang++-7", packages="clang-7 libc6-dbg libc++-dev libstdc++-8-dev", llvm_os="bionic", llvm_ver="7", buildscript="drone", buildtype="boost", image=linuxglobalimage, environment={'B2_TOOLSET': 'clang-7', 'B2_CXXFLAGS': '-Werror', 'B2_CXXSTD': '17'}, globalenv=globalenv),
linux_cxx("Clang 8: C++17", "clang++-8", packages="clang-8 libc6-dbg libc++-dev libstdc++-8-dev", llvm_os="bionic", llvm_ver="8", buildscript="drone", buildtype="boost", image=linuxglobalimage, environment={'B2_TOOLSET': 'clang-8', 'B2_CXXFLAGS': '-Werror', 'B2_CXXSTD': '17'}, globalenv=globalenv),
linux_cxx("Clang 9: C++14,17", "clang++-9", packages="clang-9 libstdc++-9-dev", llvm_os="bionic", llvm_ver="9", buildscript="drone", buildtype="boost", image=linuxglobalimage, environment={'B2_TOOLSET': 'clang-9', 'B2_CXXFLAGS': '-Werror', 'B2_CXXSTD': '14,17'}, globalenv=globalenv),
linux_cxx("Clang 10: C++14,17", "clang++-10", packages="clang-10 libstdc++-9-dev", llvm_os="focal", llvm_ver="10", buildscript="drone", buildtype="boost", image="cppalliance/droneubuntu2004:1", environment={'B2_TOOLSET': 'clang-10', 'B2_CXXFLAGS': '-Werror', 'B2_CXXSTD': '14,17'}, globalenv=globalenv),
linux_cxx("Clang 11: C++14,17", "clang++-11", packages="clang-11 libstdc++-9-dev", llvm_os="focal", llvm_ver="11", buildscript="drone", buildtype="boost", image="cppalliance/droneubuntu2004:1", environment={'B2_TOOLSET': 'clang-11', 'B2_CXXFLAGS': '-Werror', 'B2_CXXSTD': '14,17'}, globalenv=globalenv),
linux_cxx("Clang 12: C++17,20", "clang++-12", packages="clang-12 libstdc++-9-dev", llvm_os="focal", llvm_ver="12", buildscript="drone", buildtype="boost", image="cppalliance/droneubuntu2004:1", environment={'B2_TOOLSET': 'clang-12', 'B2_CXXFLAGS': '-Werror', 'B2_CXXSTD': '17,20'}, globalenv=globalenv),
linux_cxx("Clang 13: C++17,20", "clang++-13", packages="clang-13 libstdc++-10-dev", llvm_os="jammy", llvm_ver="13", buildscript="drone", buildtype="boost", image="cppalliance/droneubuntu2204:1", environment={'B2_TOOLSET': 'clang-13', 'B2_CXXFLAGS': '-Werror', 'B2_CXXSTD': '17,20'}, globalenv=globalenv),
linux_cxx("Clang 14: C++17,20", "clang++-14", packages="clang-14 libstdc++-10-dev", llvm_os="jammy", llvm_ver="14", buildscript="drone", buildtype="boost", image="cppalliance/droneubuntu2204:1", environment={'B2_TOOLSET': 'clang-14', 'B2_CXXFLAGS': '-Werror', 'B2_CXXSTD': '17,20'}, globalenv=globalenv),
# arm64 (unsigned char)
linux_cxx("ARM64: Clang 12", "clang++-12", packages="clang-12 libstdc++-9-dev", llvm_os="focal", llvm_ver="12", buildscript="drone", buildtype="boost", image="cppalliance/droneubuntu2004:multiarch", environment={'B2_TOOLSET': 'clang-12', 'B2_CXXFLAGS': '-Werror', 'B2_CXXSTD': '11,14,17,20'}, arch="arm64", globalenv=globalenv),
# s390x
linux_cxx("S390x: GCC 11", "g++-11", packages="g++-11", buildtype="boost", buildscript="drone", image="cppalliance/droneubuntu2004:multiarch", environment={'B2_TOOLSET': 'gcc-11', 'B2_CXXFLAGS': '-Werror', 'B2_CXXSTD': '17'}, arch="s390x", globalenv=globalenv),
# MSVC
windows_cxx("MSVC 14.1", "", image="cppalliance/dronevs2017", buildtype="boost", buildscript="drone", environment={"B2_TOOLSET": "msvc-14.1", 'B2_CXXFLAGS': '/WX', "B2_CXXSTD": "11,14,17"},globalenv=globalenv),
windows_cxx("MSVC 14.2: C++14,17,latest", "", image="cppalliance/dronevs2019", buildtype="boost", buildscript="drone", environment={"B2_TOOLSET": "msvc-14.2", 'B2_CXXFLAGS': '/WX', "B2_CXXSTD": "14,17,latest"},globalenv=globalenv),
windows_cxx("MSVC 14.3: C++17,20", "", image="cppalliance/dronevs2022", buildtype="boost", buildscript="drone", environment={"B2_TOOLSET": "msvc-14.3", 'B2_CXXFLAGS': '/WX', "B2_CXXSTD": "17,20"},globalenv=globalenv),
]
# 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")
load("@boost_ci//ci/drone/:functions.star", "linux_cxx", "windows_cxx", "osx_cxx", "freebsd_cxx", "job_impl")

View 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

View File

@@ -1,31 +0,0 @@
@ECHO ON
setlocal enabledelayedexpansion
if "%DRONE_JOB_BUILDTYPE%" == "boost" (
echo '==================================> INSTALL'
git clone https://github.com/boostorg/boost-ci.git boost-ci-cloned --depth 1
cp -prf boost-ci-cloned/ci .
rm -rf boost-ci-cloned
REM source ci/travis/install.sh
REM The contents of install.sh below:
for /F %%i in ("%DRONE_REPO%") do @set SELF=%%~nxi
SET BOOST_CI_TARGET_BRANCH=%DRONE_COMMIT_BRANCH%
SET BOOST_CI_SRC_FOLDER=%cd%
call ci\common_install.bat
echo '==================================> COMPILE'
REM set B2_TARGETS=libs/!SELF!/test libs/!SELF!/example
set B2_TARGETS=libs/!SELF!/test
call !BOOST_ROOT!\libs\!SELF!\ci\build.bat
) else if "%DRONE_JOB_BUILDTYPE%" == "standalone-windows" (
REM not used
)

View File

@@ -1,236 +0,0 @@
#!/bin/bash
# Copyright 2020 Rene Rivera, Sam Darwin
# 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
export TRAVIS_BUILD_DIR=$(pwd)
export DRONE_BUILD_DIR=$(pwd)
export TRAVIS_BRANCH=$DRONE_BRANCH
export TRAVIS_EVENT_TYPE=$DRONE_BUILD_EVENT
export VCS_COMMIT_ID=$DRONE_COMMIT
export GIT_COMMIT=$DRONE_COMMIT
export REPO_NAME=$DRONE_REPO
export USER=$(whoami)
export CC=${CC:-gcc}
export PATH=~/.local/bin:/usr/local/bin:$PATH
common_install() {
git clone https://github.com/boostorg/boost-ci.git boost-ci-cloned --depth 1
cp -prf boost-ci-cloned/ci .
rm -rf boost-ci-cloned
if [ "$TRAVIS_OS_NAME" == "osx" ]; then
unset -f cd
fi
export SELF=$(basename $REPO_NAME)
export BOOST_CI_TARGET_BRANCH="$TRAVIS_BRANCH"
export BOOST_CI_SRC_FOLDER=$(pwd)
. ./ci/common_install.sh
}
if [ "$DRONE_JOB_BUILDTYPE" == "boost" ]; then
echo '==================================> INSTALL'
common_install
echo '==================================> SCRIPT'
export B2_TARGETS=${B2_TARGETS:-"libs/$SELF/test"}
$BOOST_ROOT/libs/$SELF/ci/travis/build.sh
elif [ "$DRONE_JOB_BUILDTYPE" == "docs" ]; then
echo '==================================> INSTALL'
export SELF=$(basename $REPO_NAME)
pwd
cd ..
mkdir -p $HOME/cache && cd $HOME/cache
if [ ! -d doxygen ]; then git clone -b 'Release_1_8_15' --depth 1 https://github.com/doxygen/doxygen.git && echo "not-cached"; else echo "cached"; fi
cd doxygen
cmake -H. -Bbuild -DCMAKE_BUILD_TYPE=Release
cd build
sudo make install
cd ../..
if [ ! -f saxonhe.zip ]; then wget -O saxonhe.zip https://sourceforge.net/projects/saxon/files/Saxon-HE/9.9/SaxonHE9-9-1-4J.zip/download && echo "not-cached"; else echo "cached"; fi
unzip -o saxonhe.zip
sudo rm /usr/share/java/Saxon-HE.jar
sudo cp saxon9he.jar /usr/share/java/Saxon-HE.jar
cd ..
BOOST_BRANCH=develop && [ "$TRAVIS_BRANCH" == "master" ] && BOOST_BRANCH=master || true
git clone -b $BOOST_BRANCH https://github.com/boostorg/boost.git boost-root --depth 1
cd boost-root
export BOOST_ROOT=$(pwd)
git submodule update --init libs/context
git submodule update --init tools/boostbook
git submodule update --init tools/boostdep
git submodule update --init tools/docca
git submodule update --init tools/quickbook
rsync -av $TRAVIS_BUILD_DIR/ libs/$SELF
python tools/boostdep/depinst/depinst.py ../tools/quickbook
./bootstrap.sh
./b2 headers
echo '==================================> SCRIPT'
echo "using doxygen ; using boostbook ; using saxonhe ;" >tools/build/src/user-config.jam
./b2 -j3 libs/$SELF/doc//boostrelease
elif [ "$DRONE_JOB_BUILDTYPE" == "codecov" ]; then
echo '==================================> INSTALL'
common_install
echo '==================================> SCRIPT'
set +e
cd $BOOST_ROOT/libs/$SELF
ci/travis/codecov.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
elif [ "$DRONE_JOB_BUILDTYPE" == "valgrind" ]; then
echo '==================================> INSTALL'
common_install
echo '==================================> SCRIPT'
cd $BOOST_ROOT/libs/$SELF
ci/travis/valgrind.sh
elif [ "$DRONE_JOB_BUILDTYPE" == "standalone" ]; then
echo '==================================> INSTALL'
# Installing cmake with apt-get, so not required here:
# pip install --user cmake
echo '==================================> SCRIPT'
export CXXFLAGS="-Wall -Wextra -Werror -std=c++17"
mkdir __build_17
cd __build_17
cmake -DBOOST_JSON_STANDALONE=1 ..
cmake --build .
ctest -V .
export CXXFLAGS="-Wall -Wextra -Werror -std=c++2a"
mkdir ../__build_2a
cd ../__build_2a
cmake -DBOOST_JSON_STANDALONE=1 ..
cmake --build .
ctest -V .
elif [ "$DRONE_JOB_BUILDTYPE" == "coverity" ]; then
echo '==================================> INSTALL'
common_install
echo '==================================> SCRIPT'
if [ -n "${COVERITY_SCAN_NOTIFICATION_EMAIL}" -a \( "$TRAVIS_BRANCH" = "develop" -o "$TRAVIS_BRANCH" = "master" \) -a \( "$DRONE_BUILD_EVENT" = "push" -o "$DRONE_BUILD_EVENT" = "cron" \) ]; then
cd $BOOST_ROOT/libs/$SELF
ci/travis/coverity.sh
fi
elif [ "$DRONE_JOB_BUILDTYPE" == "cmake-superproject" ]; then
echo '==================================> INSTALL'
common_install
echo '==================================> COMPILE'
# May want to re-enable -Werror
# export CXXFLAGS="-Wall -Wextra -Werror"
export CXXFLAGS="-Wall -Wextra"
mkdir __build_static
cd __build_static
cmake -DBOOST_ENABLE_CMAKE=1 -DBUILD_TESTING=ON -DBoost_VERBOSE=1 \
-DBOOST_INCLUDE_LIBRARIES=$SELF ..
cmake --build .
ctest --output-on-failure -R boost_$SELF
cd ..
mkdir __build_shared
cd __build_shared
cmake -DBOOST_ENABLE_CMAKE=1 -DBUILD_TESTING=ON -DBoost_VERBOSE=1 \
-DBOOST_INCLUDE_LIBRARIES=$SELF -DBUILD_SHARED_LIBS=ON ..
cmake --build .
ctest --output-on-failure -R boost_$SELF
elif [ "$DRONE_JOB_BUILDTYPE" == "cmake1" ]; then
echo '==================================> INSTALL'
# https://github.com/opencv/opencv-python#frequently-asked-questions
pip install --upgrade pip
pip install --user cmake
echo '==================================> SCRIPT'
export SELF=$(basename $REPO_NAME)
BOOST_BRANCH=develop && [ "$DRONE_BRANCH" == "master" ] && BOOST_BRANCH=master || true
echo BOOST_BRANCH: $BOOST_BRANCH
cd ..
git clone -b $BOOST_BRANCH --depth 1 https://github.com/boostorg/boost.git boost-root
cd boost-root
# mkdir -p libs/$SELF
# cp -r $DRONE_BUILD_DIR/* libs/$SELF
# git submodule update --init tools/boostdep
git submodule update --init --recursive
mkdir -p libs/$SELF
cp -r $DRONE_BUILD_DIR/* libs/$SELF
# CMake tests
cd libs/$SELF
mkdir __build__ && cd __build__
cmake -DCMAKE_INSTALL_PREFIX=~/.local ..
cmake --build . --target install
ctest --output-on-failure
# CMake subdir tests
cd ../test/cmake_test && mkdir __build__ && cd __build__
cmake -DCMAKE_INSTALL_PREFIX=~/.local ..
cmake --build .
cmake --build . --target check
ctest --output-on-failure
# Install Library
cd ../../../../.. && mkdir __build_cmake_install_test__ && cd __build_cmake_install_test__
cmake -DBOOST_INCLUDE_LIBRARIES=$SELF -DCMAKE_INSTALL_PREFIX=~/.local -DBoost_VERBOSE=ON -DBoost_DEBUG=ON ..
cmake --build . --target install
# CMake install tests
cd ../libs/$SELF/test/cmake_test && mkdir __build_cmake_install_test__ && cd __build_cmake_install_test__
cmake -DBOOST_CI_INSTALL_TEST=ON -DCMAKE_PREFIX_PATH=~/.local ..
cmake --build .
ctest --output-on-failure
fi

View File

@@ -1,10 +1,19 @@
#
# Copyright 2020-2021 Peter Dimov
# Copyright 2021 Andrey Semashev
# Copyright 2022 Alan de Freitas
# 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:
@@ -13,510 +22,29 @@ on:
branches:
- master
- develop
- bugfix/**
- feature/**
concurrency:
group: ${{format('{0}:{1}', github.repository, github.ref)}}
cancel-in-progress: true
env:
GIT_FETCH_JOBS: 8
NET_RETRY_COUNT: 5
DEFAULT_BUILD_VARIANT: debug,release
- fix/**
- github/**
- pr/**
paths-ignore:
- LICENSE
- meta/**
- README.md
jobs:
posix:
defaults:
run:
shell: bash
strategy:
fail-fast: false
matrix:
include:
# Linux, gcc
- toolset: gcc-4.8
cxxstd: "11"
os: ubuntu-22.04
container: ubuntu:18.04
install:
- g++-4.8
- toolset: gcc-4.9
cxxstd: "11"
os: ubuntu-22.04
container: ubuntu:16.04
install:
- g++-4.9
- toolset: gcc-5
cxxstd: "11,14"
os: ubuntu-22.04
container: ubuntu:16.04
install:
- g++-5
- toolset: gcc-6
cxxstd: "11,14"
os: ubuntu-22.04
container: ubuntu:18.04
install:
- g++-6
- toolset: gcc-7
cxxstd: "14,17"
os: ubuntu-22.04
container: ubuntu:18.04
install:
- g++-7
- toolset: gcc-8
cxxstd: "17"
os: ubuntu-22.04
container: ubuntu:18.04
install:
- g++-8
- toolset: gcc-9
cxxstd: "17"
os: ubuntu-22.04
install:
- g++-9
- toolset: gcc-10
cxxstd: "17"
os: ubuntu-22.04
install:
- g++-10
- toolset: gcc-11
cxxstd: "17,20"
os: ubuntu-22.04
install:
- g++-11
sources:
- "ppa:ubuntu-toolchain-r/test"
- name: UBSAN
toolset: gcc-11
cxxstd: "17,20"
ubsan: 1
os: ubuntu-22.04
install:
- g++-11
sources:
- "ppa:ubuntu-toolchain-r/test"
# Linux, clang
- toolset: clang
compiler: clang++-3.8
cxxstd: "11"
os: ubuntu-22.04
container: ubuntu:16.04
install:
- clang-3.8
- toolset: clang
compiler: clang++-4.0
cxxstd: "11,14"
os: ubuntu-22.04
container: ubuntu:18.04
install:
- clang-4.0
- toolset: clang
compiler: clang++-5.0
cxxstd: "11,14"
os: ubuntu-22.04
container: ubuntu:18.04
install:
- clang-5.0
- toolset: clang
compiler: clang++-6.0
cxxstd: "14,17"
os: ubuntu-22.04
container: ubuntu:18.04
install:
- clang-6.0
- toolset: clang
compiler: clang++-7
cxxstd: "17"
os: ubuntu-22.04
container: ubuntu:18.04
install:
- clang-7
- toolset: clang
compiler: clang++-8
cxxstd: "17"
os: ubuntu-22.04
container: ubuntu:18.04
install:
- clang-8
- g++-7
gcc_toolchain: 7
- toolset: clang
compiler: clang++-9
cxxstd: "14,17"
os: ubuntu-22.04
container: ubuntu:18.04
install:
- clang-9
- toolset: clang
compiler: clang++-10
cxxstd: "14,17"
os: ubuntu-20.04
install:
- clang-10
- toolset: clang
compiler: clang++-11
cxxstd: "14,17"
os: ubuntu-20.04
install:
- clang-11
# clang 12 tested on drone
# - toolset: clang
# compiler: clang++-12
# cxxstd: "17,20"
# os: ubuntu-22.04
# install:
# - clang-12
# - toolset: clang
# compiler: clang++-12
# cxxstd: "17,20"
# cxxflags: -stdlib=libc++
# linkflags: -stdlib=libc++
# os: ubuntu-20.04
# install:
# - clang-12
# - libc++-12-dev
# - libc++abi-12-dev
# - name: UBSAN
# toolset: clang
# compiler: clang++-12
# cxxstd: "17,20"
# cxxflags: -stdlib=libc++
# linkflags: -stdlib=libc++
# ubsan: 1
# os: ubuntu-20.04
# install:
# - clang-12
# - libc++-12-dev
# - libc++abi-12-dev
- toolset: clang
cxxstd: "11,14,17"
os: macos-11
- name: CMake tests
cmake_tests: 1
os: ubuntu-22.04
timeout-minutes: 120
runs-on: ${{matrix.os}}
container: ${{matrix.container}}
steps:
- name: Setup environment
run: |
if [ -f "/etc/debian_version" ]
then
echo "DEBIAN_FRONTEND=noninteractive" >> $GITHUB_ENV
export DEBIAN_FRONTEND=noninteractive
fi
if [ -n "${{matrix.container}}" ]
then
echo "GHA_CONTAINER=${{matrix.container}}" >> $GITHUB_ENV
if [ -f "/etc/debian_version" ]
then
apt-get -o Acquire::Retries=$NET_RETRY_COUNT update
apt-get -o Acquire::Retries=$NET_RETRY_COUNT install -y sudo software-properties-common tzdata wget curl apt-transport-https make apt-file unzip libssl-dev build-essential autotools-dev autoconf automake g++ libc++-helpers python ruby cpio gcc-multilib g++-multilib pkgconf python3 ccache libpython-dev
# install pip:
python_version=$(python3 -c 'import sys; print("{0.major}.{0.minor}".format(sys.version_info))')
if [[ ${python_version} =~ ^3\.[0-5]$ ]]; then
true
else
apt-get install -y python3-distutils
fi
wget https://bootstrap.pypa.io/pip/$python_version/get-pip.py
python3 get-pip.py
# install git:
# apt-get install -y git
apt-add-repository ppa:git-core/ppa
apt-get -o Acquire::Retries=$NET_RETRY_COUNT update && apt-get -o Acquire::Retries=$NET_RETRY_COUNT install -y git
# install cmake:
# apt-get -o Acquire::Retries=$NET_RETRY_COUNT install -y cmake
sudo pip3 install cmake
fi
fi
git config --global pack.threads 0
- uses: actions/checkout@v2
- name: Install packages
if: matrix.install
run: |
SOURCE_KEYS=(${{join(matrix.source_keys, ' ')}})
SOURCES=(${{join(matrix.sources, ' ')}})
for key in "${SOURCE_KEYS[@]}"
do
for i in {1..$NET_RETRY_COUNT}
do
wget -O - "$key" | sudo apt-key add - && break || sleep 2
done
done
if [ ${#SOURCES[@]} -gt 0 ]
then
APT_ADD_REPO_COMMON_ARGS=("-y")
APT_ADD_REPO_HAS_SOURCE_ARGS=0
SOFTWARE_PROPERTIES_VERSION="$(dpkg-query --showformat='${Version}' --show software-properties-common)"
if dpkg --compare-versions "$SOFTWARE_PROPERTIES_VERSION" ge "0.96.24.20"
then
APT_ADD_REPO_COMMON_ARGS+=("-n")
fi
if dpkg --compare-versions "$SOFTWARE_PROPERTIES_VERSION" ge "0.98.10"
then
APT_ADD_REPO_HAS_SOURCE_ARGS=1
fi
for source in "${SOURCES[@]}"
do
for i in {1..$NET_RETRY_COUNT}
do
APT_ADD_REPO_ARGS=("${APT_ADD_REPO_COMMON_ARGS[@]}")
if [ $APT_ADD_REPO_HAS_SOURCE_ARGS -ne 0 ]
then
case "$source" in
"ppa:"*)
APT_ADD_REPO_ARGS+=("-P")
;;
"deb "*)
APT_ADD_REPO_ARGS+=("-S")
;;
*)
APT_ADD_REPO_ARGS+=("-U")
;;
esac
fi
APT_ADD_REPO_ARGS+=("$source")
sudo -E apt-add-repository "${APT_ADD_REPO_ARGS[@]}" && break || sleep 2
done
done
fi
sudo apt-get -o Acquire::Retries=$NET_RETRY_COUNT update
sudo apt-get -o Acquire::Retries=$NET_RETRY_COUNT install -y ${{join(matrix.install, ' ')}}
- name: Setup GCC Toolchain
if: matrix.gcc_toolchain
run: |
GCC_TOOLCHAIN_ROOT="$HOME/gcc-toolchain"
echo "GCC_TOOLCHAIN_ROOT=\"$GCC_TOOLCHAIN_ROOT\"" >> $GITHUB_ENV
MULTIARCH_TRIPLET="$(dpkg-architecture -qDEB_HOST_MULTIARCH)"
mkdir -p "$GCC_TOOLCHAIN_ROOT"
ln -s /usr/include "$GCC_TOOLCHAIN_ROOT/include"
ln -s /usr/bin "$GCC_TOOLCHAIN_ROOT/bin"
mkdir -p "$GCC_TOOLCHAIN_ROOT/lib/gcc/$MULTIARCH_TRIPLET"
ln -s "/usr/lib/gcc/$MULTIARCH_TRIPLET/${{matrix.gcc_toolchain}}" "$GCC_TOOLCHAIN_ROOT/lib/gcc/$MULTIARCH_TRIPLET/${{matrix.gcc_toolchain}}"
- name: Setup Boost
run: |
echo GITHUB_REPOSITORY: $GITHUB_REPOSITORY
LIBRARY=${GITHUB_REPOSITORY#*/}
echo LIBRARY: $LIBRARY
echo "LIBRARY=$LIBRARY" >> $GITHUB_ENV
echo GITHUB_BASE_REF: $GITHUB_BASE_REF
echo GITHUB_REF: $GITHUB_REF
REF=${GITHUB_BASE_REF:-$GITHUB_REF}
REF=${REF#refs/heads/}
echo REF: $REF
BOOST_BRANCH=develop && [ "$REF" == "master" ] && BOOST_BRANCH=master || true
echo BOOST_BRANCH: $BOOST_BRANCH
BUILD_JOBS=$((nproc || sysctl -n hw.ncpu) 2> /dev/null)
echo "BUILD_JOBS=$BUILD_JOBS" >> $GITHUB_ENV
echo "CMAKE_BUILD_PARALLEL_LEVEL=$BUILD_JOBS" >> $GITHUB_ENV
DEPINST_ARGS=()
GIT_VERSION="$(git --version | sed -e 's/git version //')"
if $(dpkg --compare-versions "$GIT_VERSION" ge 2.8.0)
then
DEPINST_ARGS+=("--git_args" "--jobs $GIT_FETCH_JOBS")
fi
cd ..
git clone -b "$BOOST_BRANCH" --depth 1 "https://github.com/boostorg/boost.git" "boost-root"
cd boost-root
# mkdir -p libs/$LIBRARY
# cp -r $GITHUB_WORKSPACE/* libs/$LIBRARY
# git submodule update --init tools/boostdep
git submodule update --init --recursive
mkdir -p libs/$SELF
cp -r $GITHUB_WORKSPACE/* libs/$SELF
DEPINST_ARGS+=("$LIBRARY")
python tools/boostdep/depinst/depinst.py "${DEPINST_ARGS[@]}"
if [ -z "${{matrix.cmake_tests}}" ]
then
./bootstrap.sh
./b2 headers
if [ -n "${{matrix.compiler}}" -o -n "$GCC_TOOLCHAIN_ROOT" ]
then
echo -n "using ${{matrix.toolset}} : : ${{matrix.compiler}}" > ~/user-config.jam
if [ -n "$GCC_TOOLCHAIN_ROOT" ]
then
echo -n " : <compileflags>\"--gcc-toolchain=$GCC_TOOLCHAIN_ROOT\" <linkflags>\"--gcc-toolchain=$GCC_TOOLCHAIN_ROOT\"" >> ~/user-config.jam
fi
echo " ;" >> ~/user-config.jam
fi
fi
- name: Run tests
if: matrix.cmake_tests == ''
run: |
cd ../boost-root
B2_ARGS=("-j" "$BUILD_JOBS" "toolset=${{matrix.toolset}}" "cxxstd=${{matrix.cxxstd}}")
if [ -n "${{matrix.build_variant}}" ]
then
B2_ARGS+=("variant=${{matrix.build_variant}}")
else
B2_ARGS+=("variant=$DEFAULT_BUILD_VARIANT")
fi
if [ -n "${{matrix.threading}}" ]
then
B2_ARGS+=("threading=${{matrix.threading}}")
fi
if [ -n "${{matrix.ubsan}}" ]
then
export UBSAN_OPTIONS="print_stacktrace=1"
B2_ARGS+=("cxxflags=-fsanitize=undefined -fno-sanitize-recover=undefined" "linkflags=-fsanitize=undefined -fuse-ld=gold" "define=UBSAN=1" "debug-symbols=on" "visibility=global")
fi
if [ -n "${{matrix.cxxflags}}" ]
then
B2_ARGS+=("cxxflags=${{matrix.cxxflags}}")
fi
if [ -n "${{matrix.linkflags}}" ]
then
B2_ARGS+=("linkflags=${{matrix.linkflags}}")
fi
B2_ARGS+=("libs/$LIBRARY/test")
./b2 "${B2_ARGS[@]}"
# - name: Run CMake tests
# if: matrix.cmake_tests != ''
# run: |
# cd ../boost-root
# git submodule update --init --recursive
# cd libs/$LIBRARY
# mkdir __build__ && cd __build__
# cmake -DCMAKE_INSTALL_PREFIX=~/.local ..
# cmake --build . --target install
windows:
strategy:
fail-fast: false
matrix:
include:
#- toolset: msvc-14.1
# cxxstd: "14,17,latest"
# addrmd: 32,64
# os: windows-2016
- toolset: msvc-14.2
cxxstd: "14,17"
addrmd: 32,64
os: windows-2019
- toolset: msvc-14.3
cxxstd: "17,20"
addrmd: 32,64
os: windows-2022
# - toolset: gcc
# cxxstd: "11,14,17"
# addrmd: 64
# os: windows-2019
runs-on: ${{matrix.os}}
steps:
- uses: actions/checkout@v2
- name: Setup Boost
shell: cmd
run: |
echo GITHUB_REPOSITORY: %GITHUB_REPOSITORY%
for /f %%i in ("%GITHUB_REPOSITORY%") do set LIBRARY=%%~nxi
echo LIBRARY: %LIBRARY%
echo LIBRARY=%LIBRARY%>>%GITHUB_ENV%
echo GITHUB_BASE_REF: %GITHUB_BASE_REF%
echo GITHUB_REF: %GITHUB_REF%
if "%GITHUB_BASE_REF%" == "" set GITHUB_BASE_REF=%GITHUB_REF%
set BOOST_BRANCH=develop
for /f %%i in ("%GITHUB_BASE_REF%") do if "%%~nxi" == "master" set BOOST_BRANCH=master
echo BOOST_BRANCH: %BOOST_BRANCH%
cd ..
git clone -b %BOOST_BRANCH% --depth 1 https://github.com/boostorg/boost.git boost-root
cd boost-root
xcopy /s /e /q %GITHUB_WORKSPACE% libs\%LIBRARY%\
git submodule update --init tools/boostdep
python tools/boostdep/depinst/depinst.py --git_args "--jobs %GIT_FETCH_JOBS%" %LIBRARY%
cmd /c bootstrap
b2 -d0 headers
- name: Run tests
shell: cmd
run: |
cd ../boost-root
b2 -j %NUMBER_OF_PROCESSORS% libs/%LIBRARY%/test toolset=${{matrix.toolset}} cxxstd=${{matrix.cxxstd}} address-model=${{matrix.addrmd}} variant=debug,release
CMake:
defaults:
run:
shell: bash
strategy:
fail-fast: false
matrix:
include:
- { os: ubuntu-22.04, build_shared: ON, build_type: Debug, generator: 'Unix Makefiles' }
- { os: ubuntu-22.04, build_shared: OFF, build_type: Debug, generator: 'Unix Makefiles' }
- { os: windows-2019, build_shared: ON, build_type: Debug, generator: 'Visual Studio 16 2019' }
- { os: windows-2019, build_shared: OFF, build_type: Debug, generator: 'Visual Studio 16 2019' }
timeout-minutes: 120
runs-on: ${{matrix.os}}
steps:
- uses: actions/checkout@v2
- name: Fetch Boost.CI
uses: actions/checkout@v2
with:
repository: boostorg/boost-ci
ref: master
path: boost-ci-cloned
- name: Get CI scripts folder
run: |
# Copy ci folder if not testing Boost.CI
[[ "$GITHUB_REPOSITORY" =~ "boost-ci" ]] || cp -r boost-ci-cloned/ci .
rm -rf boost-ci-cloned
- name: Setup Boost
env: {B2_DONT_BOOTSTRAP: 1}
run: source ci/github/install.sh
# - name: Run CMake tests
# run: |
# cd "$BOOST_ROOT"
# mkdir __build_cmake_test__ && cd __build_cmake_test__
# cmake -G "${{matrix.generator}}" -DCMAKE_BUILD_TYPE=${{matrix.build_type}} -DBOOST_INCLUDE_LIBRARIES=$SELF -DBUILD_SHARED_LIBS=${{matrix.build_shared}} -DBUILD_TESTING=ON -DBoost_VERBOSE=ON ..
# cmake --build . --target tests boost_url_tests boost_url_limits boost_url_extra --config ${{matrix.build_type}}
# ctest --output-on-failure --build-config ${{matrix.build_type}}
# - name: Run CMake subdir tests
# run: |
# cmake_test_folder="$BOOST_ROOT/libs/$SELF/test/cmake_test" # New unified folder
# [ -d "$cmake_test_folder" ] || cmake_test_folder="$BOOST_ROOT/libs/$SELF/test/cmake_subdir_test"
# cd "$cmake_test_folder"
# mkdir __build_cmake_subdir_test__ && cd __build_cmake_subdir_test__
# cmake -G "${{matrix.generator}}" -DBOOST_CI_INSTALL_TEST=OFF -DCMAKE_BUILD_TYPE=${{matrix.build_type}} -DBUILD_SHARED_LIBS=${{matrix.build_shared}} ..
# cmake --build . --config ${{matrix.build_type}}
# ctest --output-on-failure --build-config ${{matrix.build_type}}
# - name: Install Library
# run: |
# cd "$BOOST_ROOT"
# mkdir __build_cmake_install_test__ && cd __build_cmake_install_test__
# cmake -G "${{matrix.generator}}" -DCMAKE_BUILD_TYPE=${{matrix.build_type}} -DBOOST_INCLUDE_LIBRARIES=$SELF -DBUILD_SHARED_LIBS=${{matrix.build_shared}} -DCMAKE_INSTALL_PREFIX=~/.local -DBoost_VERBOSE=ON -DBoost_DEBUG=ON ..
# cmake --build . --target install --config ${{matrix.build_type}}
# - name: Run CMake install tests
# run: |
# cmake_test_folder="$BOOST_ROOT/libs/$SELF/test/cmake_test" # New unified folder
# [ -d "$cmake_test_folder" ] || cmake_test_folder="$BOOST_ROOT/libs/$SELF/test/cmake_install_test"
# cd "$cmake_test_folder"
# mkdir __build_cmake_install_test__ && cd __build_cmake_install_test__
# cmake -G "${{matrix.generator}}" -DBOOST_CI_INSTALL_TEST=ON -DCMAKE_BUILD_TYPE=${{matrix.build_type}} -DBUILD_SHARED_LIBS=${{matrix.build_shared}} -DCMAKE_PREFIX_PATH=~/.local ..
# cmake --build . --config ${{matrix.build_type}}
# ctest --output-on-failure --build-config ${{matrix.build_type}}
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 }}

View File

@@ -7,7 +7,7 @@
# Official repository: https://github.com/boostorg/static_string
#
cmake_minimum_required(VERSION 3.5...3.16)
cmake_minimum_required(VERSION 3.8...3.16)
project(boost_static_string VERSION "${BOOST_SUPERPROJECT_VERSION}" LANGUAGES CXX)
@@ -45,7 +45,7 @@ if (BOOST_STATIC_STRING_FIND_PACKAGE_BOOST)
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 static_assert throw_exception utility ${BOOST_STATIC_STRING_UNIT_TEST_LIBRARIES})
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)
@@ -90,7 +90,6 @@ else ()
Boost::assert
Boost::container_hash
Boost::core
Boost::static_assert
Boost::throw_exception
Boost::utility
)

10
Jamfile
View File

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

View File

@@ -1,9 +1,9 @@
# 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) | [![Build Status](https://travis-ci.org/boostorg/static_string.svg?branch=master)](https://travis-ci.org/boostorg/static_string) | [![Build status](https://ci.appveyor.com/api/projects/status/64es4wg4w7mc5wn2/branch/master?svg=true)](https://ci.appveyor.com/project/sdkrystian/static-string/branch/master) | [![Build Status](https://krystiands.visualstudio.com/static_string/_apis/build/status/Boost.StaticString?branchName=master)](https://krystiands.visualstudio.com/static_string/_build/latest?definitionId=3&branchName=master) | [![codecov](https://codecov.io/gh/boostorg/static_string/branch/master/graph/badge.svg)](https://codecov.io/gh/boostorg/static_string/branch/master) | [![Documentation](https://img.shields.io/badge/docs-master-brightgreen.svg)](http://www.boost.org/doc/libs/release/libs/static_string) | [![Matrix](https://img.shields.io/badge/matrix-master-brightgreen.svg)](http://www.boost.org/development/tests/master/developer/static_string.html)
[`develop`](https://github.com/boostorg/static_string/tree/develop) | [![Build Status](https://travis-ci.org/boostorg/static_string.svg?branch=develop)](https://travis-ci.org/boostorg/static_string) | [![Build status](https://ci.appveyor.com/api/projects/status/64es4wg4w7mc5wn2/branch/develop?svg=true)](https://ci.appveyor.com/project/sdkrystian/static-string/branch/develop) | [![Build Status](https://krystiands.visualstudio.com/static_string/_apis/build/status/Boost.StaticString?branchName=develop)](https://krystiands.visualstudio.com/static_string/_build/latest?definitionId=3&branchName=develop) | [![codecov](https://codecov.io/gh/boostorg/static_string/branch/develop/graph/badge.svg)](https://codecov.io/gh/boostorg/static_string/branch/develop) | [![Documentation](https://img.shields.io/badge/docs-develop-brightgreen.svg)](http://www.boost.org/doc/libs/develop/libs/static_string) | [![Matrix](https://img.shields.io/badge/matrix-develop-brightgreen.svg)](http://www.boost.org/development/tests/develop/developer/static_string.html)
[`master`](https://github.com/boostorg/static_string/tree/master) | [![Build Status](https://github.com/boostorg/static_string/actions/workflows/ci.yml/badge.svg?branch=master)](https://github.com/boostorg/static_string/actions?query=branch:master) | [![Build status](https://ci.appveyor.com/api/projects/status/64es4wg4w7mc5wn2/branch/master?svg=true)](https://ci.appveyor.com/project/sdkrystian/static-string/branch/master) | [![Build Status](https://krystiands.visualstudio.com/static_string/_apis/build/status/Boost.StaticString?branchName=master)](https://krystiands.visualstudio.com/static_string/_build/latest?definitionId=3&branchName=master) | [![codecov](https://codecov.io/gh/boostorg/static_string/branch/master/graph/badge.svg)](https://codecov.io/gh/boostorg/static_string/branch/master) | [![Documentation](https://img.shields.io/badge/docs-master-brightgreen.svg)](http://www.boost.org/doc/libs/release/libs/static_string) | [![Matrix](https://img.shields.io/badge/matrix-master-brightgreen.svg)](https://regression.boost.org/master/developer/static_string.html)
[`develop`](https://github.com/boostorg/static_string/tree/develop) | [![Build Status](https://github.com/boostorg/static_string/actions/workflows/ci.yml/badge.svg?branch=develop)](https://github.com/boostorg/static_string/actions?query=branch:develop) | [![Build status](https://ci.appveyor.com/api/projects/status/64es4wg4w7mc5wn2/branch/develop?svg=true)](https://ci.appveyor.com/project/sdkrystian/static-string/branch/develop) | [![Build Status](https://krystiands.visualstudio.com/static_string/_apis/build/status/Boost.StaticString?branchName=develop)](https://krystiands.visualstudio.com/static_string/_build/latest?definitionId=3&branchName=develop) | [![codecov](https://codecov.io/gh/boostorg/static_string/branch/develop/graph/badge.svg)](https://codecov.io/gh/boostorg/static_string/branch/develop) | [![Documentation](https://img.shields.io/badge/docs-develop-brightgreen.svg)](http://www.boost.org/doc/libs/develop/libs/static_string) | [![Matrix](https://img.shields.io/badge/matrix-develop-brightgreen.svg)](https://regression.boost.org/develop/developer/static_string.html)
## Introduction

27
build.jam Normal file
View 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
;

View File

@@ -9,21 +9,21 @@
project static_string/doc ;
import boostbook ;
import type ;
import os ;
import ../../../tools/docca/docca.jam ;
import-search /boost/docca ;
docca.reference reference.qbk
import docca ;
import path ;
import os ;
local include-prefix = [ path.root $(__file__:D) [ path.pwd ] ] ;
include-prefix = [ path.native $(include-prefix:D)/include ] ;
docca.pyreference reference.qbk
:
xsl/custom-overrides.xsl
[ glob-tree-ex ../include/boost/static_string : *.hpp *.ipp : detail impl ]
externals.hpp
:
<doxygen:param>PROJECT_NAME=StaticString
<doxygen:param>PROJECT_BRIEF="Static String Library"
<doxygen:param>ALIASES="esafe=\"@par Exception Safety\""
<doxygen:param>FILE_PATTERNS=
<doxygen:param>EXAMPLE_PATTERNS=
<doxygen:param>DISTRIBUTE_GROUP_DOC=YES
<doxygen:param>MACRO_EXPANSION=YES
<doxygen:param>EXPAND_ONLY_PREDEF=YES
@@ -40,19 +40,17 @@ docca.reference reference.qbk
<doxygen:param>EXTRACT_ALL=YES
<doxygen:param>EXTRACT_PRIVATE=YES
<doxygen:param>EXTRACT_LOCAL_CLASSES=NO
<doxygen:param>SHOW_INCLUDE_FILES=NO
<doxygen:param>INLINE_INFO=NO
<doxygen:param>SORT_MEMBER_DOCS=NO
<doxygen:param>SORT_MEMBERS_CTORS_1ST=YES
<doxygen:param>SHOW_USED_FILES=NO
<doxygen:param>SHOW_FILES=NO
<doxygen:param>SHOW_NAMESPACES=NO
<doxygen:param>CLASS_DIAGRAMS=NO
<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
;
#-------------------------------------------------------------------------------

12
doc/config.json Normal file
View 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
View 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

View File

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

View File

@@ -139,9 +139,6 @@
#ifndef BOOST_STATIC_STRING_THROW
#define BOOST_STATIC_STRING_THROW(ex) BOOST_THROW_EXCEPTION(ex)
#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
#define BOOST_STATIC_STRING_ASSERT(cond) BOOST_ASSERT(cond)
#endif
@@ -149,9 +146,6 @@
#ifndef BOOST_STATIC_STRING_THROW
#define BOOST_STATIC_STRING_THROW(ex) throw ex
#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
#define BOOST_STATIC_STRING_ASSERT(cond) assert(cond)
#endif
@@ -161,7 +155,6 @@
#include <boost/config.hpp>
#include <boost/assert.hpp>
#include <boost/container_hash/hash.hpp>
#include <boost/static_assert.hpp>
#include <boost/utility/string_view.hpp>
#include <boost/core/detail/string_view.hpp>
#include <boost/throw_exception.hpp>
@@ -175,27 +168,31 @@
#include <cassert>
#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:
#if defined(__GLIBCPP__) || defined(__GLIBCXX__)
#if (BOOST_LIBSTDCXX_VERSION < 70100) || (__cplusplus <= 201402L)
# define BOOST_STATIC_STRING_NO_CXX17_HDR_STRING_VIEW
#endif
#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
# 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
# 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) || \
@@ -278,4 +275,8 @@ using basic_string_view =
} // 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
#endif

View File

@@ -34,11 +34,15 @@
#include <algorithm>
#include <cstdint>
#include <cstdio>
#if defined(BOOST_STATIC_STRING_USE_STD_FORMAT)
#include <format>
#endif
#include <functional>
#include <initializer_list>
#include <limits>
#include <iosfwd>
#include <type_traits>
#include <utility>
namespace boost {
namespace static_strings {
@@ -549,11 +553,22 @@ inline
static_string<N>
to_static_string_int_impl(Integer value) noexcept
{
char buffer[N];
const auto digits_end = std::end(buffer);
const auto digits_begin = integer_to_string<std::char_traits<char>, Integer>(
digits_end, value, std::is_signed<Integer>{});
return static_string<N>(digits_begin, std::distance(digits_begin, digits_end));
using size_type = typename static_string<N>::size_type;
static_string<N> result;
result.resize_and_overwrite(
N,
[&](char* buffer, size_type) -> size_type
{
char* const digits_end = buffer + N;
char* const digits_begin = integer_to_string<std::char_traits<char>, Integer>(
digits_end, value, std::is_signed<Integer>{});
const size_type len = digits_end - digits_begin;
std::char_traits<char>::move(buffer, digits_begin, len);
return len;
}
);
return result;
}
#ifdef BOOST_STATIC_STRING_HAS_WCHAR
@@ -562,11 +577,21 @@ inline
static_wstring<N>
to_static_wstring_int_impl(Integer value) noexcept
{
wchar_t buffer[N];
const auto digits_end = std::end(buffer);
const auto digits_begin = integer_to_wstring<std::char_traits<wchar_t>, Integer>(
digits_end, value, std::is_signed<Integer>{});
return static_wstring<N>(digits_begin, std::distance(digits_begin, digits_end));
using size_type = typename static_wstring<N>::size_type;
static_wstring<N> result;
result.resize_and_overwrite(
N,
[&](wchar_t* buffer, size_type) -> size_type
{
wchar_t* const digits_end = buffer + N;
wchar_t* const digits_begin = integer_to_wstring<std::char_traits<wchar_t>, Integer>(
digits_end, value, std::is_signed<Integer>{});
const size_type len = digits_end - digits_begin;
std::char_traits<wchar_t>::move(buffer, digits_begin, len);
return len;
}
);
return result;
}
#endif
@@ -586,33 +611,78 @@ count_digits(std::size_t value)
#pragma GCC diagnostic ignored "-Wformat-truncation"
#endif
#if defined(BOOST_STATIC_STRING_USE_STD_FORMAT)
template<std::size_t N, typename FloatingPoint>
inline
static_string<N>
cpp26_to_static_string(FloatingPoint value) noexcept
{
using size_type = typename static_string<N>::size_type;
static_string<N> result;
result.resize_and_overwrite(
N,
[&](char* buffer, size_type) -> size_type
{
const auto formatted = std::format_to_n(buffer, N, "{}", value);
return formatted.size;
}
);
return result;
}
#endif
template<std::size_t N>
inline
static_string<N>
to_static_string_float_impl(double value) noexcept
{
#if defined(BOOST_STATIC_STRING_USE_STD_FORMAT)
return cpp26_to_static_string<N>(value);
#else
using size_type = typename static_string<N>::size_type;
static_string<N> result;
// we have to assume here that no reasonable implementation
// will require more than 2^63 chars to represent a float value.
const long long narrow =
static_cast<long long>(N);
// extra one needed for null terminator
char buffer[N + 1];
// we know that a formatting error will not occur, so
// we assume that the result is always positive
if (std::size_t(std::snprintf(buffer, N + 1, "%f", value)) > N)
{
// the + 4 is for the decimal, 'e',
// its sign, and the sign of the integral portion
const int reserved_count =
(std::max)(2, count_digits(
std::numeric_limits<double>::max_exponent10)) + 4;
const int precision = narrow > reserved_count ?
N - reserved_count : 0;
// switch to scientific notation
std::snprintf(buffer, N + 1, "%.*e", precision, value);
}
// this will not throw
return static_string<N>(buffer);
result.resize_and_overwrite(
N,
[&](char* buffer, size_type) -> size_type
{
// we know that a formatting error will not occur, so
// we assume that the result is always positive
std::size_t length = std::snprintf(buffer, N + 1, "%f", value);
if (length > N)
{
// the + 4 is for the decimal, 'e',
// its sign, and the sign of the integral portion
const int reserved_count =
(std::max)(2, count_digits(
std::numeric_limits<double>::max_exponent10)) + 4;
const int precision = narrow > reserved_count ?
N - reserved_count : 0;
// switch to scientific notation
length = std::snprintf(buffer, N + 1, "%.*e", precision, value);
}
return length;
}
);
return result;
#endif
}
template<std::size_t N>
inline
static_string<N>
to_static_string_float_impl(float value) noexcept
{
#if defined(BOOST_STATIC_STRING_USE_STD_FORMAT)
return cpp26_to_static_string<N>(value);
#else
return to_static_string_float_impl<N>(static_cast<double>(value));
#endif
}
template<std::size_t N>
@@ -620,68 +690,123 @@ inline
static_string<N>
to_static_string_float_impl(long double value) noexcept
{
#if defined(BOOST_STATIC_STRING_USE_STD_FORMAT)
return cpp26_to_static_string<N>(value);
#else
using size_type = typename static_string<N>::size_type;
static_string<N> result;
// we have to assume here that no reasonable implementation
// will require more than 2^63 chars to represent a float value.
const long long narrow =
static_cast<long long>(N);
// extra one needed for null terminator
char buffer[N + 1];
// snprintf returns the number of characters
// that would have been written
// we know that a formatting error will not occur, so
// we assume that the result is always positive
if (std::size_t(std::snprintf(buffer, N + 1, "%Lf", value)) > N)
{
// the + 4 is for the decimal, 'e',
// its sign, and the sign of the integral portion
const int reserved_count =
(std::max)(2, count_digits(
std::numeric_limits<long double>::max_exponent10)) + 4;
const int precision = narrow > reserved_count ?
N - reserved_count : 0;
// switch to scientific notation
std::snprintf(buffer, N + 1, "%.*Le", precision, value);
}
// this will not throw
return static_string<N>(buffer);
result.resize_and_overwrite(
N,
[&](char* buffer, size_type)->size_type
{
// snprintf returns the number of characters
// that would have been written
// we know that a formatting error will not occur, so
// we assume that the result is always positive
std::size_t length = std::snprintf(buffer, N + 1, "%Lf", value);
if (length > N)
{
// the + 4 is for the decimal, 'e',
// its sign, and the sign of the integral portion
const int reserved_count =
(std::max)(2, count_digits(
std::numeric_limits<long double>::max_exponent10)) + 4;
const int precision = narrow > reserved_count ?
N - reserved_count : 0;
// switch to scientific notation
length = std::snprintf(buffer, N + 1, "%.*Le", precision, value);
}
return length;
}
);
return result;
#endif
}
#ifdef BOOST_STATIC_STRING_HAS_WCHAR
#if defined(BOOST_STATIC_STRING_USE_STD_FORMAT)
template<std::size_t N, typename FloatingPoint>
inline
static_wstring<N>
cpp26_to_static_wstring(FloatingPoint value) noexcept
{
using size_type = typename static_wstring<N>::size_type;
static_wstring<N> result;
result.resize_and_overwrite(
N,
[&](wchar_t* buffer, size_type) -> size_type
{
const auto formatted = std::format_to_n(buffer, N, L"{}", value);
return formatted.size;
}
);
return result;
}
#endif
template<std::size_t N>
inline
static_wstring<N>
to_static_wstring_float_impl(double value) noexcept
{
#if defined(BOOST_STATIC_STRING_USE_STD_FORMAT)
return cpp26_to_static_wstring<N>(value);
#else
using size_type = typename static_wstring<N>::size_type;
static_wstring<N> result;
// we have to assume here that no reasonable implementation
// will require more than 2^63 chars to represent a float value.
const long long narrow =
static_cast<long long>(N);
// extra one needed for null terminator
wchar_t buffer[N + 1];
// swprintf returns a negative number if it can't
// fit all the characters in the buffer.
// mingw has a non-standard swprintf, so
// this just covers all the bases. short
// circuit evaluation will ensure that the
// second operand is not evaluated on conforming
// implementations.
const long long num_written =
std::swprintf(buffer, N + 1, L"%f", value);
if (num_written < 0 ||
num_written > narrow)
{
// the + 4 is for the decimal, 'e',
// its sign, and the sign of the integral portion
const int reserved_count =
(std::max)(2, count_digits(
std::numeric_limits<double>::max_exponent10)) + 4;
const int precision = narrow > reserved_count ?
N - reserved_count : 0;
// switch to scientific notation
std::swprintf(buffer, N + 1, L"%.*e", precision, value);
}
// this will not throw
return static_wstring<N>(buffer);
result.resize_and_overwrite(
N,
[&](wchar_t* buffer, size_type) -> size_type
{
// swprintf returns a negative number if it can't
// fit all the characters in the buffer.
// mingw has a non-standard swprintf, so
// this just covers all the bases. short
// circuit evaluation will ensure that the
// second operand is not evaluated on conforming
// implementations.
int num_written =
std::swprintf(buffer, N + 1, L"%f", value);
if (num_written < 0 ||
num_written > narrow)
{
// the + 4 is for the decimal, 'e',
// its sign, and the sign of the integral portion
const int reserved_count =
(std::max)(2, count_digits(
std::numeric_limits<double>::max_exponent10)) + 4;
const int precision = narrow > reserved_count ?
N - reserved_count : 0;
// switch to scientific notation
num_written = std::swprintf(buffer, N + 1, L"%.*e", precision, value);
}
return num_written;
}
);
return result;
#endif
}
template<std::size_t N>
inline
static_wstring<N>
to_static_wstring_float_impl(float value) noexcept
{
#if defined(BOOST_STATIC_STRING_USE_STD_FORMAT)
return cpp26_to_static_wstring<N>(value);
#else
return to_static_wstring_float_impl<N>(static_cast<double>(value));
#endif
}
template<std::size_t N>
@@ -689,36 +814,46 @@ inline
static_wstring<N>
to_static_wstring_float_impl(long double value) noexcept
{
#if defined(BOOST_STATIC_STRING_USE_STD_FORMAT)
return cpp26_to_static_wstring<N>(value);
#else
using size_type = typename static_wstring<N>::size_type;
static_wstring<N> result;
// we have to assume here that no reasonable implementation
// will require more than 2^63 chars to represent a float value.
const long long narrow =
static_cast<long long>(N);
// extra one needed for null terminator
wchar_t buffer[N + 1];
// swprintf returns a negative number if it can't
// fit all the characters in the buffer.
// mingw has a non-standard swprintf, so
// this just covers all the bases. short
// circuit evaluation will ensure that the
// second operand is not evaluated on conforming
// implementations.
const long long num_written =
std::swprintf(buffer, N + 1, L"%Lf", value);
if (num_written < 0 ||
num_written > narrow)
{
// the + 4 is for the decimal, 'e',
// its sign, and the sign of the integral portion
const int reserved_count =
(std::max)(2, count_digits(
std::numeric_limits<long double>::max_exponent10)) + 4;
const int precision = narrow > reserved_count ?
N - reserved_count : 0;
// switch to scientific notation
std::swprintf(buffer, N + 1, L"%.*Le", precision, value);
}
// this will not throw
return static_wstring<N>(buffer);
result.resize_and_overwrite(
N,
[&](wchar_t* buffer, size_type) -> size_type
{
// swprintf returns a negative number if it can't
// fit all the characters in the buffer.
// mingw has a non-standard swprintf, so
// this just covers all the bases. short
// circuit evaluation will ensure that the
// second operand is not evaluated on conforming
// implementations.
int num_written =
std::swprintf(buffer, N + 1, L"%Lf", value);
if (num_written < 0 ||
num_written > narrow)
{
// the + 4 is for the decimal, 'e',
// its sign, and the sign of the integral portion
const int reserved_count =
(std::max)(2, count_digits(
std::numeric_limits<long double>::max_exponent10)) + 4;
const int precision = narrow > reserved_count ?
N - reserved_count : 0;
// switch to scientific notation
num_written = std::swprintf(buffer, N + 1, L"%.*Le", precision, value);
}
return num_written;
}
);
return result;
#endif
}
#endif
@@ -913,7 +1048,7 @@ throw_exception(const char* msg)
basic_static_string<N, char8_t, std::char_traits<char8_t>>;
@endcode
@see to_static_string
@see @ref to_static_string.
*/
template<std::size_t N, typename CharT,
typename Traits = std::char_traits<CharT>>
@@ -925,6 +1060,7 @@ class basic_static_string
private:
template<std::size_t, class, class>
friend class basic_static_string;
public:
//--------------------------------------------------------------------------
//
@@ -1093,11 +1229,7 @@ public:
Copy constructor.
*/
BOOST_STATIC_STRING_CPP14_CONSTEXPR
basic_static_string(const basic_static_string& other) noexcept
{
assign(other);
}
basic_static_string(const basic_static_string& other) = default;
/** Constructor.
@@ -1185,12 +1317,8 @@ public:
@throw std::length_error `s.size() > max_size()`.
*/
BOOST_STATIC_STRING_CPP14_CONSTEXPR
basic_static_string&
operator=(const basic_static_string& s)
{
return assign(s);
}
operator=(const basic_static_string& s) = default;
/** Assign to the string.
@@ -3605,8 +3733,8 @@ public:
`{data() + pos, std::min(count, size() - pos))`.
@param pos The index to being the substring at. The
default arugment for this parameter is `0`.
@param count The length of the substring. The default arugment
default argument for this parameter is `0`.
@param count The length of the substring. The default argument
for this parameter is @ref npos.
@throw std::out_of_range `pos > size()`
@@ -3636,8 +3764,8 @@ public:
to `{data() + pos, std::min(count, size() - pos))`.
@param pos The index to being the substring at. The
default arugment for this parameter is `0`.
@param count The length of the substring. The default arugment
default argument for this parameter is `0`.
@param count The length of the substring. The default argument
for this parameter is @ref npos.
@throw std::out_of_range `pos > size()`
@@ -3716,6 +3844,31 @@ public:
size_type n,
value_type c);
/**
Resize the string and overwrite its contents.
Resizes the string to contain `n` characters, and uses the
provided function object `op` to overwrite the string contents.
The function object is called with two arguments: a pointer to
the string internal buffer, and the size of the string. The
function object shall return the number of characters written to
the buffer, which shall be less than or equal to `n`. The string
size is set to the value returned by the function object.
@par Exception Safety
Strong guarantee. However, if an exception is thrown by
`std::move(op)(p, count)`, the behavior is undefined.
@throw std::length_error `n > max_size()`
*/
template<typename Operation>
BOOST_STATIC_STRING_CPP14_CONSTEXPR
void
resize_and_overwrite(
size_type n,
Operation op);
/** Swap two strings.
Swaps the contents of the string and `s`.
@@ -6147,9 +6300,13 @@ operator<<(
// Unsigned overloads have a + 1, for the missing digit.
// Floating point overloads have a + 4, for the sign
// of the integral part, sign of the exponent, the 'e',
// and the decimal.
// Floating point overloads have a +8 (for float), + 8
// (for double), and +10 for long double (that accounts
// for the sign of the integral part, the missing digit,
// the decimal point, the sign of the exponent, the 'e'
// and up to two, three or five digits of exponent---float
// uses the same value as double, because we sometimes
// reuse the conversion from double for floats).
/// Converts `value` to a `static_string`
static_string<std::numeric_limits<int>::digits10 + 2>
@@ -6206,30 +6363,30 @@ to_static_string(unsigned long long value) noexcept
}
/// Converts `value` to a `static_string`
static_string<std::numeric_limits<float>::max_digits10 + 4>
static_string<std::numeric_limits<float>::max_digits10 + 8>
inline
to_static_string(float value) noexcept
{
return detail::to_static_string_float_impl<
std::numeric_limits<float>::max_digits10 + 4>(value);
std::numeric_limits<float>::max_digits10 + 8>(value);
}
/// Converts `value` to a `static_string`
static_string<std::numeric_limits<double>::max_digits10 + 4>
static_string<std::numeric_limits<double>::max_digits10 + 8>
inline
to_static_string(double value) noexcept
{
return detail::to_static_string_float_impl<
std::numeric_limits<double>::max_digits10 + 4>(value);
std::numeric_limits<double>::max_digits10 + 8>(value);
}
/// Converts `value` to a `static_string`
static_string<std::numeric_limits<long double>::max_digits10 + 4>
static_string<std::numeric_limits<long double>::max_digits10 + 10>
inline
to_static_string(long double value) noexcept
{
return detail::to_static_string_float_impl<
std::numeric_limits<long double>::max_digits10 + 4>(value);
std::numeric_limits<long double>::max_digits10 + 10>(value);
}
#ifdef BOOST_STATIC_STRING_HAS_WCHAR
@@ -6288,30 +6445,30 @@ to_static_wstring(unsigned long long value) noexcept
}
/// Converts `value` to a `static_wstring`
static_wstring<std::numeric_limits<float>::max_digits10 + 4>
static_wstring<std::numeric_limits<float>::max_digits10 + 8>
inline
to_static_wstring(float value) noexcept
{
return detail::to_static_wstring_float_impl<
std::numeric_limits<float>::max_digits10 + 4>(value);
std::numeric_limits<float>::max_digits10 + 8>(value);
}
/// Converts `value` to a `static_wstring`
static_wstring<std::numeric_limits<double>::max_digits10 + 4>
static_wstring<std::numeric_limits<double>::max_digits10 + 8>
inline
to_static_wstring(double value) noexcept
{
return detail::to_static_wstring_float_impl<
std::numeric_limits<double>::max_digits10 + 4>(value);
std::numeric_limits<double>::max_digits10 + 8>(value);
}
/// Converts `value` to a `static_wstring`
static_wstring<std::numeric_limits<long double>::max_digits10 + 4>
static_wstring<std::numeric_limits<long double>::max_digits10 + 10>
inline
to_static_wstring(long double value) noexcept
{
return detail::to_static_wstring_float_impl<
std::numeric_limits<long double>::max_digits10 + 4>(value);
std::numeric_limits<long double>::max_digits10 + 10>(value);
}
#endif
@@ -6666,6 +6823,26 @@ resize(size_type n, value_type c)
term();
}
template<std::size_t N, typename CharT, typename Traits>
template<typename Operation>
BOOST_STATIC_STRING_CPP14_CONSTEXPR
void
basic_static_string<N, CharT, Traits>::
resize_and_overwrite(
size_type n,
Operation op)
{
if (n > max_size()) {
detail::throw_exception<std::length_error>("n > max_size() in resize_and_overwrite()");
}
CharT* p = data();
const auto new_size = std::move(op)(p, n);
BOOST_STATIC_STRING_ASSERT(new_size >= 0 && size_type(new_size) <= n);
this->set_size(size_type(new_size));
term();
}
template<std::size_t N, typename CharT, typename Traits>
BOOST_STATIC_STRING_CPP14_CONSTEXPR
void

View File

@@ -7,7 +7,7 @@
],
"description": "A fixed capacity dynamically sized string.",
"category": [
"Container",
"Containers",
"String"
],
"maintainers": [

View File

@@ -8,18 +8,21 @@
#
import testing ;
import ../../config/checks/config : requires ;
import-search /boost/config/checks ;
import config : requires ;
local defines =
[ requires
cxx11_constexpr
cxx11_decltype
cxx11_hdr_tuple
cxx11_hdr_type_traits
cxx11_template_aliases
cxx11_variadic_templates
]
;
project : requirements $(defines) ;
project : requirements $(defines)
<library>/boost/static_string//boost_static_string ;
run static_string.cpp ;

View 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
View 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;
}

View File

@@ -171,8 +171,10 @@ testConstantEvaluation()
a.substr(0);
#ifdef BOOST_STATIC_STRING_HAS_ANY_STRING_VIEW
// subview
a.subview(0);
#endif
// copy
char k[20]{};
@@ -606,4 +608,4 @@ testConstantEvaluation()
#endif
}
} // static_strings
} // boost
} // boost

File diff suppressed because it is too large Load Diff