Skip to content

Commit c00531f

Browse files
N-Dekkerdzenanz
authored andcommitted
STYLE: Reduce buf size, remove builder.Reset() calls from NumberToString
Various style improvements of the implementation of the `NumberToString<TValue>` specializations for floating point numbers: - Did clean up the #include's. - Removed unnecessary builder.Reset() calls. (`StringBuilder::Reset()` only just sets the internal position to zero, but that is already taken care of by the constructor of `StringBuilder`.) - Added local helper function, `FloatingPointNumberToString(val)`, sharing code between `float` and `double` specialization. - Reduced size of local buffer (`buf`) from 256 to 32 chars.
1 parent f3b3f69 commit c00531f

File tree

1 file changed

+42
-21
lines changed

1 file changed

+42
-21
lines changed

Modules/Core/Common/src/itkNumberToString.cxx

Lines changed: 42 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -16,45 +16,66 @@
1616
*
1717
*=========================================================================*/
1818
#include "itkNumberToString.h"
19-
#include "itkNumericTraits.h"
20-
#include "double-conversion/double-conversion.h"
19+
#include "double-conversion/double-to-string.h"
2120

2221
#include <sstream>
2322

24-
namespace itk
23+
namespace
2524
{
2625

27-
template <>
26+
bool
27+
ConvertToShortest(const double_conversion::DoubleToStringConverter & converter,
28+
const double val,
29+
double_conversion::StringBuilder & builder)
30+
{
31+
return converter.ToShortest(val, &builder);
32+
}
33+
34+
bool
35+
ConvertToShortest(const double_conversion::DoubleToStringConverter & converter,
36+
const float val,
37+
double_conversion::StringBuilder & builder)
38+
{
39+
// Call the converter member function that is specific for single-precision `float`.
40+
return converter.ToShortestSingle(val, &builder);
41+
}
42+
43+
template <typename TValue>
2844
std::string
29-
NumberToString<double>::operator()(double val) const
45+
FloatingPointNumberToString(const TValue val)
3046
{
31-
char buf[256];
32-
const double_conversion::DoubleToStringConverter & converter =
33-
double_conversion::DoubleToStringConverter::EcmaScriptConverter();
47+
// Declare a buffer, large enough for strings like:
48+
// "-100000000000000000000" (-1e20, either float or double, 23 chars)
49+
// "-1.7976931348623157e+308" (-DBL_MAX, 25 chars)
50+
// "-0.0000033333333333333333" (-3e-005/9.0, 26 chars)
51+
char buf[32];
52+
3453
double_conversion::StringBuilder builder(buf, sizeof(buf));
35-
builder.Reset();
36-
if (!converter.ToShortest(val, &builder))
54+
55+
if (!ConvertToShortest(double_conversion::DoubleToStringConverter::EcmaScriptConverter(), val, builder))
3756
{
3857
itkGenericExceptionMacro(<< "Conversion failed for " << val);
3958
}
4059
return std::string(builder.Finalize());
4160
}
4261

62+
} // namespace
63+
64+
namespace itk
65+
{
66+
4367
template <>
4468
std::string
45-
NumberToString<float>::operator()(float val) const
69+
NumberToString<double>::operator()(double val) const
4670
{
47-
char buf[256];
48-
const double_conversion::DoubleToStringConverter & converter =
49-
double_conversion::DoubleToStringConverter::EcmaScriptConverter();
71+
return FloatingPointNumberToString(val);
72+
}
5073

51-
double_conversion::StringBuilder builder(buf, sizeof(buf));
52-
builder.Reset();
53-
if (!converter.ToShortestSingle(val, &builder))
54-
{
55-
itkGenericExceptionMacro(<< "Conversion failed for " << val);
56-
}
57-
return std::string(builder.Finalize());
74+
template <>
75+
std::string
76+
NumberToString<float>::operator()(float val) const
77+
{
78+
return FloatingPointNumberToString(val);
5879
}
5980

6081
} // namespace itk

0 commit comments

Comments
 (0)