Skip to content

Commit 270fccb

Browse files
committed
Add DoubleToStringConverter::ToShortestString overload set
Allowed users to write generic code more easily, in cases where the input value is either a double, or a single-precision float. Included a unit test, `TEST(DoubleToShortestString)`. Complementary to pull request #158 commit eee1a45 "Add `StringToDoubleConverter::StringTo<T>` member function templates"
1 parent af09fd6 commit 270fccb

File tree

2 files changed

+62
-0
lines changed

2 files changed

+62
-0
lines changed

double-conversion/double-to-string.h

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -221,6 +221,16 @@ class DoubleToStringConverter {
221221
return ToShortestIeeeNumber(value, result_builder, SHORTEST_SINGLE);
222222
}
223223

224+
// Same as ToShortest, but overloaded for single-precision floats.
225+
bool ToShortestString(double value, StringBuilder* result_builder) const {
226+
return ToShortestIeeeNumber(value, result_builder, SHORTEST);
227+
}
228+
229+
// Same as ToShortestSingle. Overload, to ease writing generic code that
230+
// supports both double and single-precision float input values.
231+
bool ToShortestString(float value, StringBuilder* result_builder) const {
232+
return ToShortestIeeeNumber(value, result_builder, SHORTEST_SINGLE);
233+
}
224234

225235
// Computes a decimal representation with a fixed number of digits after the
226236
// decimal point. The last emitted digit is rounded.

test/cctest/test-conversions.cc

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -437,6 +437,58 @@ TEST(DoubleToShortestSingle) {
437437
}
438438

439439

440+
TEST(DoubleToShortestString) {
441+
const DoubleToStringConverter& converter = DoubleToStringConverter::EcmaScriptConverter();
442+
const int kBufferSize = DoubleToStringConverter::kMaxCharsEcmaScriptShortest + 1;
443+
444+
// First check conversion from 0 and 1 for both ToShortestString overloads:
445+
for (int i = 0; i <= 1; ++i)
446+
{
447+
char buffer1[kBufferSize] = "";
448+
char buffer2[kBufferSize] = "";
449+
StringBuilder builder1(buffer1, kBufferSize);
450+
StringBuilder builder2(buffer2, kBufferSize);
451+
452+
CHECK(converter.ToShortestString(static_cast<double>(i), &builder1));
453+
CHECK(converter.ToShortestString(static_cast<float>(i), &builder2));
454+
455+
const char expected[2] = { static_cast<char>('0' + i), '\0' };
456+
CHECK_EQ(expected, builder1.Finalize());
457+
CHECK_EQ(expected, builder2.Finalize());
458+
}
459+
{
460+
// Check that ToShortestString behaves like ToShortest, for a double
461+
// input value. Use an input value that can be represented by a double,
462+
// but not by a single-precision float.
463+
const double value = 1e+100;
464+
465+
char buffer1[kBufferSize] = "";
466+
char buffer2[kBufferSize] = "";
467+
StringBuilder builder1(buffer1, kBufferSize);
468+
StringBuilder builder2(buffer2, kBufferSize);
469+
470+
CHECK_EQ(converter.ToShortest(value, &builder1),
471+
converter.ToShortestString(value, &builder2));
472+
CHECK_EQ(builder1.Finalize(), builder2.Finalize());
473+
}
474+
{
475+
// Check that ToShortestString behaves like ToShortestSingle, for a
476+
// single-precision float input value. Use an input value for which
477+
// ToShortestSingle yields a different string than ToShortest.
478+
const float value = 0.1f;
479+
480+
char buffer1[kBufferSize] = "";
481+
char buffer2[kBufferSize] = "";
482+
StringBuilder builder1(buffer1, kBufferSize);
483+
StringBuilder builder2(buffer2, kBufferSize);
484+
485+
CHECK_EQ(converter.ToShortestSingle(value, &builder1),
486+
converter.ToShortestString(value, &builder2));
487+
CHECK_EQ(builder1.Finalize(), builder2.Finalize());
488+
}
489+
}
490+
491+
440492
TEST(DoubleToFixed) {
441493
const int kBufferSize = 168;
442494
char buffer[kBufferSize];

0 commit comments

Comments
 (0)