forked from boostorg/static_string
Fix to_static_string for mingw
This commit is contained in:
@ -21,8 +21,6 @@
|
|||||||
#include <iosfwd>
|
#include <iosfwd>
|
||||||
#include <type_traits>
|
#include <type_traits>
|
||||||
|
|
||||||
#include <iostream>
|
|
||||||
|
|
||||||
namespace boost {
|
namespace boost {
|
||||||
namespace static_string {
|
namespace static_string {
|
||||||
|
|
||||||
@ -519,8 +517,15 @@ to_static_wstring_float_impl(double value) noexcept
|
|||||||
// extra one needed for null terminator
|
// extra one needed for null terminator
|
||||||
wchar_t buffer[N + 1];
|
wchar_t buffer[N + 1];
|
||||||
// swprintf returns a negative number if it can't
|
// swprintf returns a negative number if it can't
|
||||||
// fit all the characters in the buffer
|
// fit all the characters in the buffer.
|
||||||
if (std::swprintf(buffer, N + 1, L"%f", value) < 0)
|
// 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 int num_written =
|
||||||
|
std::swprintf(buffer, N + 1, L"%f", value);
|
||||||
|
if (num_written < 0 || num_written > N)
|
||||||
{
|
{
|
||||||
// the + 4 is for the decimal, 'e',
|
// the + 4 is for the decimal, 'e',
|
||||||
// its sign, and the sign of the integral portion
|
// its sign, and the sign of the integral portion
|
||||||
@ -542,24 +547,25 @@ to_static_wstring_float_impl(long double value) noexcept
|
|||||||
{
|
{
|
||||||
// extra one needed for null terminator
|
// extra one needed for null terminator
|
||||||
wchar_t buffer[N + 1];
|
wchar_t buffer[N + 1];
|
||||||
std::cout << "buffer size: " << (N + 1) << '\n';
|
|
||||||
// swprintf returns a negative number if it can't
|
// swprintf returns a negative number if it can't
|
||||||
// fit all the characters in the buffer
|
// fit all the characters in the buffer.
|
||||||
std::cout << "trying swprintf\n";
|
// mingw has a non-standard swprintf, so
|
||||||
const int res = std::swprintf(buffer, N + 1, L"%Lf", value);
|
// this just covers all the bases. short
|
||||||
std::cout << "swprintf res: " << res << '\n';
|
// circuit evaluation will ensure that the
|
||||||
if (res < 0)
|
// second operand is not evaluated on conforming
|
||||||
|
// implementations.
|
||||||
|
const int num_written =
|
||||||
|
std::swprintf(buffer, N + 1, L"%Lf", value);
|
||||||
|
if (num_written < 0 || num_written > N)
|
||||||
{
|
{
|
||||||
std::cout << "swprintf < 0\n";
|
|
||||||
// the + 4 is for the decimal, 'e',
|
// the + 4 is for the decimal, 'e',
|
||||||
// its sign, and the sign of the integral portion
|
// its sign, and the sign of the integral portion
|
||||||
const int reserved_count =
|
const int reserved_count =
|
||||||
(std::max)(std::size_t(2), count_digits(
|
(std::max)(std::size_t(2), count_digits(
|
||||||
std::numeric_limits<long double>::max_exponent10)) + 4;
|
std::numeric_limits<long double>::max_exponent10)) + 4;
|
||||||
const int precision = N > reserved_count ? N - reserved_count : 0;
|
const int precision = N > reserved_count ? N - reserved_count : 0;
|
||||||
std::cout << "pre: " << precision << '\n';
|
|
||||||
// switch to scientific notation
|
// switch to scientific notation
|
||||||
std::cout << "sci: " << std::swprintf(buffer, N + 1, L"%.*Le", precision, value) << '\n';
|
std::swprintf(buffer, N + 1, L"%.*Le", precision, value);
|
||||||
}
|
}
|
||||||
// this will not throw
|
// this will not throw
|
||||||
return static_wstring<N>(buffer);
|
return static_wstring<N>(buffer);
|
||||||
|
Reference in New Issue
Block a user