1 #ifndef ZSERIO_STRING_CONVERT_UTIL_H_INC
2 #define ZSERIO_STRING_CONVERT_UTIL_H_INC
25 template <
typename T, std::enable_if_t<std::is_
unsigned_v<T> && !std::is_same_v<T,
bool>,
int> = 0>
28 static const std::array<char, 201> DIGITS_100_10 = {
29 "0001020304050607080910111213141516171819"
30 "2021222324252627282930313233343536373839"
31 "4041424344454647484950515253545556575859"
32 "6061626364656667686970717273747576777879"
33 "8081828384858687888990919293949596979899"};
34 static const std::array<char, 11> DIGITS_1 = {
"0123456789"};
36 auto bufferEnd = buffer.end();
37 *(--bufferEnd) =
'\0';
41 const unsigned int index =
static_cast<unsigned int>((value % 100) * 2);
43 *(--bufferEnd) = DIGITS_100_10[index + 1];
44 *(--bufferEnd) = DIGITS_100_10[index];
49 *(--bufferEnd) = DIGITS_1[
static_cast<unsigned int>(value)];
53 const unsigned int index =
static_cast<unsigned int>(value * 2);
54 *(--bufferEnd) = DIGITS_100_10[index + 1];
55 *(--bufferEnd) = DIGITS_100_10[index];
78 template <
typename T, std::enable_if_t<std::is_
unsigned_v<T>,
int> = 0>
94 template <
typename T, std::enable_if_t<std::is_
signed_v<T>,
int> = 0>
97 using UnsignedType =
typename std::make_unsigned_t<T>;
98 UnsignedType absValue =
static_cast<UnsignedType
>(value);
99 const bool isNegative = value < 0;
102 absValue =
static_cast<UnsignedType
>(0 - absValue);
120 std::array<char, 24>& floatingPartBuffer,
float value,
const char*& integerPartString,
121 const char*& floatingPartString)
123 if (value >=
static_cast<float>(std::numeric_limits<int64_t>::max()))
125 integerPartString =
"+Inf";
126 floatingPartString =
nullptr;
128 else if (value <=
static_cast<float>(std::numeric_limits<int64_t>::min()))
130 integerPartString =
"-Inf";
131 floatingPartString =
nullptr;
135 const int64_t integerPart =
static_cast<int64_t
>(value);
136 const int64_t floatingPart =
137 static_cast<int64_t
>((value -
static_cast<float>(integerPart)) * 1e3F);
138 const int64_t floatingPartAbs = (floatingPart < 0) ? 0 - floatingPart : floatingPart;
153 return value ?
"true" :
"false";
164 template <
typename ALLOC,
typename T, std::enable_if_t<std::is_
integral_v<T>,
int> = 0>
167 std::array<char, 24> buffer = {};
179 template <
typename ALLOC,
typename T, std::enable_if_t<std::is_
integral_v<
typename T::ValueType>,
int> = 0>
180 BasicString<RebindAlloc<ALLOC, char>>
toString(T value,
const ALLOC& allocator = ALLOC())
182 if constexpr (std::is_same_v<bool, typename T::ValueType>)
188 std::array<char, 24> buffer = {};
189 return BasicString<RebindAlloc<ALLOC, char>>(
203 template <
typename ALLOC>
215 template <
typename ALLOC>
228 template <
typename T>
231 return toString<std::allocator<char>>(value);
const char * convertIntToString(std::array< char, 24 > &buffer, T value)
std::basic_string< char, std::char_traits< char >, ALLOC > BasicString
BasicString< RebindAlloc< ALLOC, char > > toString(T value, const ALLOC &allocator=ALLOC())
const char * convertBoolToString(bool value)
void convertFloatToString(std::array< char, 24 > &integerPartBuffer, std::array< char, 24 > &floatingPartBuffer, float value, const char *&integerPartString, const char *&floatingPartString)