94 optional<Character> fInvalidCharacterReplacement;
100 static inline constexpr Character kDefaultMissingReplacementCharacter =
Character{(char32_t)0x0000FFFD};
105 enum class Implementation {
110#if __has_include("boost/locale/encoding_utf.hpp")
115#if qStroika_Foundation_Common_Platform_Windows
117 eWindowsAPIWide2FromMultibyte,
134 optional<Implementation> fPreferredImplementation;
142#if qCompilerAndStdLib_DefaultMemberInitializerNeededEnclosingForDefaultFunArg_Buggy
144 constexpr UTFConvert (
const Options& options);
146 constexpr UTFConvert (
const Options& options = Options{});
152 constexpr Options GetOptions ()
const;
172 template <IUNICODECanUnambiguouslyConvertTo TO, IUNICODECanUnambiguouslyConvertFrom FROM>
174 requires (not is_const_v<TO>);
175 template <IUNICODECanUnambiguouslyConvertTo TO, IUNICODECanUnambiguouslyConvertFrom FROM>
177 requires (not is_const_v<TO>);
178 template <IUNICODECanUnambiguouslyConvertTo TO, IUNICODECanUnambiguouslyConvertFrom FROM>
185 template <IUNICODECanUnambiguouslyConvertFrom CHAR_T>
205 template <IUNICODECanUnambiguouslyConvertFrom SRC_T, IUNICODECanUnambiguouslyConvertTo TRG_T>
206 nonvirtual span<TRG_T>
ConvertSpan (span<const SRC_T> source, span<TRG_T> target)
const
207 requires (not is_const_v<TRG_T>);
208 template <IUNICODECanUnambiguouslyConvertFrom SRC_T, IUNICODECanUnambiguouslyConvertTo TRG_T>
209 nonvirtual span<TRG_T>
ConvertSpan (span<SRC_T> source, span<TRG_T> target)
const
210 requires (not is_const_v<TRG_T>);
218 size_t fSourceConsumed{};
219 size_t fTargetProduced{};
261 template <IUNICODECanUnambiguouslyConvertFrom SRC_T, IUNICODECanUnambiguouslyConvertTo TRG_T>
263 template <IUNICODECanUnambiguouslyConvertFrom SRC_T, IUNICODECanUnambiguouslyConvertTo TRG_T>
265 template <
typename TO,
typename FROM>
266 nonvirtual TO
Convert (
const FROM& from)
const
267 requires ((same_as<TO, string> or same_as<TO, wstring> or same_as<TO, u8string> or same_as<TO, u16string> or same_as<TO, u32string>) and
268 (same_as<FROM, string> or same_as<FROM, wstring> or same_as<FROM, u8string> or same_as<FROM, u16string> or same_as<FROM, u32string>));
296 struct ConversionResultWithStatus : ConversionResult {
328 template <IUNICODECanUnambiguouslyConvertFrom SRC_T, IUNICODECanUnambiguouslyConvertTo TRG_T>
329 nonvirtual ConversionResultWithStatus
ConvertQuietly (span<const SRC_T> source, span<TRG_T> target)
const
330 requires (not is_const_v<TRG_T>);
340 template <IUNICODECanUnambiguouslyConvertTo TRG_T, IUNICODECanUnambiguouslyConvertFrom SRC_T>
341 nonvirtual
size_t ConvertOffset (span<const SRC_T> source,
size_t srcIndex)
const;
352 template <IUNICODECanUnambiguouslyConvertFrom CHAR_T>
353 static constexpr optional<size_t>
NextCharacter (span<const CHAR_T> s);
362 template <IUNICODECanUnambiguouslyConvertFrom CHAR_T>
376 template <
typename SRC_OF_CONSTNESS_T,
typename TYPE_T>
377 using AddConstIfMatching_ = conditional_t<is_const_v<SRC_OF_CONSTNESS_T>, add_const_t<TYPE_T>, TYPE_T>;
378 template <
typename TYPE_T>
380 conditional_t<
sizeof (TYPE_T) == 1, conditional_t<same_as<TYPE_T, Latin1>, TYPE_T,
char8_t>, conditional_t<
sizeof (TYPE_T) == 2, char16_t,
char32_t>>;
381 template <
typename TYPE_T>
382 using CompatibleT_ = AddConstIfMatching_<TYPE_T, MapSizes_<TYPE_T>>;
386 template <IUNICODECanUnambiguouslyConvertFrom FromT>
387 static constexpr span<CompatibleT_<FromT>> ConvertToPrimitiveSpan_ (span<FromT> f);
390 Options fOriginalOptions_;
391 Options fUsingOptions;
393#if qStroika_Foundation_Common_Platform_Windows
395 static ConversionResultWithStatus ConvertQuietly_Win32_ (span<const char8_t> source, span<char16_t> target);
396 static ConversionResultWithStatus ConvertQuietly_Win32_ (span<const char16_t> source, span<char8_t> target);
400 static ConversionResultWithStatus ConvertQuietly_StroikaPortable_ (optional<Character> invalidCharacterReplacement,
401 span<const char8_t> source, span<char16_t> target);
402 static ConversionResultWithStatus ConvertQuietly_StroikaPortable_ (optional<Character> invalidCharacterReplacement,
403 span<const char8_t> source, span<char32_t> target);
404 static ConversionResultWithStatus ConvertQuietly_StroikaPortable_ (optional<Character> invalidCharacterReplacement,
405 span<const char16_t> source, span<char32_t> target);
406 static ConversionResultWithStatus ConvertQuietly_StroikaPortable_ (optional<Character> invalidCharacterReplacement,
407 span<const char32_t> source, span<char16_t> target);
408 static ConversionResultWithStatus ConvertQuietly_StroikaPortable_ (optional<Character> invalidCharacterReplacement,
409 span<const char32_t> source, span<char8_t> target);
410 static ConversionResultWithStatus ConvertQuietly_StroikaPortable_ (optional<Character> invalidCharacterReplacement,
411 span<const char16_t> source, span<char8_t> target);
413#if __has_include("boost/locale/encoding_utf.hpp")
415 static ConversionResultWithStatus ConvertQuietly_boost_locale_ (span<const char8_t> source,
const span<char16_t> target);
419 static ConversionResultWithStatus ConvertQuietly_codeCvt_ (span<const char8_t> source, span<char16_t> target);
420 static ConversionResultWithStatus ConvertQuietly_codeCvt_ (span<const char8_t> source, span<char32_t> target);
421 static ConversionResultWithStatus ConvertQuietly_codeCvt_ (span<const char16_t> source, span<char8_t> target);
422 static ConversionResultWithStatus ConvertQuietly_codeCvt_ (span<const char32_t> source, span<char8_t> target);
429 enum [[deprecated (
"Since Stroika v3.0d1, use class UTFConvert")]] LEGACY_ConversionResult {
435 enum [[deprecated (
"Since Stroika v3.0d1, use class UTFConvert")]] ConversionFlags {
436 strictConversion = 0,
442 [[deprecated (
"Since Stroika v3.0d1, could support, but not clearly any reason")]]
static bool IsLegalUTF8Sequence (
const char* source,
443 const char* sourceEnd);
444 [[deprecated (
"Since Stroika v3.0d1, could support, but not clearly any reason")]]
static bool IsLegalUTF8Sequence (
const char8_t* source,
445 const char8_t* sourceEnd);
447 template <
typename FROM,
typename TO>
448 [[deprecated (
"Since Stroika v3.0d1, use class UTFConvert")]]
static inline size_t
449 QuickComputeConversionOutputBufferSize (
const FROM* sourceStart,
const FROM* sourceEnd)
451 return UTFConvert::ComputeTargetBufferSize<TO> (span<const FROM>{sourceStart, sourceEnd});
453 DISABLE_COMPILER_MSC_WARNING_START (4996);
454 DISABLE_COMPILER_GCC_WARNING_START (
"GCC diagnostic ignored \"-Wdeprecated-declarations\"");
455 DISABLE_COMPILER_CLANG_WARNING_START (
"clang diagnostic ignored \"-Wdeprecated-declarations\"");
456 template <
typename FROM,
typename TO>
457 [[deprecated (
"Since Stroika v3.0d1, use class UTFConvert::kThe")]]
static LEGACY_ConversionResult
458 ConvertQuietly (
const FROM** sourceStart,
const FROM* sourceEnd, TO** targetStart, TO* targetEnd, ConversionFlags flags)
461 *sourceStart += get<1> (r);
462 *targetStart += get<2> (r);
463 switch (get<0> (r)) {
465 return LEGACY_ConversionResult::conversionOK;
467 return LEGACY_ConversionResult::sourceExhausted;
469 return LEGACY_ConversionResult::sourceIllegal;
472 return LEGACY_ConversionResult::sourceIllegal;
475 template <
typename FROM,
typename TO>
476 [[deprecated (
"Since Stroika v3.0d1, use class UTFConvert::kThe")]]
static inline void
477 Convert (
const FROM** sourceStart,
const FROM* sourceEnd, TO** targetStart, TO* targetEnd, ConversionFlags )
481 Require ((
static_cast<size_t> (targetEnd - *targetStart) >= QuickComputeConversionOutputBufferSize<FROM, TO> (*sourceStart, sourceEnd)));
484 *sourceStart += get<0> (r);
485 *targetStart += get<1> (r);
487 DISABLE_COMPILER_MSC_WARNING_END (4996);
488 DISABLE_COMPILER_GCC_WARNING_END (
"GCC diagnostic ignored \"-Wdeprecated-declarations\"");
489 DISABLE_COMPILER_CLANG_WARNING_END (
"clang diagnostic ignored \"-Wdeprecated-declarations\"");