Skip to content

Commit 0511600

Browse files
committed
Add from_chars string and string_view interfaces
1 parent 3878a48 commit 0511600

File tree

1 file changed

+83
-0
lines changed

1 file changed

+83
-0
lines changed

include/boost/decimal/charconv.hpp

Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,10 @@
2727

2828
#if !defined(BOOST_DECIMAL_DISABLE_CLIB)
2929

30+
#ifndef BOOST_DECIMAL_BUILD_MODULE
31+
#include <string>
32+
#endif
33+
3034
namespace boost {
3135
namespace decimal {
3236

@@ -94,31 +98,103 @@ BOOST_DECIMAL_EXPORT constexpr auto from_chars(const char* first, const char* la
9498
return detail::from_chars_general_impl(first, last, value, fmt);
9599
}
96100

101+
#ifndef BOOST_DECIMAL_HAS_STD_STRING_VIEW
102+
BOOST_DECIMAL_EXPORT constexpr auto from_chars(const std::string& str, decimal32& value, chars_format fmt = chars_format::general) noexcept
103+
{
104+
return detail::from_chars_general_impl(str.data(), str.data() + str.size(), value, fmt);
105+
}
106+
#else
107+
BOOST_DECIMAL_EXPORT constexpr auto from_chars(std::string_view str, decimal32& value, chars_format fmt = chars_format::general) noexcept
108+
{
109+
return detail::from_chars_general_impl(str.data(), str.data() + str.size(), value, fmt);
110+
}
111+
#endif
112+
97113
BOOST_DECIMAL_EXPORT constexpr auto from_chars(const char* first, const char* last, decimal32_fast& value, chars_format fmt = chars_format::general) noexcept
98114
{
99115
return detail::from_chars_general_impl(first, last, value, fmt);
100116
}
101117

118+
#ifndef BOOST_DECIMAL_HAS_STD_STRING_VIEW
119+
BOOST_DECIMAL_EXPORT constexpr auto from_chars(const std::string& str, decimal32_fast& value, chars_format fmt = chars_format::general) noexcept
120+
{
121+
return detail::from_chars_general_impl(str.data(), str.data() + str.size(), value, fmt);
122+
}
123+
#else
124+
BOOST_DECIMAL_EXPORT constexpr auto from_chars(std::string_view str, decimal32_fast& value, chars_format fmt = chars_format::general) noexcept
125+
{
126+
return detail::from_chars_general_impl(str.data(), str.data() + str.size(), value, fmt);
127+
}
128+
#endif
129+
102130
BOOST_DECIMAL_EXPORT constexpr auto from_chars(const char* first, const char* last, decimal64& value, chars_format fmt = chars_format::general) noexcept
103131
{
104132
return detail::from_chars_general_impl(first, last, value, fmt);
105133
}
106134

135+
#ifndef BOOST_DECIMAL_HAS_STD_STRING_VIEW
136+
BOOST_DECIMAL_EXPORT constexpr auto from_chars(const std::string& str, decimal64& value, chars_format fmt = chars_format::general) noexcept
137+
{
138+
return detail::from_chars_general_impl(str.data(), str.data() + str.size(), value, fmt);
139+
}
140+
#else
141+
BOOST_DECIMAL_EXPORT constexpr auto from_chars(std::string_view str, decimal64& value, chars_format fmt = chars_format::general) noexcept
142+
{
143+
return detail::from_chars_general_impl(str.data(), str.data() + str.size(), value, fmt);
144+
}
145+
#endif
146+
107147
BOOST_DECIMAL_EXPORT constexpr auto from_chars(const char* first, const char* last, decimal64_fast& value, chars_format fmt = chars_format::general) noexcept
108148
{
109149
return detail::from_chars_general_impl(first, last, value, fmt);
110150
}
111151

152+
#ifndef BOOST_DECIMAL_HAS_STD_STRING_VIEW
153+
BOOST_DECIMAL_EXPORT constexpr auto from_chars(const std::string& str, decimal64_fast& value, chars_format fmt = chars_format::general) noexcept
154+
{
155+
return detail::from_chars_general_impl(str.data(), str.data() + str.size(), value, fmt);
156+
}
157+
#else
158+
BOOST_DECIMAL_EXPORT constexpr auto from_chars(std::string_view str, decimal64_fast& value, chars_format fmt = chars_format::general) noexcept
159+
{
160+
return detail::from_chars_general_impl(str.data(), str.data() + str.size(), value, fmt);
161+
}
162+
#endif
163+
112164
BOOST_DECIMAL_EXPORT constexpr auto from_chars(const char* first, const char* last, decimal128& value, chars_format fmt = chars_format::general) noexcept
113165
{
114166
return detail::from_chars_general_impl(first, last, value, fmt);
115167
}
116168

169+
#ifndef BOOST_DECIMAL_HAS_STD_STRING_VIEW
170+
BOOST_DECIMAL_EXPORT constexpr auto from_chars(const std::string& str, decimal128& value, chars_format fmt = chars_format::general) noexcept
171+
{
172+
return detail::from_chars_general_impl(str.data(), str.data() + str.size(), value, fmt);
173+
}
174+
#else
175+
BOOST_DECIMAL_EXPORT constexpr auto from_chars(std::string_view str, decimal128& value, chars_format fmt = chars_format::general) noexcept
176+
{
177+
return detail::from_chars_general_impl(str.data(), str.data() + str.size(), value, fmt);
178+
}
179+
#endif
180+
117181
BOOST_DECIMAL_EXPORT constexpr auto from_chars(const char* first, const char* last, decimal128_fast& value, chars_format fmt = chars_format::general) noexcept
118182
{
119183
return detail::from_chars_general_impl(first, last, value, fmt);
120184
}
121185

186+
#ifndef BOOST_DECIMAL_HAS_STD_STRING_VIEW
187+
BOOST_DECIMAL_EXPORT constexpr auto from_chars(const std::string& str, decimal128_fast& value, chars_format fmt = chars_format::general) noexcept
188+
{
189+
return detail::from_chars_general_impl(str.data(), str.data() + str.size(), value, fmt);
190+
}
191+
#else
192+
BOOST_DECIMAL_EXPORT constexpr auto from_chars(std::string_view str, decimal128_fast& value, chars_format fmt = chars_format::general) noexcept
193+
{
194+
return detail::from_chars_general_impl(str.data(), str.data() + str.size(), value, fmt);
195+
}
196+
#endif
197+
122198
#ifdef BOOST_DECIMAL_HAS_STD_CHARCONV
123199
BOOST_DECIMAL_EXPORT template <typename DecimalType>
124200
constexpr auto from_chars(const char* first, const char* last, DecimalType& value, std::chars_format fmt) noexcept
@@ -147,6 +223,13 @@ constexpr auto from_chars(const char* first, const char* last, DecimalType& valu
147223

148224
return std::from_chars_result {boost_r.ptr, boost_r.ec};
149225
}
226+
227+
BOOST_DECIMAL_EXPORT template <typename DecimalType>
228+
constexpr auto from_chars(std::string_view str, DecimalType& value, std::chars_format fmt) noexcept
229+
BOOST_DECIMAL_REQUIRES_RETURN(detail::is_decimal_floating_point_v, DecimalType, std::from_chars_result)
230+
{
231+
return from_chars(str.data(), str.data() + str.size(), value, fmt);
232+
}
150233
#endif
151234

152235
// ---------------------------------------------------------------------------------------------------------------------

0 commit comments

Comments
 (0)