28#include <TGUI/Config.hpp>
45 template <
typename CharT>
46 void encodeCharUtf8(
char32_t input, std::basic_string<CharT>& outStrUtf8)
50 outStrUtf8.push_back(
static_cast<CharT
>(input));
55 if ((input > 0x0010FFFF) || ((input >= 0xD800) && (input <= 0xDBFF)))
59 std::size_t bytestoWrite;
60 std::uint8_t firstByteMask;
66 else if (input < 0x10000)
78 std::array<CharT, 4> bytes;
79 if (bytestoWrite == 4) { bytes[3] =
static_cast<CharT
>((input | 0x80) & 0xBF); input >>= 6; }
80 if (bytestoWrite >= 3) { bytes[2] =
static_cast<CharT
>((input | 0x80) & 0xBF); input >>= 6; }
81 bytes[1] =
static_cast<CharT
>((input | 0x80) & 0xBF); input >>= 6;
82 bytes[0] =
static_cast<CharT
>(input | firstByteMask);
85 outStrUtf8.append(bytes.begin(), bytes.begin() +
static_cast<std::ptrdiff_t
>(bytestoWrite));
95 template <
typename CharIt>
96 CharIt decodeCharUtf8(CharIt inputCharIt, CharIt inputEndIt, std::u32string& outStrUtf32)
98 if (
static_cast<std::uint8_t
>(*inputCharIt) < 128)
100 outStrUtf32.push_back(
static_cast<char32_t>(
static_cast<std::uint8_t
>(*inputCharIt)));
101 return ++inputCharIt;
105 static const std::uint32_t offsetsMap[6] = { 0x00000000, 0x00003080, 0x000E2080, 0x03C82080, 0xFA082080, 0x82082080 };
106 static const std::uint8_t trailingMap[128] =
108 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
109 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
110 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
111 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5
115 const std::uint8_t trailingBytes = trailingMap[
static_cast<std::uint8_t
>(*inputCharIt) - 128];
116 const std::uint32_t offset = offsetsMap[trailingBytes];
117 const auto remainingBytes = std::distance(inputCharIt, inputEndIt) - 1;
118 if (remainingBytes >=
static_cast<decltype(remainingBytes)
>(trailingBytes))
120 char32_t outputChar = 0;
121 for (std::uint8_t i = 0; i < trailingBytes; ++i)
123 outputChar +=
static_cast<char32_t>(
static_cast<std::uint8_t
>(*inputCharIt++));
127 outputChar +=
static_cast<char32_t>(
static_cast<std::uint8_t
>(*inputCharIt++));
128 outputChar -= offset;
129 outStrUtf32.push_back(outputChar);
132 inputCharIt = inputEndIt;
137#if defined(__cpp_lib_char8_t) && (__cpp_lib_char8_t >= 201811L)
143 TGUI_NODISCARD
inline std::u8string convertUtf32toUtf8(
const std::u32string& strUtf32)
145 std::u8string outStrUtf8;
146 outStrUtf8.reserve(strUtf32.length() + 1);
147 for (
const char32_t& codepoint : strUtf32)
148 encodeCharUtf8(codepoint, outStrUtf8);
160 template <
typename CharIt>
161 TGUI_NODISCARD std::u32string convertUtf8toUtf32(CharIt inputBegin, CharIt inputEnd)
163 std::u32string outStrUtf32;
164 outStrUtf32.reserve(
static_cast<std::size_t
>((inputEnd - inputBegin) + 1));
166 auto it = inputBegin;
167 while (it < inputEnd)
168 it = decodeCharUtf8(it, inputEnd, outStrUtf32);
179 template <
typename U16CharIt>
180 TGUI_NODISCARD std::u32string convertUtf16toUtf32(U16CharIt inputBegin, U16CharIt inputEnd)
182 std::u32string outStrUtf32;
183 outStrUtf32.reserve(
static_cast<std::size_t
>((inputEnd - inputBegin) + 1));
185 auto it = inputBegin;
186 while (it < inputEnd)
188 const char16_t first = *it++;
191 if ((first < 0xD800) || (first > 0xDBFF))
193 outStrUtf32.push_back(
static_cast<char32_t>(first));
201 const char16_t second = *it++;
202 if ((second >= 0xDC00) && (second <= 0xDFFF))
203 outStrUtf32.push_back(((
static_cast<char32_t>(first) - 0xD800) << 10) + (
static_cast<char32_t>(second) - 0xDC00) + 0x0010000);
214 template <
typename WCharIt>
215 TGUI_NODISCARD std::u32string convertWidetoUtf32(WCharIt inputBegin, WCharIt inputEnd)
217 std::u32string outStrUtf32;
218 outStrUtf32.reserve(
static_cast<std::size_t
>((inputEnd - inputBegin) + 1));
221 for (
auto it = inputBegin; it != inputEnd; ++it)
222 outStrUtf32.push_back(
static_cast<char32_t>(*it));
232 TGUI_NODISCARD
inline std::string convertUtf32toStdStringUtf8(
const std::u32string& strUtf32)
234 std::string outStrUtf8;
235 outStrUtf8.reserve(strUtf32.length() + 1);
236 for (
const char32_t codepoint : strUtf32)
237 encodeCharUtf8(codepoint, outStrUtf8);
247 TGUI_NODISCARD
inline std::wstring convertUtf32toWide(
const std::u32string& strUtf32)
250 outStr.reserve(strUtf32.length() + 1);
252 TGUI_IF_CONSTEXPR (
sizeof(
wchar_t) == 4)
255 for (
const char32_t codepoint : strUtf32)
256 outStr.push_back(
static_cast<wchar_t>(codepoint));
261 for (
const char32_t codepoint : strUtf32)
263 if ((codepoint < 0xD800) || ((codepoint > 0xDFFF) && (codepoint <= 0xFFFF)))
264 outStr.push_back(
static_cast<wchar_t>(codepoint));
276 TGUI_NODISCARD
inline std::u16string convertUtf32toUtf16(
const std::u32string& strUtf32)
278 std::u16string outStrUtf16;
279 outStrUtf16.reserve(strUtf32.length() + 1);
281 for (
const char32_t codepoint : strUtf32)
284 if (codepoint <= 0xFFFF)
286 if ((codepoint < 0xD800) || (codepoint > 0xDFFF))
287 outStrUtf16.push_back(
static_cast<char16_t>(codepoint));
291 else if (codepoint > 0x0010FFFF)
295 outStrUtf16.push_back(
static_cast<char16_t>(((codepoint - 0x0010000) >> 10) + 0xD800));
296 outStrUtf16.push_back(
static_cast<char16_t>(((codepoint - 0x0010000) & 0x3FFUL) + 0xDC00));
Namespace that contains all TGUI functions and classes.
Definition AbsoluteOrRelativeValue.hpp:36