262 static_assert(
sizeof(MU8T) == 1,
"MU8T size must be at 1 byte");
263 static_assert(
sizeof(U16T) == 2,
"U16T size must be at 2 bytes");
264 static_assert(
sizeof(U8T) == 1,
"U8T size must be at 1 bytes");
266 MUTF8_Tool(
void) =
delete;
267 ~MUTF8_Tool(
void) =
delete;
270 static inline constexpr MU8T mu8FailChar[3]{ (MU8T)0xEF, (MU8T)0xBF, (MU8T)0xBD };
271 static inline constexpr U16T u16FailChar = (U16T)0xFFFD;
272 static inline constexpr U8T u8FailChar[3]{ (U8T)0xEF, (U8T)0xBF, (U8T)0xBD };
291 class FakeStringCounter
294 size_t szCounter = 0;
296 constexpr FakeStringCounter(
void) =
default;
297 constexpr ~FakeStringCounter(
void) =
default;
299 constexpr void clear(
void)
noexcept
304 constexpr FakeStringCounter &append(
const T *
const,
size_t szSize)
noexcept
311 constexpr FakeStringCounter &append_cvt(
const U *
const,
size_t szSize)
noexcept
317 constexpr void push_back(
const T &)
noexcept
322 constexpr const size_t &GetData(
void)
const noexcept
329 template<
typename T,
size_t N>
333 using ARRAY_TYPE = std::array<T, N>;
335 ARRAY_TYPE arrData{};
338 constexpr StaticString(
void) =
default;
339 constexpr ~StaticString(
void) =
default;
341 constexpr void clear(
void)
noexcept
346 constexpr StaticString &append(
const T *
const pData,
size_t szLength)
noexcept
348 if (szLength == 0 || szLength > arrData.size() - szIndex)
354 std::ranges::copy(&pData[0], &pData[szLength], &arrData[szIndex]);
361 constexpr StaticString &append_cvt(
const U *
const pData,
size_t szLength)
noexcept
363 if (std::is_constant_evaluated())
365 if (szLength == 0 || szLength > arrData.size() - szIndex)
371 std::ranges::transform(&pData[0], &pData[szLength], &arrData[szIndex],
382 return append((
const T *
const)pData, szLength);
386 constexpr void push_back(
const T &tData)
noexcept
388 if (1 > arrData.size() - szIndex)
393 arrData[szIndex] = tData;
397 constexpr const ARRAY_TYPE &GetData(
void)
const noexcept
404 template<
typename String>
405 class DynamicString :
public String
408 DynamicString(
size_t szReserve = 0) :
String({})
410 String::reserve(szReserve);
412 ~DynamicString(
void) =
default;
415 DynamicString &append_cvt(
const U *
const pData,
size_t szLength)
417 String::append((
const typename String::value_type *
const)pData, szLength);
421 constexpr const String &GetData(
void)
const noexcept
428 template<
size_t szBytes>
429 static constexpr void EncodeMUTF8Bmp(
const U16T u16Char, MU8T(&mu8CharArr)[szBytes])
431 if constexpr (szBytes == 1)
433 mu8CharArr[0] = (uint8_t)((((uint16_t)u16Char & (uint16_t)0b0000'0000'0111'1111) >> 0) | (uint16_t)0b0000'0000);
435 else if constexpr (szBytes == 2)
437 mu8CharArr[0] = (uint8_t)((((uint16_t)u16Char & (uint16_t)0b0000'0111'1100'0000) >> 6) | (uint16_t)0b1100'0000);
438 mu8CharArr[1] = (uint8_t)((((uint16_t)u16Char & (uint16_t)0b0000'0000'0011'1111) >> 0) | (uint16_t)0b1000'0000);
440 else if constexpr (szBytes == 3)
442 mu8CharArr[0] = (uint8_t)((((uint16_t)u16Char & (uint16_t)0b1111'0000'0000'0000) >> 12) | (uint16_t)0b1110'0000);
443 mu8CharArr[1] = (uint8_t)((((uint16_t)u16Char & (uint16_t)0b0000'1111'1100'0000) >> 6) | (uint16_t)0b1000'0000);
444 mu8CharArr[2] = (uint8_t)((((uint16_t)u16Char & (uint16_t)0b0000'0000'0011'1111) >> 0) | (uint16_t)0b1000'0000);
448 static_assert(
false,
"Error szBytes Size");
452 static constexpr void EncodeMUTF8Supplementary(
const U16T u16HighSurrogate,
const U16T u16LowSurrogate, MU8T(&mu8CharArr)[6])
456 uint32_t u32RawChar = ((uint32_t)((uint16_t)u16HighSurrogate & (uint16_t)0b0000'0011'1111'1111)) << 10 |
457 ((uint32_t)((uint16_t)u16LowSurrogate & (uint16_t)0b0000'0011'1111'1111)) << 0;
463 mu8CharArr[0] = (uint8_t)0b1110'1101;
464 mu8CharArr[1] = (uint8_t)(((u32RawChar & (uint32_t)0b0000'0000'0000'1111'0000'0000'0000'0000) >> 16) | (uint32_t)0b1010'0000);
465 mu8CharArr[2] = (uint8_t)(((u32RawChar & (uint32_t)0b0000'0000'0000'0000'1111'1100'0000'0000) >> 10) | (uint32_t)0b1000'0000);
467 mu8CharArr[3] = (uint8_t)0b1110'1101;
468 mu8CharArr[4] = (uint8_t)(((u32RawChar & (uint32_t)0b0000'0000'0000'0000'0000'0011'1100'0000) >> 6) | (uint32_t)0b1011'0000);
469 mu8CharArr[5] = (uint8_t)(((u32RawChar & (uint32_t)0b0000'0000'0000'0000'0000'0000'0011'1111) >> 0) | (uint32_t)0b1000'0000);
472 template<
size_t szBytes>
473 static constexpr void DecodeMUTF8Bmp(
const MU8T(&mu8CharArr)[szBytes], U16T &u16Char)
475 if constexpr (szBytes == 1)
477 u16Char = ((uint16_t)((uint8_t)mu8CharArr[0] & (uint8_t)0b0111'1111)) << 0;
479 else if constexpr (szBytes == 2)
481 u16Char = ((uint16_t)((uint8_t)mu8CharArr[0] & (uint8_t)0b0001'1111)) << 6 |
482 ((uint16_t)((uint8_t)mu8CharArr[1] & (uint8_t)0b0011'1111)) << 0;
484 else if constexpr (szBytes == 3)
486 u16Char = ((uint16_t)((uint8_t)mu8CharArr[0] & (uint8_t)0b0000'1111)) << 12 |
487 ((uint16_t)((uint8_t)mu8CharArr[1] & (uint8_t)0b0011'1111)) << 6 |
488 ((uint16_t)((uint8_t)mu8CharArr[2] & (uint8_t)0b0011'1111)) << 0;
492 static_assert(
false,
"Error szBytes Size");
496 static constexpr void DecodeMUTF8Supplementary(
const MU8T(&mu8CharArr)[6], U16T &u16HighSurrogate, U16T &u16LowSurrogate)
498 uint32_t u32RawChar =
499 ((uint32_t)((uint8_t)mu8CharArr[1] & (uint8_t)0b0000'1111)) << 16 |
500 ((uint32_t)((uint8_t)mu8CharArr[2] & (uint8_t)0b0011'1111)) << 10 |
502 ((uint32_t)((uint8_t)mu8CharArr[4] & (uint8_t)0b0000'1111)) << 6 |
503 ((uint32_t)((uint8_t)mu8CharArr[5] & (uint8_t)0b0011'1111)) << 0 ;
510 u16HighSurrogate = (uint32_t)((u32RawChar & (uint32_t)0b0000'0000'0000'1111'1111'1100'0000'0000) >> 10 | (uint32_t)0b1101'1000'0000'0000);
511 u16LowSurrogate = (uint32_t)((u32RawChar & (uint32_t)0b0000'0000'0000'0000'0000'0011'1111'1111) >> 0 | (uint32_t)0b1101'1100'0000'0000);
522 static constexpr void UTF8SupplementaryToMUTF8(
const U8T(&u8CharArr)[4], MU8T(&mu8CharArr)[6])
525 uint32_t u32RawChar = ((uint32_t)((uint8_t)u8CharArr[0] & (uint8_t)0b0000'0111)) << 18 |
526 ((uint32_t)((uint8_t)u8CharArr[1] & (uint8_t)0b0011'1111)) << 12 |
527 ((uint32_t)((uint8_t)u8CharArr[2] & (uint8_t)0b0011'1111)) << 6 |
528 ((uint32_t)((uint8_t)u8CharArr[3] & (uint8_t)0b0011'1111)) << 0;
531 u32RawChar -= (uint32_t)0b0000'0000'0000'0001'0000'0000'0000'0000;
534 mu8CharArr[0] = (uint8_t)0b1110'1101;
535 mu8CharArr[1] = (uint8_t)(((u32RawChar & (uint32_t)0b0000'0000'0000'1111'0000'0000'0000'0000) >> 16) | (uint32_t)0b1010'0000);
536 mu8CharArr[2] = (uint8_t)(((u32RawChar & (uint32_t)0b0000'0000'0000'0000'1111'1100'0000'0000) >> 10) | (uint32_t)0b1000'0000);
538 mu8CharArr[3] = (uint8_t)0b1110'1101;
539 mu8CharArr[4] = (uint8_t)(((u32RawChar & (uint32_t)0b0000'0000'0000'0000'0000'0011'1100'0000) >> 6) | (uint32_t)0b1011'0000);
540 mu8CharArr[5] = (uint8_t)(((u32RawChar & (uint32_t)0b0000'0000'0000'0000'0000'0000'0011'1111) >> 0) | (uint32_t)0b1000'0000);
543 static constexpr void MUTF8SupplementaryToUTF8(
const MU8T(&mu8CharArr)[6], U8T(&u8CharArr)[4])
546 uint32_t u32RawChar =
547 ((uint32_t)((uint8_t)mu8CharArr[1] & (uint8_t)0b0000'1111)) << 16 |
548 ((uint32_t)((uint8_t)mu8CharArr[2] & (uint8_t)0b0011'1111)) << 10 |
550 ((uint32_t)((uint8_t)mu8CharArr[4] & (uint8_t)0b0000'1111)) << 6 |
551 ((uint32_t)((uint8_t)mu8CharArr[5] & (uint8_t)0b0011'1111)) << 0 ;
554 u32RawChar += (uint32_t)0b0000'0000'0000'0001'0000'0000'0000'0000;
557 u8CharArr[0] = (uint8_t)(((u32RawChar & (uint32_t)0b0000'0000'0001'1100'0000'0000'0000'0000) >> 18) | (uint32_t)0b1111'0000);
558 u8CharArr[1] = (uint8_t)(((u32RawChar & (uint32_t)0b0000'0000'0000'0011'1111'0000'0000'0000) >> 12) | (uint32_t)0b1000'0000);
559 u8CharArr[2] = (uint8_t)(((u32RawChar & (uint32_t)0b0000'0000'0000'0000'0000'1111'1100'0000) >> 6) | (uint32_t)0b1000'0000);
560 u8CharArr[3] = (uint8_t)(((u32RawChar & (uint32_t)0b0000'0000'0000'0000'0000'0000'0011'1111) >> 0) | (uint32_t)0b1000'0000);
567#define GET_NEXTCHAR(c,d) if (++it == end) { (d);break; } else { (c) = *it; }
569#define HAS_BITMASK(v,m,p) (((uint8_t)(v) & (uint8_t)(m)) == (uint8_t)(p))
570#define IS_BITS(v,t) ((uint8_t)(v) == (uint8_t)(t))
572#define IN_RANGE(v,b,e) (((uint16_t)(v) >= (uint16_t)(b)) && ((uint16_t)(v) <= (uint16_t)(e)))
577 static constexpr T U16ToMU8Impl(
const U16T *u16String,
size_t szStringLength, T mu8String = {})
580#define PUSH_FAIL_MU8CHAR mu8String.append(mu8FailChar, sizeof(mu8FailChar) / sizeof(MU8T))
586 for (
auto it = u16String, end = u16String + szStringLength; it != end; ++it)
589 if (IN_RANGE(u16Char, 0x0001, 0x007F))
592 EncodeMUTF8Bmp(u16Char, mu8Char);
593 mu8String.append(mu8Char,
sizeof(mu8Char) /
sizeof(MU8T));
595 else if (IN_RANGE(u16Char, 0x0080, 0x07FF) || u16Char == 0x0000)
598 EncodeMUTF8Bmp(u16Char, mu8Char);
599 mu8String.append(mu8Char,
sizeof(mu8Char) /
sizeof(MU8T));
601 else if (IN_RANGE(u16Char, 0x0800, 0xFFFF))
603 if (IN_RANGE(u16Char, 0xD800, 0xDBFF))
605 U16T u16HighSurrogate = u16Char;
606 U16T u16LowSurrogate{};
607 GET_NEXTCHAR(u16LowSurrogate, (PUSH_FAIL_MU8CHAR));
611 if (!IN_RANGE(u16LowSurrogate, 0xDC00, 0xDFFF))
620 EncodeMUTF8Supplementary(u16HighSurrogate, u16LowSurrogate, mu8Char);
621 mu8String.append(mu8Char,
sizeof(mu8Char) /
sizeof(MU8T));
625 if (IN_RANGE(u16Char, 0xDC00, 0xDFFF))
634 EncodeMUTF8Bmp(u16Char, mu8Char);
635 mu8String.append(mu8Char,
sizeof(mu8Char) /
sizeof(MU8T));
646#undef PUSH_FAIL_MU8CHAR
649 template<
typename T = std::basic_
string<U16T>>
650 static constexpr T MU8ToU16Impl(
const MU8T *mu8String,
size_t szStringLength, T u16String = {})
653#define PUSH_FAIL_U16CHAR u16String.push_back(u16FailChar)
659 for (
auto it = mu8String, end = mu8String + szStringLength; it != end; ++it)
663 if (HAS_BITMASK(mu8Char, 0b1000'0000, 0b0000'0000))
666 MU8T mu8CharArr[1] = { mu8Char };
670 DecodeMUTF8Bmp(mu8CharArr, u16Char);
671 u16String.push_back(u16Char);
673 else if (HAS_BITMASK(mu8Char, 0b1110'0000, 0b1100'0000))
676 MU8T mu8CharArr[2] = { mu8Char };
678 GET_NEXTCHAR(mu8CharArr[1], (PUSH_FAIL_U16CHAR));
680 if (!HAS_BITMASK(mu8CharArr[1], 0b1100'0000, 0b1000'0000))
689 DecodeMUTF8Bmp(mu8CharArr, u16Char);
690 u16String.push_back(u16Char);
692 else if (HAS_BITMASK(mu8Char, 0b1111'0000, 0b1110'0000))
696 GET_NEXTCHAR(mu8Next, (PUSH_FAIL_U16CHAR));
702 if (IS_BITS(mu8Char, 0b1110'1101) && HAS_BITMASK(mu8Next, 0b1111'0000, 0b1010'0000))
705 MU8T mu8CharArr[6] = { mu8Char,mu8Next };
710 GET_NEXTCHAR(mu8CharArr[2],
711 (PUSH_FAIL_U16CHAR, PUSH_FAIL_U16CHAR));
712 if (!HAS_BITMASK(mu8CharArr[2], 0b1100'0000, 0b1000'0000))
723 GET_NEXTCHAR(mu8CharArr[3],
724 (PUSH_FAIL_U16CHAR, PUSH_FAIL_U16CHAR, PUSH_FAIL_U16CHAR));
725 if (!IS_BITS(mu8CharArr[3], 0b1110'1101))
737 GET_NEXTCHAR(mu8CharArr[4],
738 (PUSH_FAIL_U16CHAR, PUSH_FAIL_U16CHAR, PUSH_FAIL_U16CHAR, PUSH_FAIL_U16CHAR));
739 if (!HAS_BITMASK(mu8CharArr[4], 0b1111'0000, 0b1011'0000))
752 GET_NEXTCHAR(mu8CharArr[5],
753 (PUSH_FAIL_U16CHAR, PUSH_FAIL_U16CHAR, PUSH_FAIL_U16CHAR, PUSH_FAIL_U16CHAR, PUSH_FAIL_U16CHAR));
754 if (!HAS_BITMASK(mu8CharArr[5], 0b1100'0000, 0b1000'0000))
768 U16T u16HighSurrogate{}, u16LowSurrogate{};
769 DecodeMUTF8Supplementary(mu8CharArr, u16HighSurrogate, u16LowSurrogate);
770 u16String.push_back(u16HighSurrogate);
771 u16String.push_back(u16LowSurrogate);
773 else if(HAS_BITMASK(mu8Next, 0b1100'0000, 0b1000'0000))
776 MU8T mu8CharArr[3] = { mu8Char,mu8Next };
779 GET_NEXTCHAR(mu8CharArr[2],
780 (PUSH_FAIL_U16CHAR, PUSH_FAIL_U16CHAR));
781 if (!HAS_BITMASK(mu8CharArr[2], 0b1100'0000, 0b1000'0000))
793 DecodeMUTF8Bmp(mu8CharArr, u16Char);
794 u16String.push_back(u16Char);
818#undef PUSH_FAIL_U16CHAR
832 static constexpr T U8ToMU8Impl(
const U8T *u8String,
size_t szStringLength, T mu8String = {})
835#define PUSH_FAIL_MU8CHAR mu8String.append(mu8FailChar, sizeof(mu8FailChar) / sizeof(MU8T))
836#define INSERT_NORMAL(p) (mu8String.append_cvt((p) - szNormalLength, szNormalLength), szNormalLength = 0)
839 size_t szNormalLength = 0;
840 for (
auto it = u8String, end = u8String + szStringLength; it != end; ++it)
844 if (HAS_BITMASK(u8Char, 0b1111'1000, 0b1111'0000))
849 U8T u8CharArr[4]{ u8Char };
851 GET_NEXTCHAR(u8CharArr[1], (PUSH_FAIL_MU8CHAR));
852 if (!HAS_BITMASK(u8CharArr[1], 0b1100'0000, 0b1000'0000))
860 GET_NEXTCHAR(u8CharArr[2],
861 (PUSH_FAIL_MU8CHAR, PUSH_FAIL_MU8CHAR));
862 if (!HAS_BITMASK(u8CharArr[2], 0b1100'0000, 0b1000'0000))
871 GET_NEXTCHAR(u8CharArr[3],
872 (PUSH_FAIL_MU8CHAR, PUSH_FAIL_MU8CHAR, PUSH_FAIL_MU8CHAR));
873 if (!HAS_BITMASK(u8CharArr[3], 0b1100'0000, 0b1000'0000))
884 MU8T mu8CharArr[6]{};
885 UTF8SupplementaryToMUTF8(u8CharArr, mu8CharArr);
886 mu8String.append(mu8CharArr,
sizeof(mu8CharArr) /
sizeof(MU8T));
888 else if (IS_BITS(u8Char, 0b0000'0000))
892 MU8T mu8EmptyCharArr[2] = { (MU8T)0xC0,(MU8T)0x80 };
893 mu8String.append(mu8EmptyCharArr,
sizeof(mu8EmptyCharArr) /
sizeof(MU8T));
902 INSERT_NORMAL(u8String + szStringLength);
908#undef PUSH_FAIL_MU8CHAR
911 template<
typename T = DynamicString<std::basic_
string<U8T>>>
912 static constexpr T MU8ToU8Impl(
const MU8T *mu8String,
size_t szStringLength, T u8String = {})
915#define PUSH_FAIL_U8CHAR u8String.append(u8FailChar, sizeof(u8FailChar) / sizeof(U8T))
916#define INSERT_NORMAL(p) (u8String.append_cvt((p) - szNormalLength, szNormalLength), szNormalLength = 0)
919 size_t szNormalLength = 0;
920 for (
auto it = mu8String, end = mu8String + szStringLength; it != end; ++it)
924 if (HAS_BITMASK(mu8Char, 0b1111'0000, 0b1110'0000))
931 INSERT_NORMAL(it - 1);
939 if (!IS_BITS(mu8Char, 0b1110'1101) || !HAS_BITMASK(mu8Next, 0b1111'0000, 0b1010'0000))
946 INSERT_NORMAL(it - 1);
949 MU8T mu8CharArr[6] = { mu8Char, mu8Next };
952 GET_NEXTCHAR(mu8CharArr[2],
953 (PUSH_FAIL_U8CHAR, PUSH_FAIL_U8CHAR));
954 if (!HAS_BITMASK(mu8CharArr[2], 0b1100'0000, 0b1000'0000))
965 GET_NEXTCHAR(mu8CharArr[3],
966 (PUSH_FAIL_U8CHAR, PUSH_FAIL_U8CHAR, PUSH_FAIL_U8CHAR));
967 if (!IS_BITS(mu8CharArr[3], 0b1110'1101))
979 GET_NEXTCHAR(mu8CharArr[4],
980 (PUSH_FAIL_U8CHAR, PUSH_FAIL_U8CHAR, PUSH_FAIL_U8CHAR, PUSH_FAIL_U8CHAR));
981 if (!HAS_BITMASK(mu8CharArr[4], 0b1111'0000, 0b1011'0000))
994 GET_NEXTCHAR(mu8CharArr[5],
995 (PUSH_FAIL_U8CHAR, PUSH_FAIL_U8CHAR, PUSH_FAIL_U8CHAR, PUSH_FAIL_U8CHAR, PUSH_FAIL_U8CHAR));
996 if (!HAS_BITMASK(mu8CharArr[5], 0b1100'0000, 0b1000'0000))
1011 MUTF8SupplementaryToUTF8(mu8CharArr, u8CharArr);
1012 u8String.append(u8CharArr,
sizeof(u8CharArr) /
sizeof(U8T));
1014 else if (IS_BITS(mu8Char, 0xC0))
1021 INSERT_NORMAL(it - 1);
1027 if (!IS_BITS(mu8Next, 0x80))
1029 szNormalLength += 2;
1034 INSERT_NORMAL(it - 1);
1035 u8String.push_back((U8T)0x00);
1044 INSERT_NORMAL(mu8String + szStringLength);
1049#undef PUSH_FAIL_U8CHAR
1058 template<
typename T>
1059 static consteval size_t ContentLength(
const T &tStr)
1061 return tStr.size() > 0 && tStr[tStr.size() - 1] == (
typename T::value_type)0x00
1073 static constexpr size_t U16ToMU8Length(
const std::basic_string_view<U16T> &u16String)
1075 return U16ToMU8Impl<FakeStringCounter<MU8T>>(u16String.data(), u16String.size()).GetData();
1085 return U16ToMU8Impl<FakeStringCounter<MU8T>>(u16String, szStringLength).GetData();
1095 return U16ToMU8Impl<DynamicString<MU8_String>>(u16String.data(), u16String.size(), { szReserve }).GetData();
1106 return U16ToMU8Impl<DynamicString<MU8_String>>(u16String, szStringLength, { szReserve }).GetData();
1114 template<MUTF8_Tool_Internal::StringLiteral u16String>
1115 requires std::is_same_v<
typename decltype(u16String)::value_type, U16T>
1118 constexpr size_t szStringLength = ContentLength(u16String);
1119 constexpr size_t szNewLength = U16ToMU8Impl<FakeStringCounter<MU8T>>(u16String.data(), szStringLength).GetData();
1123 U16ToMU8Impl<StaticString<MU8T, szNewLength>>(u16String.data(), szStringLength).GetData(),
1134 static constexpr size_t U8ToMU8Length(
const std::basic_string_view<U8T> &u8String)
1136 return U8ToMU8Impl<FakeStringCounter<MU8T>>(u8String.data(), u8String.size()).GetData();
1144 static constexpr size_t U8ToMU8Length(
const U8T *u8String,
size_t szStringLength)
1146 return U8ToMU8Impl<FakeStringCounter<MU8T>>(u8String, szStringLength).GetData();
1156 return U8ToMU8Impl<DynamicString<MU8_String>>(u8String.data(), u8String.size(), { szReserve }).GetData();
1167 return U8ToMU8Impl<DynamicString<MU8_String>>(u8String, szStringLength, { szReserve }).GetData();
1175 template<MUTF8_Tool_Internal::StringLiteral u8String>
1176 requires std::is_same_v<
typename decltype(u8String)::value_type, U8T>
1179 constexpr size_t szStringLength = ContentLength(u8String);
1180 constexpr size_t szNewLength = U8ToMU8Impl<FakeStringCounter<MU8T>>(u8String.data(), szStringLength).GetData();
1184 StaticString<MU8T, szNewLength>>(u8String.data(), szStringLength).GetData(),
1198 return MU8ToU16Impl<FakeStringCounter<U16T>>(mu8String.data(), mu8String.size()).GetData();
1208 return MU8ToU16Impl<FakeStringCounter<U16T>>(mu8String, szStringLength).GetData();
1218 return MU8ToU16Impl<DynamicString<std::basic_string<U16T>>>(mu8String.data(), mu8String.size(), { szReserve }).GetData();
1227 static std::basic_string<U16T>
MU8ToU16(
const MU8T *mu8String,
size_t szStringLength,
size_t szReserve = 0)
1229 return MU8ToU16Impl<DynamicString<std::basic_string<U16T>>>(mu8String, szStringLength, { szReserve }).GetData();
1240 return MU8ToU8Impl<FakeStringCounter<U8T>>(mu8String.data(), mu8String.size()).GetData();
1248 static constexpr size_t MU8ToU8Length(
const MU8T *mu8String,
size_t szStringLength)
1250 return MU8ToU8Impl<FakeStringCounter<U8T>>(mu8String, szStringLength).GetData();
1260 return MU8ToU8Impl<DynamicString<std::basic_string<U8T>>>(mu8String.data(), mu8String.size(), { szReserve }).GetData();
1269 static std::basic_string<U8T>
MU8ToU8(
const MU8T *mu8String,
size_t szStringLength,
size_t szReserve = 0)
1271 return MU8ToU8Impl<DynamicString<std::basic_string<U8T>>>(mu8String, szStringLength, { szReserve }).GetData();