From 113ae8d69de56314a07e67cc135864cc70cc126b Mon Sep 17 00:00:00 2001 From: Matt Borland Date: Wed, 18 Feb 2026 10:07:40 -0500 Subject: [PATCH 1/5] Change safe_numbers namespace to charconv for charconv functions --- include/boost/safe_numbers/charconv.hpp | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/include/boost/safe_numbers/charconv.hpp b/include/boost/safe_numbers/charconv.hpp index 91c9fd3..4482e2c 100644 --- a/include/boost/safe_numbers/charconv.hpp +++ b/include/boost/safe_numbers/charconv.hpp @@ -14,14 +14,14 @@ #endif // BOOST_SAFE_NUMBERS_BUILD_MODULE -namespace boost::safe_numbers { +namespace boost::charconv { -template - requires (!detail::is_verified_type_v) +template + requires (!safe_numbers::detail::is_verified_type_v) constexpr auto from_chars(const char* first, const char* last, T& value, int base = 10) -> charconv::from_chars_result { - using underlying_type = detail::underlying_type_t; + using underlying_type = safe_numbers::detail::underlying_type_t; underlying_type result {}; const auto r {charconv::from_chars(first, last, result, base)}; @@ -30,12 +30,12 @@ constexpr auto from_chars(const char* first, const char* last, T& value, int bas return r; } -template - requires detail::is_verified_type_v +template + requires safe_numbers::detail::is_verified_type_v consteval auto from_chars(const char* first, const char* last, T& value, int base = 10) -> charconv::from_chars_result { - using underlying_type = detail::underlying_type_t; + using underlying_type = safe_numbers::detail::underlying_type_t; underlying_type result {}; const auto r {charconv::from_chars(first, last, result, base)}; @@ -44,14 +44,14 @@ consteval auto from_chars(const char* first, const char* last, T& value, int bas return r; } -template +template constexpr auto to_chars(char* first, char* last, const T value, int base = 10) -> charconv::to_chars_result { - using underlying_type = detail::underlying_type_t; + using underlying_type = safe_numbers::detail::underlying_type_t; return charconv::to_chars(first, last, static_cast(value), base); } -} // namespace boost::safe_numbers +} // namespace boost::charconv #endif // BOOST_SAFE_NUMBERS_CHARCONV_HPP From 73cfaa9c739053d3e55cecc44e95a4f6d00dd732 Mon Sep 17 00:00:00 2001 From: Matt Borland Date: Wed, 18 Feb 2026 10:26:39 -0500 Subject: [PATCH 2/5] Fix namespace in tests --- examples/charconv.cpp | 2 ++ test/test_unsigned_bounded_charconv.cpp | 2 ++ test/test_unsigned_charconv.cpp | 2 ++ test/test_verified_charconv.cpp | 16 ++++++++-------- 4 files changed, 14 insertions(+), 8 deletions(-) diff --git a/examples/charconv.cpp b/examples/charconv.cpp index 9630ef8..b3d9a52 100644 --- a/examples/charconv.cpp +++ b/examples/charconv.cpp @@ -11,6 +11,8 @@ int main() { using namespace boost::safe_numbers; + using boost::charconv::to_chars; + using boost::charconv::from_chars; // to_chars: Convert safe integer to string u32 value {12345}; diff --git a/test/test_unsigned_bounded_charconv.cpp b/test/test_unsigned_bounded_charconv.cpp index a4433d1..0597141 100644 --- a/test/test_unsigned_bounded_charconv.cpp +++ b/test/test_unsigned_bounded_charconv.cpp @@ -77,6 +77,8 @@ import boost.safe_numbers; #endif using namespace boost::safe_numbers; +using boost::charconv::to_chars; +using boost::charconv::from_chars; static std::mt19937_64 rng {42}; diff --git a/test/test_unsigned_charconv.cpp b/test/test_unsigned_charconv.cpp index 0b4066e..f73b4b6 100644 --- a/test/test_unsigned_charconv.cpp +++ b/test/test_unsigned_charconv.cpp @@ -77,6 +77,8 @@ import boost.safe_numbers; #endif using namespace boost::safe_numbers; +using boost::charconv::to_chars; +using boost::charconv::from_chars; static std::mt19937_64 rng {42}; diff --git a/test/test_verified_charconv.cpp b/test/test_verified_charconv.cpp index 21e8efa..97e8e74 100644 --- a/test/test_verified_charconv.cpp +++ b/test/test_verified_charconv.cpp @@ -28,7 +28,7 @@ void test_to_chars() constexpr auto val = VerifiedT{BasisT{42}}; char buffer[256]; - const auto r = boost::safe_numbers::to_chars(buffer, buffer + sizeof(buffer), val); + const auto r = boost::charconv::to_chars(buffer, buffer + sizeof(buffer), val); BOOST_TEST(r.ec == std::errc{}); const auto len = static_cast(r.ptr - buffer); @@ -43,7 +43,7 @@ void test_to_chars_zero() constexpr auto val = VerifiedT{BasisT{0}}; char buffer[256]; - const auto r = boost::safe_numbers::to_chars(buffer, buffer + sizeof(buffer), val); + const auto r = boost::charconv::to_chars(buffer, buffer + sizeof(buffer), val); BOOST_TEST(r.ec == std::errc{}); const auto len = static_cast(r.ptr - buffer); @@ -57,7 +57,7 @@ void test_to_chars_255() constexpr auto val = VerifiedT{BasisT{255}}; char buffer[256]; - const auto r = boost::safe_numbers::to_chars(buffer, buffer + sizeof(buffer), val); + const auto r = boost::charconv::to_chars(buffer, buffer + sizeof(buffer), val); BOOST_TEST(r.ec == std::errc{}); const auto len = static_cast(r.ptr - buffer); @@ -73,7 +73,7 @@ void test_to_chars_hex() constexpr auto val = VerifiedT{BasisT{255}}; char buffer[256]; - const auto r = boost::safe_numbers::to_chars(buffer, buffer + sizeof(buffer), val, 16); + const auto r = boost::charconv::to_chars(buffer, buffer + sizeof(buffer), val, 16); BOOST_TEST(r.ec == std::errc{}); const auto len = static_cast(r.ptr - buffer); @@ -91,7 +91,7 @@ consteval auto test_from_chars_impl() -> bool { const char str[] = "42"; auto val = VerifiedT{BasisT{0}}; - const auto r = boost::safe_numbers::from_chars(str, str + 2, val); + const auto r = boost::charconv::from_chars(str, str + 2, val); return r.ec == std::errc{} && val == VerifiedT{BasisT{42}}; } @@ -100,7 +100,7 @@ consteval auto test_from_chars_zero_impl() -> bool { const char str[] = "0"; auto val = VerifiedT{BasisT{1}}; - const auto r = boost::safe_numbers::from_chars(str, str + 1, val); + const auto r = boost::charconv::from_chars(str, str + 1, val); return r.ec == std::errc{} && val == VerifiedT{BasisT{0}}; } @@ -109,7 +109,7 @@ consteval auto test_from_chars_255_impl() -> bool { const char str[] = "255"; auto val = VerifiedT{BasisT{0}}; - const auto r = boost::safe_numbers::from_chars(str, str + 3, val); + const auto r = boost::charconv::from_chars(str, str + 3, val); return r.ec == std::errc{} && val == VerifiedT{BasisT{255}}; } @@ -118,7 +118,7 @@ consteval auto test_from_chars_hex_impl() -> bool { const char str[] = "ff"; auto val = VerifiedT{BasisT{0}}; - const auto r = boost::safe_numbers::from_chars(str, str + 2, val, 16); + const auto r = boost::charconv::from_chars(str, str + 2, val, 16); return r.ec == std::errc{} && val == VerifiedT{BasisT{255}}; } From 32dc7704886302da2e8da911ef6ed006f60e7c11 Mon Sep 17 00:00:00 2001 From: Matt Borland Date: Wed, 18 Feb 2026 10:26:48 -0500 Subject: [PATCH 3/5] Fix namespaces in docs --- doc/modules/ROOT/pages/charconv.adoc | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/doc/modules/ROOT/pages/charconv.adoc b/doc/modules/ROOT/pages/charconv.adoc index 187faff..50ca1b1 100644 --- a/doc/modules/ROOT/pages/charconv.adoc +++ b/doc/modules/ROOT/pages/charconv.adoc @@ -29,21 +29,21 @@ This will disable auto-linking for Boost.Charconv. ---- #include -namespace boost::safe_numbers { +namespace boost::charconv { // Convert safe integer to character string -template +template constexpr auto to_chars(char* first, char* last, T value, int base = 10) -> charconv::to_chars_result; // Convert character string to safe integer -template +template constexpr auto from_chars(const char* first, const char* last, T& value, int base = 10) -> charconv::from_chars_result; -} // namespace boost::safe_numbers +} // namespace boost::charconv ---- == to_chars_result @@ -102,7 +102,7 @@ struct from_chars_result [source,c++] ---- -template +template constexpr auto to_chars(char* first, char* last, T value, int base = 10) -> charconv::to_chars_result; @@ -132,7 +132,7 @@ Returns `boost::charconv::to_chars_result` with: [source,c++] ---- -template +template constexpr auto from_chars(const char* first, const char* last, T& value, int base = 10) -> charconv::from_chars_result; @@ -168,14 +168,14 @@ The two overloads are distinguished via a `requires` clause: [source,c++] ---- // Runtime overload (non-verified types) -template - requires (!detail::is_verified_type_v) +template + requires (!safe_numbers::detail::is_verified_type_v) constexpr auto from_chars(const char* first, const char* last, T& value, int base = 10) -> charconv::from_chars_result; // Compile-time overload (verified types only) -template - requires detail::is_verified_type_v +template + requires safe_numbers::detail::is_verified_type_v consteval auto from_chars(const char* first, const char* last, T& value, int base = 10) -> charconv::from_chars_result; ---- From 43ca7e438e06943cb8dbf1b1e5f8858a6da82875 Mon Sep 17 00:00:00 2001 From: Matt Borland Date: Wed, 18 Feb 2026 10:29:46 -0500 Subject: [PATCH 4/5] Add namespaces to api reference --- doc/modules/ROOT/nav.adoc | 1 + doc/modules/ROOT/pages/api_reference.adoc | 10 ++++++++++ 2 files changed, 11 insertions(+) diff --git a/doc/modules/ROOT/nav.adoc b/doc/modules/ROOT/nav.adoc index f8ca9a4..31e0962 100644 --- a/doc/modules/ROOT/nav.adoc +++ b/doc/modules/ROOT/nav.adoc @@ -20,6 +20,7 @@ ** xref:examples.adoc#examples_verified_compile_fail[Verified Types: Compile-Time Overflow] * xref:pretty_printers.adoc[] * xref:api_reference.adoc[] +** xref:api_reference.adoc#api_namespaces[Namespaces] ** xref:api_reference.adoc#api_types[Types] ** xref:api_reference.adoc#api_functions[Functions] ** xref:api_reference.adoc#api_headers[Headers] diff --git a/doc/modules/ROOT/pages/api_reference.adoc b/doc/modules/ROOT/pages/api_reference.adoc index d5ac80c..8d5a0e0 100644 --- a/doc/modules/ROOT/pages/api_reference.adoc +++ b/doc/modules/ROOT/pages/api_reference.adoc @@ -8,6 +8,16 @@ https://www.boost.org/LICENSE_1_0.txt = API Reference :idprefix: api_ref_ +[#api_namespaces] +== Namespaces + +[cols="1,2", options="header"] +|=== +| Name | Description +| `boost::charconv` | `to_chars` and `from_chars` overloads +| `boost::safe_numbers` | All other parts of the library +|=== + [#api_types] == Types From 7631d3467a9601885908b43816dc45e91037e441 Mon Sep 17 00:00:00 2001 From: Matt Borland Date: Wed, 18 Feb 2026 10:31:33 -0500 Subject: [PATCH 5/5] Update additional namespace --- examples/verified_runtime_usage.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/examples/verified_runtime_usage.cpp b/examples/verified_runtime_usage.cpp index d3b7262..6fdc47c 100644 --- a/examples/verified_runtime_usage.cpp +++ b/examples/verified_runtime_usage.cpp @@ -51,14 +51,14 @@ int main() // Writing to a character buffer works at runtime since it only // reads the value through the constexpr conversion operator char buffer[32]; - auto result = to_chars(buffer, buffer + sizeof(buffer), val); + auto result = boost::charconv::to_chars(buffer, buffer + sizeof(buffer), val); if (result) { *result.ptr = '\0'; std::cout << "to_chars (base 10): " << buffer << '\n'; } - result = to_chars(buffer, buffer + sizeof(buffer), val, 16); + result = boost::charconv::to_chars(buffer, buffer + sizeof(buffer), val, 16); if (result) { *result.ptr = '\0';