summaryrefslogtreecommitdiffstats
path: root/3rdparty/bx/src/dtoa.cpp
diff options
context:
space:
mode:
Diffstat (limited to '3rdparty/bx/src/dtoa.cpp')
-rw-r--r--3rdparty/bx/src/dtoa.cpp82
1 files changed, 57 insertions, 25 deletions
diff --git a/3rdparty/bx/src/dtoa.cpp b/3rdparty/bx/src/dtoa.cpp
index 05ac387fec2..98640ede20b 100644
--- a/3rdparty/bx/src/dtoa.cpp
+++ b/3rdparty/bx/src/dtoa.cpp
@@ -8,6 +8,8 @@
#include <bx/string.h>
#include <bx/uint32_t.h>
+#include <type_traits>
+
namespace bx
{
// https://github.com/miloyip/dtoa-benchmark
@@ -384,7 +386,7 @@ namespace bx
if (0 < kk && kk <= 21)
{
// 1234e-2 -> 12.34
- memmove(&buffer[kk + 1], &buffer[kk], length - kk);
+ memMove(&buffer[kk + 1], &buffer[kk], length - kk);
buffer[kk] = '.';
buffer[length + 1] = '\0';
return length + 1;
@@ -394,7 +396,7 @@ namespace bx
{
// 1234e-6 -> 0.001234
const int32_t offset = 2 - kk;
- memmove(&buffer[offset], &buffer[0], length);
+ memMove(&buffer[offset], &buffer[0], length);
buffer[0] = '0';
buffer[1] = '.';
for (int32_t i = 2; i < offset; i++)
@@ -415,56 +417,57 @@ namespace bx
}
// 1234e30 -> 1.234e33
- memmove(&buffer[2], &buffer[1], length - 1);
+ memMove(&buffer[2], &buffer[1], length - 1);
buffer[1] = '.';
buffer[length + 1] = 'e';
int32_t exp = WriteExponent(kk - 1, &buffer[length + 2]);
return length + 2 + exp;
}
- int32_t toString(char* _dst, size_t _max, double value)
+ int32_t toString(char* _dst, int32_t _max, double _value)
{
- if (isNan(value) )
+ int32_t sign = 0 != (doubleToBits(_value) & (UINT64_C(1)<<63) ) ? 1 : 0;
+ if (1 == sign)
{
- return (int32_t)strlncpy(_dst, _max, "NaN");
+ *_dst++ = '-';
+ --_max;
+ _value = -_value;
}
- else if (isInfinite(value) )
+
+ if (isNan(_value) )
{
- return (int32_t)strlncpy(_dst, _max, "Inf");
+ return (int32_t)strlncpy(_dst, _max, "nan") + sign;
}
-
- int32_t sign = 0.0 > value ? 1 : 0;
- if (1 == sign)
+ else if (isInfinite(_value) )
{
- *_dst++ = '-';
- --_max;
- value = -value;
+ return (int32_t)strlncpy(_dst, _max, "inf") + sign;
}
int32_t len;
- if (0.0 == value)
+ if (0.0 == _value)
{
len = (int32_t)strlncpy(_dst, _max, "0.0");
}
else
{
int32_t kk;
- Grisu2(value, _dst, &len, &kk);
+ Grisu2(_value, _dst, &len, &kk);
len = Prettify(_dst, len, kk);
}
return len + sign;
}
- static void reverse(char* _dst, size_t _len)
+ static void reverse(char* _dst, int32_t _len)
{
- for (size_t ii = 0, jj = _len - 1; ii < jj; ++ii, --jj)
+ for (int32_t ii = 0, jj = _len - 1; ii < jj; ++ii, --jj)
{
xchg(_dst[ii], _dst[jj]);
}
}
- int32_t toString(char* _dst, size_t _max, int32_t _value, uint32_t _base)
+ template<typename Ty>
+ int32_t toStringSigned(char* _dst, int32_t _max, Ty _value, uint32_t _base)
{
if (_base == 10
&& _value < 0)
@@ -474,7 +477,11 @@ namespace bx
return 0;
}
- _max = toString(_dst + 1, _max - 1, uint32_t(-_value), _base);
+ _max = toString(_dst + 1
+ , _max - 1
+ , typename std::make_unsigned<Ty>::type(-_value)
+ , _base
+ );
if (_max == 0)
{
return 0;
@@ -484,13 +491,28 @@ namespace bx
return int32_t(_max + 1);
}
- return toString(_dst, _max, uint32_t(_value), _base);
+ return toString(_dst
+ , _max
+ , typename std::make_unsigned<Ty>::type(_value)
+ , _base
+ );
}
- int32_t toString(char* _dst, size_t _max, uint32_t _value, uint32_t _base)
+ int32_t toString(char* _dst, int32_t _max, int32_t _value, uint32_t _base)
+ {
+ return toStringSigned(_dst, _max, _value, _base);
+ }
+
+ int32_t toString(char* _dst, int32_t _max, int64_t _value, uint32_t _base)
+ {
+ return toStringSigned(_dst, _max, _value, _base);
+ }
+
+ template<typename Ty>
+ int32_t toStringUnsigned(char* _dst, int32_t _max, Ty _value, uint32_t _base)
{
char data[32];
- size_t len = 0;
+ int32_t len = 0;
if (_base > 16
|| _base < 2)
@@ -500,7 +522,7 @@ namespace bx
do
{
- const uint32_t rem = _value % _base;
+ const Ty rem = _value % _base;
_value /= _base;
if (rem < 10)
{
@@ -520,9 +542,19 @@ namespace bx
reverse(data, len);
- memcpy(_dst, data, len);
+ memCopy(_dst, data, len);
_dst[len] = '\0';
return int32_t(len);
}
+ int32_t toString(char* _dst, int32_t _max, uint32_t _value, uint32_t _base)
+ {
+ return toStringUnsigned(_dst, _max, _value, _base);
+ }
+
+ int32_t toString(char* _dst, int32_t _max, uint64_t _value, uint32_t _base)
+ {
+ return toStringUnsigned(_dst, _max, _value, _base);
+ }
+
} // namespace bx