1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95
|
// SPDX-FileCopyrightText: Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen
// SPDX-License-Identifier: BSD-3-Clause
#include "vtkNumberToString.h"
// clang-format off
#include "vtk_doubleconversion.h"
#include VTK_DOUBLECONVERSION_HEADER(double-conversion.h)
// clang-format on
#include <array>
#include <sstream>
VTK_ABI_NAMESPACE_BEGIN
namespace
{
template <typename TagT>
inline ostream& ToString(ostream& stream, const TagT& tag)
{
vtkNumberToString converter;
stream << converter.Convert(tag.Value);
return stream;
}
}
//------------------------------------------------------------------------------
ostream& operator<<(ostream& stream, const vtkNumberToString::TagDouble& tag)
{
return ToString(stream, tag);
}
//------------------------------------------------------------------------------
ostream& operator<<(ostream& stream, const vtkNumberToString::TagFloat& tag)
{
return ToString(stream, tag);
}
//------------------------------------------------------------------------------
void vtkNumberToString::SetLowExponent(int lowExponent)
{
this->LowExponent = lowExponent;
}
//------------------------------------------------------------------------------
int vtkNumberToString::GetLowExponent()
{
return this->LowExponent;
}
//------------------------------------------------------------------------------
void vtkNumberToString::SetHighExponent(int highExponent)
{
this->HighExponent = highExponent;
}
//------------------------------------------------------------------------------
int vtkNumberToString::GetHighExponent()
{
return this->HighExponent;
}
//------------------------------------------------------------------------------
std::string vtkNumberToString::Convert(double val)
{
// Copied from double-conversion::EcmaScriptConverter
// the last two arguments of the constructor have no effect with ToShortest
constexpr int flags = double_conversion::DoubleToStringConverter::UNIQUE_ZERO |
double_conversion::DoubleToStringConverter::EMIT_POSITIVE_EXPONENT_SIGN;
double_conversion::DoubleToStringConverter converter(
flags, "Infinity", "NaN", 'e', this->LowExponent, this->HighExponent + 1, 6, 0);
std::array<char, 256> buf;
double_conversion::StringBuilder builder(buf.data(), static_cast<int>(buf.size()));
builder.Reset();
converter.ToShortest(val, &builder);
return builder.Finalize();
}
std::string vtkNumberToString::Convert(float val)
{
// Copied from double-conversion::EcmaScriptConverter
// the last two arguments of the constructor have no effect with ToShortest
constexpr int flags = double_conversion::DoubleToStringConverter::UNIQUE_ZERO |
double_conversion::DoubleToStringConverter::EMIT_POSITIVE_EXPONENT_SIGN;
double_conversion::DoubleToStringConverter converter(
flags, "Infinity", "NaN", 'e', this->LowExponent, this->HighExponent + 1, 6, 0);
std::array<char, 256> buf;
double_conversion::StringBuilder builder(buf.data(), static_cast<int>(buf.size()));
builder.Reset();
converter.ToShortestSingle(val, &builder);
return builder.Finalize();
}
VTK_ABI_NAMESPACE_END
|