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_Platform_Windows
117 eWindowsAPIWide2FromMultibyte,
134 optional<Implementation> fPreferredImplementation;
144#if qCompilerAndStdLib_default_member_initializer_needed_within_enclosing_class_Buggy
145 constexpr UTFConvert (
const Options& options);
148 constexpr UTFConvert (
const Options& options = {});
155 constexpr Options GetOptions ()
const;
175 template <IUNICODECanUnambiguouslyConvertTo TO, IUNICODECanUnambiguouslyConvertFrom FROM>
177 requires (not is_const_v<TO>);
178 template <IUNICODECanUnambiguouslyConvertTo TO, IUNICODECanUnambiguouslyConvertFrom FROM>
180 requires (not is_const_v<TO>);
181 template <IUNICODECanUnambiguouslyConvertTo TO, IUNICODECanUnambiguouslyConvertFrom FROM>
188 template <IUNICODECanUnambiguouslyConvertFrom CHAR_T>
208 template <IUNICODECanUnambiguouslyConvertFrom SRC_T, IUNICODECanUnambiguouslyConvertTo TRG_T>
209 nonvirtual span<TRG_T>
ConvertSpan (span<const SRC_T> source, span<TRG_T> target)
const
210 requires (not is_const_v<TRG_T>);
211 template <IUNICODECanUnambiguouslyConvertFrom SRC_T, IUNICODECanUnambiguouslyConvertTo TRG_T>
212 nonvirtual span<TRG_T>
ConvertSpan (span<SRC_T> source, span<TRG_T> target)
const
213 requires (not is_const_v<TRG_T>);
221 size_t fSourceConsumed{};
222 size_t fTargetProduced{};
264 template <IUNICODECanUnambiguouslyConvertFrom SRC_T, IUNICODECanUnambiguouslyConvertTo TRG_T>
266 template <IUNICODECanUnambiguouslyConvertFrom SRC_T, IUNICODECanUnambiguouslyConvertTo TRG_T>
268 template <
typename TO,
typename FROM>
269 nonvirtual TO
Convert (
const FROM& from)
const
270 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
271 (same_as<FROM, string> or same_as<FROM, wstring> or same_as<FROM, u8string> or same_as<FROM, u16string> or same_as<FROM, u32string>));
301 struct ConversionResultWithStatus : ConversionResult {
333 template <IUNICODECanUnambiguouslyConvertFrom SRC_T, IUNICODECanUnambiguouslyConvertTo TRG_T>
334 nonvirtual ConversionResultWithStatus
ConvertQuietly (span<const SRC_T> source, span<TRG_T> target)
const
335 requires (not is_const_v<TRG_T>);
345 template <IUNICODECanUnambiguouslyConvertTo TRG_T, IUNICODECanUnambiguouslyConvertFrom SRC_T>
346 nonvirtual
size_t ConvertOffset (span<const SRC_T> source,
size_t srcIndex)
const;
357 template <IUNICODECanUnambiguouslyConvertFrom CHAR_T>
358 static constexpr optional<size_t>
NextCharacter (span<const CHAR_T> s);
367 template <IUNICODECanUnambiguouslyConvertFrom CHAR_T>
381 template <
typename SRC_OF_CONSTNESS_T,
typename TYPE_T>
382 using AddConstIfMatching_ = conditional_t<is_const_v<SRC_OF_CONSTNESS_T>, add_const_t<TYPE_T>, TYPE_T>;
383 template <
typename TYPE_T>
385 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>>;
386 template <
typename TYPE_T>
387 using CompatibleT_ = AddConstIfMatching_<TYPE_T, MapSizes_<TYPE_T>>;
391 template <IUNICODECanUnambiguouslyConvertFrom FromT>
392 static constexpr span<CompatibleT_<FromT>> ConvertToPrimitiveSpan_ (span<FromT> f);
395 Options fOriginalOptions_;
396 Options fUsingOptions;
398#if qStroika_Platform_Windows
400 static ConversionResultWithStatus ConvertQuietly_Win32_ (span<const char8_t> source, span<char16_t> target);
401 static ConversionResultWithStatus ConvertQuietly_Win32_ (span<const char16_t> source, span<char8_t> target);
405 static ConversionResultWithStatus ConvertQuietly_StroikaPortable_ (optional<Character> invalidCharacterReplacement,
406 span<const char8_t> source, span<char16_t> target);
407 static ConversionResultWithStatus ConvertQuietly_StroikaPortable_ (optional<Character> invalidCharacterReplacement,
408 span<const char8_t> source, span<char32_t> target);
409 static ConversionResultWithStatus ConvertQuietly_StroikaPortable_ (optional<Character> invalidCharacterReplacement,
410 span<const char16_t> source, span<char32_t> target);
411 static ConversionResultWithStatus ConvertQuietly_StroikaPortable_ (optional<Character> invalidCharacterReplacement,
412 span<const char32_t> source, span<char16_t> target);
413 static ConversionResultWithStatus ConvertQuietly_StroikaPortable_ (optional<Character> invalidCharacterReplacement,
414 span<const char32_t> source, span<char8_t> target);
415 static ConversionResultWithStatus ConvertQuietly_StroikaPortable_ (optional<Character> invalidCharacterReplacement,
416 span<const char16_t> source, span<char8_t> target);
418#if __has_include("boost/locale/encoding_utf.hpp")
420 static ConversionResultWithStatus ConvertQuietly_boost_locale_ (span<const char8_t> source,
const span<char16_t> target);
424 static ConversionResultWithStatus ConvertQuietly_codeCvt_ (span<const char8_t> source, span<char16_t> target);
425 static ConversionResultWithStatus ConvertQuietly_codeCvt_ (span<const char8_t> source, span<char32_t> target);
426 static ConversionResultWithStatus ConvertQuietly_codeCvt_ (span<const char16_t> source, span<char8_t> target);
427 static ConversionResultWithStatus ConvertQuietly_codeCvt_ (span<const char32_t> source, span<char8_t> target);
434 enum [[deprecated (
"Since Stroika v3.0d1, use class UTFConvert")]] LEGACY_ConversionResult {
440 enum [[deprecated (
"Since Stroika v3.0d1, use class UTFConvert")]] ConversionFlags {
441 strictConversion = 0,
447 [[deprecated (
"Since Stroika v3.0d1, could support, but not clearly any reason")]]
static bool IsLegalUTF8Sequence (
const char* source,
448 const char* sourceEnd);
449 [[deprecated (
"Since Stroika v3.0d1, could support, but not clearly any reason")]]
static bool IsLegalUTF8Sequence (
const char8_t* source,
450 const char8_t* sourceEnd);
452 template <
typename FROM,
typename TO>
453 [[deprecated (
"Since Stroika v3.0d1, use class UTFConvert")]]
static inline size_t
454 QuickComputeConversionOutputBufferSize (
const FROM* sourceStart,
const FROM* sourceEnd)
456 return UTFConvert::ComputeTargetBufferSize<TO> (span<const FROM>{sourceStart, sourceEnd});
458 DISABLE_COMPILER_MSC_WARNING_START (4996);
459 DISABLE_COMPILER_GCC_WARNING_START (
"GCC diagnostic ignored \"-Wdeprecated-declarations\"");
460 DISABLE_COMPILER_CLANG_WARNING_START (
"clang diagnostic ignored \"-Wdeprecated-declarations\"");
461 template <
typename FROM,
typename TO>
462 [[deprecated (
"Since Stroika v3.0d1, use class UTFConvert::kThe")]]
static LEGACY_ConversionResult
463 ConvertQuietly (
const FROM** sourceStart,
const FROM* sourceEnd, TO** targetStart, TO* targetEnd, ConversionFlags flags)
466 *sourceStart += get<1> (r);
467 *targetStart += get<2> (r);
468 switch (get<0> (r)) {
470 return LEGACY_ConversionResult::conversionOK;
472 return LEGACY_ConversionResult::sourceExhausted;
474 return LEGACY_ConversionResult::sourceIllegal;
477 return LEGACY_ConversionResult::sourceIllegal;
480 template <
typename FROM,
typename TO>
481 [[deprecated (
"Since Stroika v3.0d1, use class UTFConvert::kThe")]]
static inline void
482 Convert (
const FROM** sourceStart,
const FROM* sourceEnd, TO** targetStart, TO* targetEnd, ConversionFlags )
486 Require ((
static_cast<size_t> (targetEnd - *targetStart) >= QuickComputeConversionOutputBufferSize<FROM, TO> (*sourceStart, sourceEnd)));
489 *sourceStart += get<0> (r);
490 *targetStart += get<1> (r);
492 DISABLE_COMPILER_MSC_WARNING_END (4996);
493 DISABLE_COMPILER_GCC_WARNING_END (
"GCC diagnostic ignored \"-Wdeprecated-declarations\"");
494 DISABLE_COMPILER_CLANG_WARNING_END (
"clang diagnostic ignored \"-Wdeprecated-declarations\"");